@graphty/algorithms 1.7.3 → 1.8.0
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/dist/algorithms.d.ts +2 -37
- package/dist/algorithms.js +736 -223
- package/dist/algorithms.js.map +1 -1
- package/dist/algorithms.standalone.js +24524 -0
- package/dist/algorithms.standalone.js.map +1 -0
- package/dist/src/algorithms/centrality/betweenness.d.ts +16 -11
- package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.js +17 -0
- package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
- package/dist/src/core/graph.d.ts +10 -0
- package/dist/src/core/graph.d.ts.map +1 -1
- package/dist/src/core/graph.js +31 -2
- package/dist/src/core/graph.js.map +1 -1
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/indexed/accelerator.d.ts +161 -0
- package/dist/src/indexed/accelerator.d.ts.map +1 -0
- package/dist/src/indexed/accelerator.js +60 -0
- package/dist/src/indexed/accelerator.js.map +1 -0
- package/dist/src/indexed/bfs.d.ts +28 -0
- package/dist/src/indexed/bfs.d.ts.map +1 -0
- package/dist/src/indexed/bfs.js +39 -0
- package/dist/src/indexed/bfs.js.map +1 -0
- package/dist/src/indexed/common-neighbors.d.ts +17 -0
- package/dist/src/indexed/common-neighbors.d.ts.map +1 -0
- package/dist/src/indexed/common-neighbors.js +41 -0
- package/dist/src/indexed/common-neighbors.js.map +1 -0
- package/dist/src/indexed/components.d.ts +28 -0
- package/dist/src/indexed/components.d.ts.map +1 -0
- package/dist/src/indexed/components.js +58 -0
- package/dist/src/indexed/components.js.map +1 -0
- package/dist/src/indexed/dijkstra.d.ts +63 -0
- package/dist/src/indexed/dijkstra.d.ts.map +1 -0
- package/dist/src/indexed/dijkstra.js +98 -0
- package/dist/src/indexed/dijkstra.js.map +1 -0
- package/dist/src/indexed/index.d.ts +22 -0
- package/dist/src/indexed/index.d.ts.map +1 -0
- package/dist/src/indexed/index.js +22 -0
- package/dist/src/indexed/index.js.map +1 -0
- package/dist/src/indexed/mst.d.ts +26 -0
- package/dist/src/indexed/mst.d.ts.map +1 -0
- package/dist/src/indexed/mst.js +48 -0
- package/dist/src/indexed/mst.js.map +1 -0
- package/dist/src/indexed/pagerank.d.ts +30 -0
- package/dist/src/indexed/pagerank.d.ts.map +1 -0
- package/dist/src/indexed/pagerank.js +50 -0
- package/dist/src/indexed/pagerank.js.map +1 -0
- package/dist/src/indexed/structures/arc-source.d.ts +13 -0
- package/dist/src/indexed/structures/arc-source.d.ts.map +1 -0
- package/dist/src/indexed/structures/arc-source.js +25 -0
- package/dist/src/indexed/structures/arc-source.js.map +1 -0
- package/dist/src/indexed/structures/index.d.ts +9 -0
- package/dist/src/indexed/structures/index.d.ts.map +1 -0
- package/dist/src/indexed/structures/index.js +9 -0
- package/dist/src/indexed/structures/index.js.map +1 -0
- package/dist/src/indexed/structures/min-heap.d.ts +44 -0
- package/dist/src/indexed/structures/min-heap.d.ts.map +1 -0
- package/dist/src/indexed/structures/min-heap.js +112 -0
- package/dist/src/indexed/structures/min-heap.js.map +1 -0
- package/dist/src/indexed/structures/union-find.d.ts +39 -0
- package/dist/src/indexed/structures/union-find.d.ts.map +1 -0
- package/dist/src/indexed/structures/union-find.js +70 -0
- package/dist/src/indexed/structures/union-find.js.map +1 -0
- package/dist/src/indexed/to-snapshot.d.ts +38 -0
- package/dist/src/indexed/to-snapshot.d.ts.map +1 -0
- package/dist/src/indexed/to-snapshot.js +58 -0
- package/dist/src/indexed/to-snapshot.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -3
- package/src/algorithms/centrality/betweenness.ts +36 -11
- package/src/core/graph.ts +35 -2
- package/src/index.ts +46 -0
- package/src/indexed/accelerator.ts +225 -0
- package/src/indexed/bfs.ts +57 -0
- package/src/indexed/common-neighbors.ts +46 -0
- package/src/indexed/components.ts +78 -0
- package/src/indexed/dijkstra.ts +134 -0
- package/src/indexed/index.ts +28 -0
- package/src/indexed/mst.ts +62 -0
- package/src/indexed/pagerank.ts +73 -0
- package/src/indexed/structures/arc-source.ts +25 -0
- package/src/indexed/structures/index.ts +9 -0
- package/src/indexed/structures/min-heap.ts +122 -0
- package/src/indexed/structures/union-find.ts +74 -0
- package/src/indexed/to-snapshot.ts +78 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"algorithms.standalone.js","sources":["../src/core/graph.ts","../../node_modules/.pnpm/typedfastbitset@0.6.1/node_modules/typedfastbitset/lib/utils.js","../../node_modules/.pnpm/typedfastbitset@0.6.1/node_modules/typedfastbitset/lib/SparseTypedFastBitSet.js","../../node_modules/.pnpm/typedfastbitset@0.6.1/node_modules/typedfastbitset/lib/TypedFastBitSet.js","../../node_modules/.pnpm/typedfastbitset@0.6.1/node_modules/typedfastbitset/lib/index.js","../src/optimized/bit-packed.ts","../src/optimized/direction-optimized-bfs.ts","../src/optimized/csr-graph.ts","../src/optimized/graph-adapter.ts","../src/utils/graph-utilities.ts","../src/algorithms/traversal/bfs-unified.ts","../src/algorithms/traversal/dfs.ts","../src/algorithms/shortest-path/bellman-ford.ts","../src/data-structures/priority-queue.ts","../src/algorithms/shortest-path/bidirectional-dijkstra.ts","../src/algorithms/shortest-path/dijkstra.ts","../src/algorithms/shortest-path/floyd-warshall.ts","../src/algorithms/traversal/bfs-variants.ts","../src/algorithms/centrality/betweenness.ts","../src/algorithms/centrality/closeness.ts","../src/algorithms/centrality/degree.ts","../src/algorithms/centrality/delta-pagerank.ts","../src/algorithms/centrality/eigenvector.ts","../src/algorithms/centrality/hits.ts","../src/algorithms/centrality/katz.ts","../src/algorithms/centrality/delta-pagerank-simple.ts","../src/algorithms/centrality/pagerank.ts","../src/data-structures/union-find.ts","../src/algorithms/components/connected.ts","../src/algorithms/mst/kruskal.ts","../src/algorithms/mst/prim.ts","../src/algorithms/community/girvan-newman.ts","../src/utils/graph-converters.ts","../src/utils/math-utilities.ts","../src/algorithms/community/label-propagation.ts","../src/algorithms/community/leiden.ts","../src/algorithms/community/louvain-optimized.ts","../src/algorithms/community/modularity-utils.ts","../src/algorithms/community/louvain.ts","../src/utils/priorityQueue.ts","../src/pathfinding/utils.ts","../src/pathfinding/astar.ts","../src/flow/ford-fulkerson.ts","../src/flow/min-cut.ts","../src/clustering/hierarchical.ts","../src/clustering/k-core.ts","../src/clustering/mcl.ts","../src/clustering/spectral.ts","../src/algorithms/matching/bipartite.ts","../src/algorithms/matching/isomorphism.ts","../src/link-prediction/adamic-adar.ts","../src/link-prediction/common-neighbors.ts","../src/research/sync.ts","../src/research/terahac.ts","../src/research/grsbm.ts","../../graph-format/dist/graph-format.js","../src/indexed/bfs.ts","../src/indexed/common-neighbors.ts","../src/indexed/structures/union-find.ts","../src/indexed/components.ts","../src/indexed/structures/arc-source.ts","../src/indexed/structures/min-heap.ts","../src/indexed/dijkstra.ts","../src/indexed/mst.ts","../src/indexed/pagerank.ts","../src/indexed/to-snapshot.ts","../src/indexed/accelerator.ts"],"sourcesContent":["import type { Edge, GraphConfig, Node, NodeId } from \"../types/index.js\";\n\n/**\n * True when an undirected edge seen from `source` is the mirror of one already yielded from\n * `target`: ids of one type compare by value, ids of different types by their type name.\n * @param source - The node the edge is read from\n * @param target - The node the edge points to\n * @returns True when this side of the edge is the duplicate\n */\nfunction isMirror(source: NodeId, target: NodeId): boolean {\n return typeof source === typeof target ? source > target : typeof source > typeof target;\n}\n\n/**\n * Core Graph data structure for the Graphty Algorithms library\n *\n * Provides efficient graph representation with support for both directed and undirected graphs.\n * Uses adjacency lists for optimal performance with sparse graphs.\n */\nexport class Graph {\n private nodeMap: Map<NodeId, Node>;\n private adjacencyList: Map<NodeId, Map<NodeId, Edge>>;\n private incomingEdges: Map<NodeId, Map<NodeId, Edge>>; // For directed graphs\n private config: GraphConfig;\n private edgeCount: number;\n private mutations: number;\n\n /**\n * Creates a new Graph instance.\n * @param config - Configuration options for the graph\n */\n constructor(config: Partial<GraphConfig> = {}) {\n this.config = {\n directed: false,\n allowSelfLoops: true,\n allowParallelEdges: false,\n ...config,\n };\n this.nodeMap = new Map();\n this.adjacencyList = new Map();\n this.incomingEdges = new Map();\n this.edgeCount = 0;\n this.mutations = 0;\n }\n\n /**\n * Add a node to the graph\n * @param id - The unique identifier for the node\n * @param data - Optional key-value data to attach to the node\n */\n addNode(id: NodeId, data?: Record<string, unknown>): void {\n if (!this.nodeMap.has(id)) {\n this.nodeMap.set(id, { id, data });\n this.adjacencyList.set(id, new Map());\n\n if (this.config.directed) {\n this.incomingEdges.set(id, new Map());\n }\n\n this.mutations++;\n }\n }\n\n /**\n * Remove a node from the graph\n * @param id - The unique identifier of the node to remove\n * @returns True if the node was removed, false if it did not exist\n */\n removeNode(id: NodeId): boolean {\n if (!this.nodeMap.has(id)) {\n return false;\n }\n\n // Remove all edges connected to this node\n const outgoingEdges = this.adjacencyList.get(id);\n if (outgoingEdges) {\n for (const targetId of Array.from(outgoingEdges.keys())) {\n this.removeEdge(id, targetId);\n }\n }\n\n if (this.config.directed) {\n const incomingEdges = this.incomingEdges.get(id);\n if (incomingEdges) {\n for (const sourceId of Array.from(incomingEdges.keys())) {\n this.removeEdge(sourceId, id);\n }\n }\n } else {\n // For undirected graphs, also remove edges where this node is the target\n for (const [nodeId, edges] of Array.from(this.adjacencyList)) {\n if (edges.has(id)) {\n this.removeEdge(nodeId, id);\n }\n }\n }\n\n // Remove the node itself\n this.nodeMap.delete(id);\n this.adjacencyList.delete(id);\n\n if (this.config.directed) {\n this.incomingEdges.delete(id);\n }\n\n this.mutations++;\n return true;\n }\n\n /**\n * Add an edge to the graph\n * @param source - The source node identifier\n * @param target - The target node identifier\n * @param weight - The weight of the edge (defaults to 1)\n * @param data - Optional key-value data to attach to the edge\n */\n addEdge(source: NodeId, target: NodeId, weight = 1, data?: Record<string, unknown>): void {\n // Ensure both nodes exist\n this.addNode(source);\n this.addNode(target);\n\n // Check self-loops\n if (!this.config.allowSelfLoops && source === target) {\n throw new Error(\"Self-loops are not allowed in this graph\");\n }\n\n // Check parallel edges\n if (!this.config.allowParallelEdges && this.hasEdge(source, target)) {\n throw new Error(\"Parallel edges are not allowed in this graph\");\n }\n\n const edge: Edge = { source, target, weight, data };\n\n // Add to adjacency list\n const sourceAdjacency = this.adjacencyList.get(source);\n\n if (sourceAdjacency) {\n sourceAdjacency.set(target, edge);\n }\n\n if (this.config.directed) {\n // For directed graphs, add to incoming edges list\n const targetIncoming = this.incomingEdges.get(target);\n\n if (targetIncoming) {\n targetIncoming.set(source, edge);\n }\n } else {\n // For undirected graphs, add the reverse edge\n if (source !== target) {\n const reverseEdge: Edge = { source: target, target: source, weight, data };\n const targetAdjacency = this.adjacencyList.get(target);\n\n if (targetAdjacency) {\n targetAdjacency.set(source, reverseEdge);\n }\n }\n }\n\n this.edgeCount++;\n this.mutations++;\n }\n\n /**\n * Remove an edge from the graph\n * @param source - The source node identifier\n * @param target - The target node identifier\n * @returns True if the edge was removed, false if it did not exist\n */\n removeEdge(source: NodeId, target: NodeId): boolean {\n const sourceEdges = this.adjacencyList.get(source);\n if (!sourceEdges?.has(target)) {\n return false;\n }\n\n sourceEdges.delete(target);\n\n if (this.config.directed) {\n const targetIncoming = this.incomingEdges.get(target);\n if (targetIncoming) {\n targetIncoming.delete(source);\n }\n } else {\n // For undirected graphs, remove the reverse edge\n const targetEdges = this.adjacencyList.get(target);\n if (targetEdges) {\n targetEdges.delete(source);\n }\n }\n\n this.edgeCount--;\n this.mutations++;\n return true;\n }\n\n /**\n * Check if a node exists in the graph\n * @param id - The unique identifier of the node to check\n * @returns True if the node exists, false otherwise\n */\n hasNode(id: NodeId): boolean {\n return this.nodeMap.has(id);\n }\n\n /**\n * Check if an edge exists in the graph\n * @param source - The source node identifier\n * @param target - The target node identifier\n * @returns True if the edge exists, false otherwise\n */\n hasEdge(source: NodeId, target: NodeId): boolean {\n const sourceEdges = this.adjacencyList.get(source);\n return sourceEdges ? sourceEdges.has(target) : false;\n }\n\n /**\n * Get a node by ID\n * @param id - The unique identifier of the node to retrieve\n * @returns The node if found, undefined otherwise\n */\n getNode(id: NodeId): Node | undefined {\n return this.nodeMap.get(id);\n }\n\n /**\n * Get an edge by source and target\n * @param source - The source node identifier\n * @param target - The target node identifier\n * @returns The edge if found, undefined otherwise\n */\n getEdge(source: NodeId, target: NodeId): Edge | undefined {\n const sourceEdges = this.adjacencyList.get(source);\n return sourceEdges ? sourceEdges.get(target) : undefined;\n }\n\n /**\n * Get the number of nodes in the graph\n * @returns The total count of nodes\n */\n get nodeCount(): number {\n return this.nodeMap.size;\n }\n\n /**\n * A counter that increases on every topology change (`addNode` of a new id, `removeNode`,\n * `addEdge`, `removeEdge`, `clear`) and never on a read. Callers memoise derived structures on\n * `(graph, mutationCount)`; graph-format design 14.1 rule 4 names this counter, and `toSnapshot`\n * is its first consumer. It is monotone and is NOT reset by `clear()`: a reset could hand a\n * stale cache entry a matching key.\n * @returns The number of topology changes made to this graph\n */\n get mutationCount(): number {\n return this.mutations;\n }\n\n /**\n * Get the number of edges in the graph\n * @returns The total count of edges\n */\n get totalEdgeCount(): number {\n return this.edgeCount;\n }\n\n /**\n * Check if the graph is directed\n * @returns True if the graph is directed, false otherwise\n */\n get isDirected(): boolean {\n return this.config.directed;\n }\n\n /**\n * Get all nodes in the graph\n * @returns An iterator over all nodes\n */\n nodes(): IterableIterator<Node> {\n return this.nodeMap.values();\n }\n\n /**\n * Get all edges in the graph\n * @yields Each unique edge in the graph\n */\n *edges(): IterableIterator<Edge> {\n for (const [source, edges] of this.adjacencyList) {\n for (const edge of edges.values()) {\n // For undirected graphs, only yield each edge once. A string never compares\n // greater than a number (both `<` and `>` are false), so mixed-type ids are\n // ordered by their type name first; the mirror is then skipped on exactly one side.\n if (!this.config.directed && isMirror(source, edge.target)) {\n continue;\n }\n\n yield edge;\n }\n }\n }\n\n /**\n * Get neighbors of a node (outgoing edges)\n * @param nodeId - The node identifier to get neighbors for\n * @returns An iterator over the neighbor node identifiers\n */\n neighbors(nodeId: NodeId): IterableIterator<NodeId> {\n const edges = this.adjacencyList.get(nodeId);\n return edges ? edges.keys() : new Map().keys();\n }\n\n /**\n * Get incoming neighbors of a node (directed graphs only)\n * @param nodeId - The node identifier to get incoming neighbors for\n * @returns An iterator over the incoming neighbor node identifiers\n */\n inNeighbors(nodeId: NodeId): IterableIterator<NodeId> {\n if (!this.config.directed) {\n return this.neighbors(nodeId);\n }\n\n const edges = this.incomingEdges.get(nodeId);\n return edges ? edges.keys() : new Map().keys();\n }\n\n /**\n * Get outgoing neighbors of a node\n * @param nodeId - The node identifier to get outgoing neighbors for\n * @returns An iterator over the outgoing neighbor node identifiers\n */\n outNeighbors(nodeId: NodeId): IterableIterator<NodeId> {\n return this.neighbors(nodeId);\n }\n\n /**\n * Get the degree of a node\n * @param nodeId - The node identifier to get the degree for\n * @returns The total degree of the node\n */\n degree(nodeId: NodeId): number {\n if (this.config.directed) {\n return this.inDegree(nodeId) + this.outDegree(nodeId);\n }\n\n const edges = this.adjacencyList.get(nodeId);\n return edges ? edges.size : 0;\n }\n\n /**\n * Get the in-degree of a node\n * @param nodeId - The node identifier to get the in-degree for\n * @returns The number of incoming edges to the node\n */\n inDegree(nodeId: NodeId): number {\n if (!this.config.directed) {\n return this.degree(nodeId);\n }\n\n const edges = this.incomingEdges.get(nodeId);\n return edges ? edges.size : 0;\n }\n\n /**\n * Get the out-degree of a node\n * @param nodeId - The node identifier to get the out-degree for\n * @returns The number of outgoing edges from the node\n */\n outDegree(nodeId: NodeId): number {\n const edges = this.adjacencyList.get(nodeId);\n return edges ? edges.size : 0;\n }\n\n /**\n * Create a copy of the graph\n * @returns A new Graph instance with the same nodes and edges\n */\n clone(): Graph {\n const cloned = new Graph(this.config);\n\n // Copy nodes\n for (const node of this.nodeMap.values()) {\n cloned.addNode(node.id, node.data ? { ...node.data } : undefined);\n }\n\n // Copy edges\n for (const edge of this.edges()) {\n cloned.addEdge(edge.source, edge.target, edge.weight, edge.data ? { ...edge.data } : undefined);\n }\n\n return cloned;\n }\n\n /**\n * Get graph configuration\n * @returns A copy of the graph configuration object\n */\n getConfig(): GraphConfig {\n return { ...this.config };\n }\n\n /**\n * Clear all nodes and edges from the graph\n */\n clear(): void {\n this.nodeMap.clear();\n this.adjacencyList.clear();\n this.incomingEdges.clear();\n this.edgeCount = 0;\n this.mutations++;\n }\n\n /**\n * Get the number of unique edges in the graph\n * For undirected graphs, each edge is counted once\n * @returns The count of unique edges\n */\n get uniqueEdgeCount(): number {\n if (this.config.directed) {\n return this.edgeCount;\n }\n\n // For undirected graphs, we need to count each edge only once\n let count = 0;\n \n for (const _edge of this.edges()) {\n count++;\n }\n return count;\n }\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.hammingWeight4 = exports.hammingWeight = void 0;\n// fast function to compute the Hamming weight of a 32-bit unsigned integer\nfunction hammingWeight(v) {\n v -= (v >>> 1) & 0x55555555; // works with signed or unsigned shifts\n v = (v & 0x33333333) + ((v >>> 2) & 0x33333333);\n return (((v + (v >>> 4)) & 0xf0f0f0f) * 0x1010101) >>> 24;\n}\nexports.hammingWeight = hammingWeight;\n// fast function to compute the Hamming weight of four 32-bit unsigned integers\nfunction hammingWeight4(v1, v2, v3, v4) {\n v1 -= (v1 >>> 1) & 0x55555555; // works with signed or unsigned shifts\n v2 -= (v2 >>> 1) & 0x55555555; // works with signed or unsigned shifts\n v3 -= (v3 >>> 1) & 0x55555555; // works with signed or unsigned shifts\n v4 -= (v4 >>> 1) & 0x55555555; // works with signed or unsigned shifts\n v1 = (v1 & 0x33333333) + ((v1 >>> 2) & 0x33333333);\n v2 = (v2 & 0x33333333) + ((v2 >>> 2) & 0x33333333);\n v3 = (v3 & 0x33333333) + ((v3 >>> 2) & 0x33333333);\n v4 = (v4 & 0x33333333) + ((v4 >>> 2) & 0x33333333);\n v1 = (v1 + (v1 >>> 4)) & 0xf0f0f0f;\n v2 = (v2 + (v2 >>> 4)) & 0xf0f0f0f;\n v3 = (v3 + (v3 >>> 4)) & 0xf0f0f0f;\n v4 = (v4 + (v4 >>> 4)) & 0xf0f0f0f;\n return ((v1 + v2 + v3 + v4) * 0x1010101) >>> 24;\n}\nexports.hammingWeight4 = hammingWeight4;\n//# sourceMappingURL=utils.js.map","\"use strict\";\n/**\n * TypedFastBitSet.js : a fast bit set implementation in JavaScript.\n * (c) the authors\n * Licensed under the Apache License, Version 2.0.\n *\n * Speed-optimized BitSet implementation for modern browsers and JavaScript engines.\n *\n * Alternative version to TypedFastBitSet\n * This starts of as storing entries as an array in a Uint32Array Typed Array\n * The largest set value is first in the array. Everything else has no defined order\n * The largest set value is used when converting into a bitset to correctly size new Array\n * Once more than 256 entries have been added structure will convert to a bitset if it will create a smaller array\n * Very sparse data will remain an array until 1024 entries where it will convert to a bitset\n */\nvar __values = (this && this.__values) || function(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SparseTypedFastBitSet = void 0;\nvar utils_1 = require(\"./utils\");\nvar Type;\n(function (Type) {\n Type[Type[\"ARRAY\"] = 0] = \"ARRAY\";\n Type[Type[\"BITSET\"] = 1] = \"BITSET\";\n Type[Type[\"MIXED\"] = 2] = \"MIXED\";\n})(Type || (Type = {}));\nfunction isIterable(obj) {\n if (obj) {\n return obj[Symbol.iterator] !== undefined;\n }\n return false;\n}\n/**\n * you can provide an iterable\n * an exception is thrown if typed arrays are not supported\n */\nvar SparseTypedFastBitSet = /** @class */ (function () {\n function SparseTypedFastBitSet(iterable, data) {\n var e_1, _a;\n if (data === void 0) { data = new Uint32Array(8); }\n this.data = data;\n // -1 means we are bitset\n this.arraySize = 0;\n if (isIterable(iterable)) {\n try {\n for (var iterable_1 = __values(iterable), iterable_1_1 = iterable_1.next(); !iterable_1_1.done; iterable_1_1 = iterable_1.next()) {\n var key = iterable_1_1.value;\n this.add(key);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (iterable_1_1 && !iterable_1_1.done && (_a = iterable_1.return)) _a.call(iterable_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n }\n Object.defineProperty(SparseTypedFastBitSet.prototype, \"words\", {\n get: function () {\n if (this.arraySize !== -1) {\n this.data = this.toBitset();\n this.arraySize = -1;\n }\n return this.data;\n },\n enumerable: false,\n configurable: true\n });\n SparseTypedFastBitSet.prototype.toBitset = function () {\n var array = this.data;\n // currently converts its internal type to bitset\n var count = (array[0] + 32) >>> 5;\n var newWords = new Uint32Array(count << 1);\n for (var i = 0; i < this.arraySize; i++) {\n var add = array[i];\n newWords[add >>> 5] |= 1 << add;\n }\n return newWords;\n };\n /**\n * Add the value (Set the bit at index to true)\n */\n SparseTypedFastBitSet.prototype.add = function (index) {\n var type = this.resize(index);\n if (type === Type.ARRAY) {\n var array = this.data;\n // zero will match the fill value so make sure match is within set area\n // store biggest index first just for resize help\n if (this.arraySize === 0) {\n array[this.arraySize++] = index;\n return;\n }\n var offset = array.indexOf(index);\n if (offset === -1 || offset >= this.arraySize) {\n var biggest = array[0];\n if (index > biggest) {\n array[0] = index;\n array[this.arraySize++] = biggest;\n }\n else {\n array[this.arraySize++] = index;\n }\n }\n }\n else {\n this.data[index >>> 5] |= 1 << index;\n }\n };\n /**\n * If the value was not in the set, add it, otherwise remove it (flip bit at index)\n */\n SparseTypedFastBitSet.prototype.flip = function (index) {\n var type = this.resize(index);\n if (type === Type.ARRAY) {\n var array = this.data;\n var arrayIndex = array.indexOf(index);\n if (arrayIndex === -1) {\n if (this.arraySize > 0 && index > array[0]) {\n array[this.arraySize++] = array[0];\n array[0] = index;\n }\n else {\n array[this.arraySize++] = index;\n }\n }\n else {\n if (arrayIndex === 0 && this.arraySize > 1) {\n // removing our largest marker need to find next largest\n var largest = array[1];\n var largestIndex = 1;\n for (var i = 2; i < this.arraySize; i++) {\n if (array[i] > largest) {\n largest = array[i];\n largestIndex = i;\n }\n }\n array[0] = array[largestIndex];\n array[largestIndex] = array[--this.arraySize];\n }\n else {\n array[arrayIndex] = array[--this.arraySize];\n }\n }\n }\n else {\n this.data[index >>> 5] ^= 1 << index;\n }\n };\n /**\n * Remove all values, reset memory usage\n */\n SparseTypedFastBitSet.prototype.clear = function () {\n this.arraySize = 0;\n this.data = new Uint32Array(8);\n };\n /**\n * Set the bit at index to false\n */\n SparseTypedFastBitSet.prototype.remove = function (index) {\n var type = this.resize(index);\n if (type === Type.ARRAY) {\n var array = this.data;\n var arrayIndex = array.indexOf(index);\n if (arrayIndex !== -1 && arrayIndex < this.arraySize) {\n if (arrayIndex == this.arraySize - 1) {\n this.arraySize--;\n }\n else if (arrayIndex === 0 && this.arraySize > 1) {\n // removing our largest marker need to find next largest\n var largest = array[1];\n var largestIndex = 1;\n for (var i = 2; i < this.arraySize; i++) {\n if (array[i] > largest) {\n largest = array[i];\n largestIndex = i;\n }\n }\n array[0] = array[largestIndex];\n array[largestIndex] = array[--this.arraySize];\n }\n else {\n array[arrayIndex] = array[--this.arraySize];\n }\n }\n }\n else {\n this.data[index >>> 5] &= ~(1 << index);\n }\n };\n /**\n * Set bits from start (inclusive) to end (exclusive)\n */\n SparseTypedFastBitSet.prototype.addRange = function (start, end) {\n if (start >= end) {\n return;\n }\n var type = this.resize(end, end - start - 1);\n if (type === Type.ARRAY) {\n var array = this.data;\n var biggestAdd = end-- - 1;\n if (this.arraySize === 0) {\n array[this.arraySize++] = biggestAdd;\n }\n else {\n var offset = array.indexOf(biggestAdd);\n if (offset === -1 || offset >= this.arraySize) {\n var biggest = array[0];\n if (biggestAdd > biggest) {\n array[0] = biggestAdd;\n array[this.arraySize++] = biggest;\n }\n else {\n array[this.arraySize++] = biggestAdd;\n }\n }\n }\n for (; start < end; start++) {\n var offset = array.indexOf(start);\n if (offset === -1 || offset >= this.arraySize) {\n array[this.arraySize++] = start;\n }\n }\n }\n else {\n var words = this.data;\n var firstword = start >> 5;\n var endword = (end - 1) >> 5;\n if (firstword === endword) {\n words[firstword] |= (~0 << start) & (~0 >>> -end);\n return;\n }\n words[firstword] |= ~0 << start;\n words.fill(~0, firstword + 1, endword);\n words[endword] |= ~0 >>> -end;\n }\n };\n /**\n * Remove bits from start (inclusive) to end (exclusive)\n */\n SparseTypedFastBitSet.prototype.removeRange = function (start, end) {\n if (start >= end) {\n return;\n }\n if (this.arraySize !== -1) {\n var array = this.data;\n var findBiggest = false;\n for (var i = 0; i < this.arraySize; i++) {\n if (array[i] >= start && array[i] < end) {\n if (i === 0) {\n findBiggest = true;\n }\n array[i--] = array[--this.arraySize];\n }\n }\n if (findBiggest && this.arraySize > 1) {\n var largest = array[0];\n var largestIndex = 0;\n for (var i = 1; i < this.arraySize; i++) {\n if (array[i] > largest) {\n largest = array[i];\n largestIndex = i;\n }\n }\n var current = array[0];\n array[0] = array[largestIndex];\n array[largestIndex] = current;\n }\n }\n else {\n var words = this.data;\n start = Math.min(start, (words.length << 5) - 1);\n end = Math.min(end, (words.length << 5) - 1);\n var firstword = start >> 5;\n var endword = (end - 1) >> 5;\n if (firstword === endword) {\n words[firstword] &= ~((~0 << start) & (~0 >>> -end));\n return;\n }\n words[firstword] &= ~(~0 << start);\n words.fill(0, firstword + 1, endword);\n words[endword] &= ~(~0 >>> -end);\n }\n };\n /**\n * @returns true if no bit is set\n */\n SparseTypedFastBitSet.prototype.isEmpty = function () {\n if (this.arraySize === 0) {\n return true;\n }\n if (this.arraySize > 0) {\n return false;\n }\n var words = this.data;\n var c = words.length;\n for (var i = 0; i < c; i++) {\n if (words[i] !== 0)\n return false;\n }\n return true;\n };\n /**\n * Is the value contained in the set? Is the bit at index true or false?\n */\n SparseTypedFastBitSet.prototype.has = function (index) {\n if (this.arraySize === -1) {\n return (this.data[index >>> 5] & (1 << index)) !== 0;\n }\n else {\n var offset = this.data.indexOf(index);\n return offset !== -1 && offset < this.arraySize;\n }\n };\n /**\n * Tries to add the value (Set the bit at index to true)\n *\n * @returns 1 if the value was added, 0 if the value was already present\n */\n SparseTypedFastBitSet.prototype.checkedAdd = function (index) {\n var type = this.resize(index);\n if (type === Type.ARRAY) {\n var array = this.data;\n if (this.arraySize === 0) {\n array[this.arraySize++] = index;\n return 1;\n }\n var offset = array.indexOf(index);\n if (offset === -1 || offset >= this.arraySize) {\n var biggest = array[0];\n if (index > biggest) {\n array[0] = index;\n array[this.arraySize++] = biggest;\n }\n else {\n array[this.arraySize++] = index;\n }\n return 1;\n }\n return 0;\n }\n else {\n var words = this.data;\n var word = words[index >>> 5];\n var newword = word | (1 << index);\n words[index >>> 5] = newword;\n return ((newword ^ word) >>> index);\n }\n };\n /**\n * Reduce the memory usage to a minimum\n */\n SparseTypedFastBitSet.prototype.trim = function () {\n var size = this.size();\n if (this.arraySize === -1) {\n var words = this.data;\n var nl = words.length;\n while (nl > 0 && words[nl - 1] === 0) {\n nl--;\n }\n // sparse array will be smaller\n if (size < nl) {\n var newArray = new Uint32Array(size);\n var pos = 0 | 0;\n var c = words.length;\n for (var k = 0; k < c; ++k) {\n var w = words[k];\n while (w != 0) {\n var t = w & -w;\n newArray[pos++] = (k << 5) + (0, utils_1.hammingWeight)((t - 1) | 0);\n w ^= t;\n }\n }\n var first = newArray[0];\n newArray[0] = newArray[size - 1];\n newArray[size - 1] = first;\n this.data = newArray;\n this.arraySize = size;\n }\n else {\n this.data = words.slice(0, nl);\n }\n }\n else {\n // dense bitset will be smaller\n if (this.arraySize > 0 && this.data[0] >>> 5 < size) {\n var count = (this.data[0] + 32) >>> 5;\n var newWords = new Uint32Array(count);\n for (var i = 0; i < this.arraySize; i++) {\n var add = this.data[i];\n newWords[add >>> 5] |= 1 << add;\n }\n this.data = newWords;\n this.arraySize = -1;\n }\n else {\n this.data = this.data.slice(0, this.arraySize);\n }\n }\n };\n /**\n * Resize the bitset so that we can write a value at index\n */\n SparseTypedFastBitSet.prototype.resize = function (index, capacity) {\n if (capacity === void 0) { capacity = 0; }\n if (this.arraySize === -1) {\n var words = this.data;\n if (words.length << 5 > index)\n return Type.BITSET;\n var count = (index + 32) >>> 5; // just what is needed\n var newwords = new Uint32Array(count << 1);\n newwords.set(words); // hopefully, this copy is fast\n this.data = newwords;\n return Type.BITSET;\n }\n else {\n var array = this.data;\n if (this.arraySize + capacity < array.length) {\n return Type.ARRAY;\n }\n if (array.length + capacity < 256) {\n var newData = new Uint32Array((array.length + capacity) << 1);\n newData.set(array);\n this.data = newData;\n return Type.ARRAY;\n }\n else {\n var count = (Math.max(array[0], index) + 32) >>> 5;\n // very sparse grow array some more\n if (count > array.length + capacity &&\n (array.length + capacity) << 1 < 1024) {\n var newData = new Uint32Array((array.length + capacity) << 1);\n newData.set(array);\n this.data = newData;\n return Type.ARRAY;\n }\n else {\n var newwords = new Uint32Array(count << 1);\n for (var i = 0; i < this.arraySize; i++) {\n var add = array[i];\n newwords[add >>> 5] |= 1 << add;\n }\n this.arraySize = -1;\n this.data = newwords;\n return Type.BITSET;\n }\n }\n }\n };\n /**\n * How many values stored in the set? How many set bits?\n */\n SparseTypedFastBitSet.prototype.size = function () {\n if (this.arraySize === -1) {\n var words = this.data;\n var answer = 0;\n var c = words.length;\n var k = 0 | 0;\n for (; k + 4 < c; k += 4) {\n answer += (0, utils_1.hammingWeight4)(words[k] | 0, words[k + 1] | 0, words[k + 2] | 0, words[k + 3] | 0);\n }\n for (; k < c; ++k) {\n answer += (0, utils_1.hammingWeight)(words[k] | 0);\n }\n return answer;\n }\n else {\n return this.arraySize;\n }\n };\n /**\n * @returns the set bit locations (values)\n */\n SparseTypedFastBitSet.prototype.array = function () {\n if (this.arraySize === -1) {\n var words = this.data;\n var answer = new Array(this.size());\n var pos = 0 | 0;\n var c = words.length;\n for (var k = 0; k < c; ++k) {\n var w = words[k];\n while (w != 0) {\n var t = w & -w;\n answer[pos++] = (k << 5) + (0, utils_1.hammingWeight)((t - 1) | 0);\n w ^= t;\n }\n }\n return answer;\n }\n else {\n var array = this.data;\n var answer = new Array(this.arraySize);\n for (var i = 0; i < this.arraySize; i++) {\n answer[i] = array[i];\n }\n return answer;\n }\n };\n SparseTypedFastBitSet.prototype.forEach = function (fnc) {\n if (this.arraySize === -1) {\n var words = this.data;\n var c = words.length;\n for (var k = 0; k < c; ++k) {\n var w = words[k];\n while (w != 0) {\n var t = w & -w;\n fnc(((k << 5) + (0, utils_1.hammingWeight)(t - 1)) | 0);\n w ^= t;\n }\n }\n }\n else {\n var array = this.data;\n for (var i = 0; i < this.arraySize; i++) {\n var v = array[i];\n fnc(v);\n if (v !== array[i]) {\n i--;\n }\n }\n }\n };\n /**\n * Iterator of set bit locations (values)\n */\n SparseTypedFastBitSet.prototype[Symbol.iterator] = function () {\n var _a, _b;\n if (this.arraySize === -1) {\n var words_1 = this.data;\n var c_1 = words_1.length;\n var k_1 = 0;\n var w_1 = words_1[k_1];\n return _a = {},\n _a[Symbol.iterator] = function () {\n return this;\n },\n _a.next = function () {\n while (k_1 < c_1) {\n if (w_1 !== 0) {\n var t = w_1 & -w_1;\n var value = (k_1 << 5) + (0, utils_1.hammingWeight)((t - 1) | 0);\n w_1 ^= t;\n return { done: false, value: value };\n }\n else {\n k_1++;\n if (k_1 < c_1) {\n w_1 = words_1[k_1];\n }\n }\n }\n return { done: true, value: undefined };\n },\n _a;\n }\n else {\n var array_1 = this.data;\n var arraySize_1 = this.arraySize;\n var i_1 = 0;\n return _b = {},\n _b[Symbol.iterator] = function () {\n return this;\n },\n _b.next = function () {\n if (i_1 < arraySize_1) {\n var v = array_1[i_1];\n var result = { done: false, value: v };\n if (v !== array_1[i_1]) {\n i_1--;\n }\n i_1++;\n return result;\n }\n else {\n return { done: true, value: undefined };\n }\n },\n _b;\n }\n };\n /**\n * Creates a copy of this bitmap\n */\n SparseTypedFastBitSet.prototype.clone = function () {\n var bitset = new SparseTypedFastBitSet(undefined, new Uint32Array(this.data) // Correction : pas d'annotation générique\n );\n bitset.arraySize = this.arraySize;\n return bitset;\n };\n /**\n * Check if this bitset intersects with another one,\n * no bitmap is modified\n */\n SparseTypedFastBitSet.prototype.intersects = function (otherbitmap) {\n var order = SparseTypedFastBitSet.order(this, otherbitmap);\n switch (order.type) {\n case Type.BITSET: {\n var firstWords = order.first.words;\n var secondWords = order.second.words;\n var newcount = Math.min(firstWords.length, secondWords.length);\n for (var k = 0 | 0; k < newcount; ++k) {\n if ((firstWords[k] & secondWords[k]) !== 0)\n return true;\n }\n return false;\n }\n case Type.MIXED:\n case Type.ARRAY: {\n for (var i = 0; i < order.first.arraySize; i++) {\n if (order.second.has(order.first.data[i])) {\n return true;\n }\n }\n return false;\n }\n }\n };\n /**\n * Computes the intersection between this bitset and another one,\n * the current bitmap is modified (and returned by the function)\n */\n SparseTypedFastBitSet.prototype.intersection = function (otherbitmap) {\n if (this.arraySize === -1) {\n if (!(otherbitmap instanceof SparseTypedFastBitSet) ||\n otherbitmap.arraySize === -1) {\n var words = this.data;\n var otherWords = otherbitmap.words;\n var newcount = Math.min(words.length, otherWords.length);\n var k = 0 | 0;\n for (; k + 7 < newcount; k += 8) {\n words[k] &= otherWords[k];\n words[k + 1] &= otherWords[k + 1];\n words[k + 2] &= otherWords[k + 2];\n words[k + 3] &= otherWords[k + 3];\n words[k + 4] &= otherWords[k + 4];\n words[k + 5] &= otherWords[k + 5];\n words[k + 6] &= otherWords[k + 6];\n words[k + 7] &= otherWords[k + 7];\n }\n for (; k < newcount; ++k) {\n words[k] &= otherWords[k];\n }\n var c = words.length;\n for (k = newcount; k < c; ++k) {\n words[k] = 0;\n }\n return this;\n }\n else {\n var newWord = new Uint32Array(otherbitmap.data.length);\n // iterate through target as it will be smaller\n var otherArray = otherbitmap.data;\n var newSize = 0;\n for (var i = 0; i < otherbitmap.arraySize; i++) {\n var index = otherArray[i];\n if (this.has(index)) {\n if (newSize > 0 && index > newWord[0]) {\n newWord[newSize++] = newWord[0];\n newWord[0] = index;\n }\n else {\n newWord[newSize++] = index;\n }\n }\n }\n this.data = newWord;\n this.arraySize = newSize;\n return this;\n }\n }\n else {\n var array = this.data;\n for (var i = 0; i < this.arraySize; i++) {\n var v = array[i];\n if (otherbitmap.has(v)) {\n if (i > 0 && v > array[0]) {\n array[i] = array[0];\n array[0] = v;\n }\n }\n else {\n array[i--] = array[--this.arraySize];\n }\n }\n return this;\n }\n };\n /**\n * Computes the size of the intersection between this bitset and another one\n */\n SparseTypedFastBitSet.prototype.intersection_size = function (otherbitmap) {\n var order = SparseTypedFastBitSet.order(this, otherbitmap);\n switch (order.type) {\n case Type.BITSET: {\n var words = order.first.words;\n var otherWords = order.second.words;\n var newcount = Math.min(words.length, otherWords.length);\n var answer = 0 | 0;\n for (var k = 0 | 0; k < newcount; ++k) {\n answer += (0, utils_1.hammingWeight)(words[k] & otherWords[k]);\n }\n return answer;\n }\n case Type.MIXED:\n case Type.ARRAY: {\n var answer = 0;\n var array = order.first.data;\n for (var i = 0; i < order.first.arraySize; i++) {\n if (order.second.has(array[i])) {\n answer++;\n }\n }\n return answer;\n }\n }\n };\n /**\n * Computes the intersection between this bitset and another one,\n * a new bitmap is generated\n */\n SparseTypedFastBitSet.prototype.new_intersection = function (otherbitmap) {\n var order = SparseTypedFastBitSet.order(this, otherbitmap);\n switch (order.type) {\n case Type.BITSET: {\n var words = order.first.words;\n var otherWords = order.second.words;\n var count = Math.min(words.length, otherWords.length);\n var newWords = new Uint32Array(count);\n var k = 0 | 0;\n for (; k + 7 < count; k += 8) {\n newWords[k] = words[k] & otherWords[k];\n newWords[k + 1] = words[k + 1] & otherWords[k + 1];\n newWords[k + 2] = words[k + 2] & otherWords[k + 2];\n newWords[k + 3] = words[k + 3] & otherWords[k + 3];\n newWords[k + 4] = words[k + 4] & otherWords[k + 4];\n newWords[k + 5] = words[k + 5] & otherWords[k + 5];\n newWords[k + 6] = words[k + 6] & otherWords[k + 6];\n newWords[k + 7] = words[k + 7] & otherWords[k + 7];\n }\n for (; k < count; ++k) {\n newWords[k] = words[k] & otherWords[k];\n }\n var answer = new SparseTypedFastBitSet(undefined, newWords);\n answer.arraySize = -1;\n return answer;\n }\n case Type.MIXED:\n case Type.ARRAY: {\n var newArray = new Uint32Array(order.first.data.length);\n // iterate through target as it will be smaller\n var newSize = 0;\n var array = order.first.data;\n for (var i = 0; i < order.first.arraySize; i++) {\n var index = array[i];\n if (order.second.has(index)) {\n if (newSize > 0 && index > newArray[0]) {\n newArray[newSize++] = newArray[0];\n newArray[0] = index;\n }\n else {\n newArray[newSize++] = index;\n }\n }\n }\n var answer = new SparseTypedFastBitSet(undefined, newArray);\n answer.arraySize = newSize;\n return answer;\n }\n }\n };\n /**\n * Computes the intersection between this bitset and another one,\n * the current bitmap is modified\n */\n SparseTypedFastBitSet.prototype.equals = function (otherbitmap) {\n if (this === otherbitmap) {\n return true;\n }\n var order = SparseTypedFastBitSet.order(this, otherbitmap);\n switch (order.type) {\n case Type.BITSET: {\n var words = this.words;\n var otherWords = otherbitmap.words;\n var mcount = Math.min(words.length, otherWords.length);\n for (var k = 0 | 0; k < mcount; ++k) {\n if (words[k] != otherWords[k])\n return false;\n }\n if (words.length < otherWords.length) {\n var c = otherWords.length;\n for (var k = words.length; k < c; ++k) {\n if (otherWords[k] != 0)\n return false;\n }\n }\n else if (otherWords.length < words.length) {\n var c = words.length;\n for (var k = otherWords.length; k < c; ++k) {\n if (words[k] != 0)\n return false;\n }\n }\n return true;\n }\n case Type.ARRAY:\n case Type.MIXED: {\n if (order.first.size() !== order.second.size()) {\n return false;\n }\n var array = order.first.data;\n for (var i = 0; i < order.first.arraySize; i++) {\n if (!order.second.has(array[i])) {\n return false;\n }\n }\n return true;\n }\n }\n };\n /**\n * Computes the difference between this bitset and another one,\n * the current bitset is modified (and returned by the function)\n */\n SparseTypedFastBitSet.prototype.difference = function (otherbitmap) {\n if (this.arraySize === -1) {\n if (!(otherbitmap instanceof SparseTypedFastBitSet) ||\n otherbitmap.arraySize === -1) {\n var words = this.words;\n var otherWords = otherbitmap.words;\n var newcount = Math.min(words.length, otherWords.length);\n var k = 0 | 0;\n for (; k + 7 < newcount; k += 8) {\n words[k] &= ~otherWords[k];\n words[k + 1] &= ~otherWords[k + 1];\n words[k + 2] &= ~otherWords[k + 2];\n words[k + 3] &= ~otherWords[k + 3];\n words[k + 4] &= ~otherWords[k + 4];\n words[k + 5] &= ~otherWords[k + 5];\n words[k + 6] &= ~otherWords[k + 6];\n words[k + 7] &= ~otherWords[k + 7];\n }\n for (; k < newcount; ++k) {\n words[k] &= ~otherWords[k];\n }\n return this;\n }\n else {\n var otherArray = otherbitmap.data;\n for (var i = 0; i < otherbitmap.arraySize; i++) {\n var index = otherArray[i];\n if (this.has(index)) {\n this.remove(index);\n }\n }\n return this;\n }\n }\n else {\n var array = this.data;\n var findBiggest = false;\n for (var i = 0; i < this.arraySize; i++) {\n if (otherbitmap.has(array[i])) {\n if (i === 0) {\n findBiggest = true;\n }\n array[i--] = array[--this.arraySize];\n }\n }\n if (findBiggest && this.arraySize > 1) {\n var largest = array[0];\n var largestIndex = 0;\n for (var i = 1; i < this.arraySize; i++) {\n if (array[i] > largest) {\n largest = array[i];\n largestIndex = i;\n }\n }\n var current = array[0];\n array[0] = array[largestIndex];\n array[largestIndex] = current;\n }\n return this;\n }\n };\n /**\n * Computes the difference between this bitset and another one,\n * the other bitset is modified (and returned by the function)\n *\n * (for this set A and other set B, this computes B = A - B and returns B)\n */\n SparseTypedFastBitSet.prototype.difference2 = function (otherbitmap) {\n if (this.arraySize === -1 ||\n !(otherbitmap instanceof SparseTypedFastBitSet)) {\n var words = this.words;\n var mincount = Math.min(words.length, otherbitmap.words.length);\n otherbitmap.resize((words.length << 5) - 1);\n var otherWords = otherbitmap.words;\n var k = 0 | 0;\n for (; k + 7 < mincount; k += 8) {\n otherWords[k] = words[k] & ~otherWords[k];\n otherWords[k + 1] = words[k + 1] & ~otherWords[k + 1];\n otherWords[k + 2] = words[k + 2] & ~otherWords[k + 2];\n otherWords[k + 3] = words[k + 3] & ~otherWords[k + 3];\n otherWords[k + 4] = words[k + 4] & ~otherWords[k + 4];\n otherWords[k + 5] = words[k + 5] & ~otherWords[k + 5];\n otherWords[k + 6] = words[k + 6] & ~otherWords[k + 6];\n otherWords[k + 7] = words[k + 7] & ~otherWords[k + 7];\n }\n for (; k < mincount; ++k) {\n otherWords[k] = words[k] & ~otherWords[k];\n }\n // remaining words are all part of difference\n for (; k < words.length; ++k) {\n otherWords[k] = words[k];\n }\n otherWords.fill(0, k);\n return otherbitmap;\n }\n else {\n var array = new Uint32Array(this.data);\n var arraySize = this.arraySize;\n var findBiggest = false;\n for (var i = 0; i < arraySize; i++) {\n if (otherbitmap.has(array[i])) {\n if (i === 0) {\n findBiggest = true;\n }\n array[i--] = array[--arraySize];\n }\n }\n if (findBiggest && arraySize > 1) {\n var largest = array[0];\n var largestIndex = 0;\n for (var i = 1; i < arraySize; i++) {\n if (array[i] > largest) {\n largest = array[i];\n largestIndex = i;\n }\n }\n var current = array[0];\n array[0] = array[largestIndex];\n array[largestIndex] = current;\n }\n otherbitmap.data = array;\n otherbitmap.arraySize = arraySize;\n return otherbitmap;\n }\n };\n /**\n * Computes the difference between this bitset and another one,\n * a new bitmap is generated\n */\n SparseTypedFastBitSet.prototype.new_difference = function (otherbitmap) {\n return this.clone().difference(otherbitmap);\n };\n /**\n * Computes the size of the difference between this bitset and another one\n */\n SparseTypedFastBitSet.prototype.difference_size = function (otherbitmap) {\n if (this.arraySize === -1) {\n if (!(otherbitmap instanceof SparseTypedFastBitSet) ||\n otherbitmap.arraySize === -1) {\n var words = this.words;\n var otherWords = otherbitmap.words;\n var newcount = Math.min(words.length, otherWords.length);\n var answer = 0 | 0;\n var k = 0 | 0;\n for (; k < newcount; ++k) {\n answer += (0, utils_1.hammingWeight)(words[k] & ~otherWords[k]);\n }\n var c = words.length;\n for (; k < c; ++k) {\n answer += (0, utils_1.hammingWeight)(words[k]);\n }\n return answer;\n }\n else {\n var answer = this.size();\n var otherArray = otherbitmap.data;\n for (var i = 0; i < otherbitmap.arraySize; i++) {\n var index = otherArray[i];\n if (this.has(index)) {\n answer--;\n }\n }\n return answer;\n }\n }\n else {\n var answer = this.arraySize;\n var array = this.data;\n for (var i = 0; i < this.arraySize; i++) {\n if (otherbitmap.has(array[i])) {\n answer--;\n }\n }\n return answer;\n }\n };\n /**\n * Computes the changed elements (XOR) between this bitset and another one,\n * the current bitset is modified (and returned by the function)\n */\n SparseTypedFastBitSet.prototype.change = function (otherbitmap) {\n if (this.arraySize === -1) {\n if (!(otherbitmap instanceof SparseTypedFastBitSet) ||\n otherbitmap.arraySize === -1) {\n var otherWords = otherbitmap.words;\n var mincount = Math.min(this.words.length, otherWords.length);\n this.resize((otherWords.length << 5) - 1);\n var words = this.words;\n var k = 0 | 0;\n for (; k + 7 < mincount; k += 8) {\n words[k] ^= otherWords[k];\n words[k + 1] ^= otherWords[k + 1];\n words[k + 2] ^= otherWords[k + 2];\n words[k + 3] ^= otherWords[k + 3];\n words[k + 4] ^= otherWords[k + 4];\n words[k + 5] ^= otherWords[k + 5];\n words[k + 6] ^= otherWords[k + 6];\n words[k + 7] ^= otherWords[k + 7];\n }\n for (; k < mincount; ++k) {\n words[k] ^= otherWords[k];\n }\n // remaining words are all part of change\n for (; k < otherWords.length; ++k) {\n words[k] = otherWords[k];\n }\n return this;\n }\n else if (otherbitmap.arraySize > 0) {\n var otherArray = otherbitmap.data;\n this.resize(otherArray[0]);\n var words = this.words;\n for (var i = 0; i < otherbitmap.arraySize; i++) {\n var index = otherArray[i];\n if ((words[index >>> 5] & (1 << index)) !== 0) {\n words[index >>> 5] &= ~(1 << index);\n }\n else {\n words[index >>> 5] |= 1 << index;\n }\n }\n return this;\n }\n else {\n return this;\n }\n }\n else {\n if (!(otherbitmap instanceof SparseTypedFastBitSet) ||\n otherbitmap.arraySize === -1) {\n var words = new Uint32Array(Math.max(otherbitmap.words.length, this.arraySize > 0 ? this.data[0] << (5 + 32) : 0));\n words.set(otherbitmap.words);\n var array = this.data;\n for (var i = 0; i < this.arraySize; i++) {\n var index = array[i];\n if ((words[index >>> 5] & (1 << index)) !== 0) {\n words[index >>> 5] &= ~(1 << index);\n }\n else {\n words[index >>> 5] |= 1 << index;\n }\n }\n this.data = words;\n this.arraySize = -1;\n }\n else {\n var otherArray = otherbitmap.data;\n for (var i = 0; i < otherbitmap.arraySize; i++) {\n var index = otherArray[i];\n if (this.has(index)) {\n this.remove(index);\n }\n else {\n this.add(index);\n }\n }\n }\n return this;\n }\n };\n /**\n * Computes the change between this bitset and another one,\n * a new bitmap is generated\n */\n SparseTypedFastBitSet.prototype.new_change = function (otherbitmap) {\n var order = SparseTypedFastBitSet.order(this, otherbitmap);\n switch (order.type) {\n case Type.BITSET: {\n var words = this.words;\n var otherWords = otherbitmap.words;\n var count = Math.max(words.length, otherWords.length);\n var answer = new SparseTypedFastBitSet(undefined, new Uint32Array(count));\n answer.arraySize = -1;\n var mcount = Math.min(words.length, otherWords.length);\n var k = 0;\n for (; k + 7 < mcount; k += 8) {\n answer.words[k] = words[k] ^ otherWords[k];\n answer.words[k + 1] = words[k + 1] ^ otherWords[k + 1];\n answer.words[k + 2] = words[k + 2] ^ otherWords[k + 2];\n answer.words[k + 3] = words[k + 3] ^ otherWords[k + 3];\n answer.words[k + 4] = words[k + 4] ^ otherWords[k + 4];\n answer.words[k + 5] = words[k + 5] ^ otherWords[k + 5];\n answer.words[k + 6] = words[k + 6] ^ otherWords[k + 6];\n answer.words[k + 7] = words[k + 7] ^ otherWords[k + 7];\n }\n for (; k < mcount; ++k) {\n answer.words[k] = words[k] ^ otherWords[k];\n }\n var c = words.length;\n for (k = mcount; k < c; ++k) {\n answer.words[k] = words[k];\n }\n var c2 = otherWords.length;\n for (k = mcount; k < c2; ++k) {\n answer.words[k] = otherWords[k];\n }\n return answer;\n }\n case Type.MIXED: {\n var words = new Uint32Array(Math.max(order.second.words.length, order.first.arraySize > 0 ? (order.first.data[0] + 32) << 5 : 0));\n words.set(order.second.words);\n var array = order.first.data;\n for (var i = 0; i < order.first.arraySize; i++) {\n var index = array[i];\n if ((words[index >>> 5] & (1 << index)) !== 0) {\n words[index >>> 5] &= ~(1 << index);\n }\n else {\n words[index >>> 5] |= 1 << index;\n }\n }\n var answer = new SparseTypedFastBitSet(undefined, words);\n answer.arraySize = -1;\n return answer;\n }\n case Type.ARRAY: {\n var newArray = new Uint32Array(order.first.data.length + order.second.data.length);\n newArray.set(order.second.data);\n // iterate through target as it will be smaller\n var newSize = order.second.arraySize;\n var array = order.first.data;\n for (var i = 0; i < order.first.arraySize; i++) {\n var index = array[i];\n var offset = newArray.indexOf(index);\n if (offset !== -1 && offset < newSize) {\n newArray[offset] = newArray[--newSize];\n }\n else {\n newArray[newSize++] = index;\n }\n }\n if (newSize > 1) {\n var largest = newArray[0];\n var largestIndex = 0;\n for (var i = 1; i < newSize; i++) {\n if (newArray[i] > largest) {\n largest = newArray[i];\n largestIndex = i;\n }\n }\n var current = newArray[0];\n newArray[0] = newArray[largestIndex];\n newArray[largestIndex] = current;\n }\n var answer = new SparseTypedFastBitSet(undefined, newArray);\n answer.arraySize = newSize;\n return answer;\n }\n }\n };\n /**\n * Computes the number of changed elements between this bitset and another one\n */\n SparseTypedFastBitSet.prototype.change_size = function (otherbitmap) {\n var order = SparseTypedFastBitSet.order(this, otherbitmap);\n switch (order.type) {\n case Type.BITSET: {\n var words = this.words;\n var otherWords = otherbitmap.words;\n var mincount = Math.min(words.length, otherWords.length);\n var answer = 0 | 0;\n var k = 0 | 0;\n for (; k < mincount; ++k) {\n answer += (0, utils_1.hammingWeight)(words[k] ^ otherWords[k]);\n }\n var longer = words.length > otherWords.length ? this : otherbitmap;\n var c = longer.words.length;\n for (; k < c; ++k) {\n answer += (0, utils_1.hammingWeight)(longer.words[k]);\n }\n return answer;\n }\n case Type.MIXED: {\n var array = order.first.data;\n var answer = order.second.size();\n for (var i = 0; i < order.first.arraySize; i++) {\n var index = array[i];\n if (order.second.has(index)) {\n answer--;\n }\n else {\n answer++;\n }\n }\n return answer;\n }\n case Type.ARRAY: {\n // iterate through target as it will be smaller\n var answer = order.second.arraySize;\n var array = order.first.data;\n for (var i = 0; i < order.first.arraySize; i++) {\n var index = array[i];\n if (order.second.has(index)) {\n answer--;\n }\n else {\n answer++;\n }\n }\n return answer;\n }\n }\n };\n /**\n * @returns a string representation\n */\n SparseTypedFastBitSet.prototype.toString = function () {\n return \"{\" + this.array().join(\",\") + \"}\";\n };\n /**\n * Computes the union between this bitset and another one,\n * the current bitset is modified (and returned by the function)\n */\n SparseTypedFastBitSet.prototype.union = function (otherbitmap) {\n if (!(otherbitmap instanceof SparseTypedFastBitSet) ||\n otherbitmap.arraySize === -1) {\n if (this.arraySize !== -1) {\n this.data = this.toBitset();\n this.arraySize = -1;\n }\n var words = this.data;\n var otherWords = otherbitmap.words;\n var mcount = Math.min(words.length, otherWords.length);\n var k = 0 | 0;\n for (; k + 7 < mcount; k += 8) {\n words[k] |= otherWords[k];\n words[k + 1] |= otherWords[k + 1];\n words[k + 2] |= otherWords[k + 2];\n words[k + 3] |= otherWords[k + 3];\n words[k + 4] |= otherWords[k + 4];\n words[k + 5] |= otherWords[k + 5];\n words[k + 6] |= otherWords[k + 6];\n words[k + 7] |= otherWords[k + 7];\n }\n for (; k < mcount; ++k) {\n words[k] |= otherWords[k];\n }\n if (words.length < otherWords.length) {\n this.resize((otherWords.length << 5) - 1);\n words = this.data;\n var c = otherWords.length;\n for (k = mcount; k < c; ++k) {\n words[k] = otherWords[k];\n }\n }\n return this;\n }\n else {\n var otherArray = otherbitmap.data;\n for (var i = 0; i < otherbitmap.arraySize; i++) {\n var index = otherArray[i];\n this.add(index);\n }\n return this;\n }\n };\n /**\n * Computes the union between this bitset and another one,\n * a new bitmap is generated\n */\n SparseTypedFastBitSet.prototype.new_union = function (otherbitmap) {\n if (!(otherbitmap instanceof SparseTypedFastBitSet) ||\n otherbitmap.arraySize === -1) {\n var words = this.data;\n if (this.arraySize !== -1) {\n words = this.toBitset();\n }\n var otherWords = otherbitmap.words;\n var count = Math.max(words.length, otherWords.length);\n var answer = new SparseTypedFastBitSet(undefined, new Uint32Array(count));\n answer.arraySize = -1;\n var mcount = Math.min(words.length, otherWords.length);\n for (var k = 0; k < mcount; ++k) {\n answer.words[k] = words[k] | otherWords[k];\n }\n var c = words.length;\n for (var k = mcount; k < c; ++k) {\n answer.words[k] = words[k];\n }\n var c2 = otherWords.length;\n for (var k = mcount; k < c2; ++k) {\n answer.words[k] = otherWords[k];\n }\n return answer;\n }\n else {\n var answer = this.clone();\n var otherArray = otherbitmap.data;\n for (var i = 0; i < otherbitmap.arraySize; i++) {\n var index = otherArray[i];\n answer.add(index);\n }\n return answer;\n }\n };\n /**\n * Computes the size union between this bitset and another one\n */\n SparseTypedFastBitSet.prototype.union_size = function (otherbitmap) {\n var order = SparseTypedFastBitSet.order(this, otherbitmap);\n switch (order.type) {\n case Type.BITSET: {\n var words = order.first.words;\n var otherWords = order.second.words;\n var mcount = Math.min(words.length, otherWords.length);\n var answer = 0 | 0;\n for (var k = 0 | 0; k < mcount; ++k) {\n answer += (0, utils_1.hammingWeight)(words[k] | otherWords[k]);\n }\n if (words.length < otherWords.length) {\n var c = otherWords.length;\n for (var k = words.length; k < c; ++k) {\n answer += (0, utils_1.hammingWeight)(otherWords[k] | 0);\n }\n }\n else {\n var c = words.length;\n for (var k = otherWords.length; k < c; ++k) {\n answer += (0, utils_1.hammingWeight)(words[k] | 0);\n }\n }\n return answer;\n }\n case Type.ARRAY:\n case Type.MIXED: {\n var answer = order.second.size();\n var array = order.first.data;\n for (var i = 0; i < order.first.arraySize; i++) {\n if (!order.second.has(array[i])) {\n answer++;\n }\n }\n return answer;\n }\n }\n };\n /**\n * will put array based one first and return type if both array smallest first\n */\n SparseTypedFastBitSet.order = function (first, second) {\n if (!(first instanceof SparseTypedFastBitSet) || first.arraySize === -1) {\n if (!(second instanceof SparseTypedFastBitSet) ||\n second.arraySize === -1) {\n return {\n first: first,\n second: second,\n type: Type.BITSET,\n };\n }\n else {\n return {\n first: second,\n second: first,\n type: Type.MIXED,\n };\n }\n }\n else {\n if (!(second instanceof SparseTypedFastBitSet) ||\n second.arraySize === -1) {\n return {\n first: first,\n second: second,\n type: Type.MIXED,\n };\n }\n else {\n if (second.arraySize > first.arraySize) {\n return {\n first: first,\n second: second,\n type: Type.ARRAY,\n };\n }\n else {\n return {\n first: second,\n second: first,\n type: Type.ARRAY,\n };\n }\n }\n }\n };\n return SparseTypedFastBitSet;\n}());\nexports.SparseTypedFastBitSet = SparseTypedFastBitSet;\n//# sourceMappingURL=SparseTypedFastBitSet.js.map","\"use strict\";\n/**\n * TypedFastBitSet.js : a fast bit set implementation in JavaScript.\n * (c) the authors\n * Licensed under the Apache License, Version 2.0.\n *\n * Speed-optimized BitSet implementation for modern browsers and JavaScript engines.\n *\n * A BitSet is an ideal data structure to implement a Set when values being stored are\n * reasonably small integers. It can be orders of magnitude faster than a generic set implementation.\n * The FastBitSet implementation optimizes for speed, leveraging commonly available features\n * like typed arrays.\n *\n * Simple usage :\n * const b = new TypedFastBitSet();// initially empty\n * // will throw exception if typed arrays are not supported\n * b.add(1);// add the value \"1\"\n * b.has(1); // check that the value is present! (will return true)\n * b.add(2);\n * console.log(\"\"+b);// should display {1,2}\n * b.add(10);\n * b.array(); // would return [1,2,10]\n *\n * let c = new FastBitSet([1,2,3,10]); // create bitset initialized with values 1,2,3,10\n * c.difference(b); // from c, remove elements that are in b (modifies c)\n * c.difference2(b); // from c, remove elements that are in b (modifies b)\n * c.change(b); // c will contain elements that are in b or in c, but not both\n * const su = c.union_size(b);// compute the size of the union (bitsets are unchanged)\n * c.union(b); // c will contain all elements that are in c and b\n * const s1 = c.intersection_size(b);// compute the size of the intersection (bitsets are unchanged)\n * c.intersection(b); // c will only contain elements that are in both c and b\n * c = b.clone(); // create a (deep) copy of b and assign it to c.\n * c.equals(b); // check whether c and b are equal\n *\n * See README.md file for a more complete description.\n *\n * You can install the library under node with the command line\n * npm install typedfastbitset\n */\nvar __values = (this && this.__values) || function(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TypedFastBitSet = void 0;\nvar utils_1 = require(\"./utils\");\nfunction isIterable(obj) {\n if (obj) {\n return obj[Symbol.iterator] !== undefined;\n }\n return false;\n}\n/**\n * you can provide an iterable\n * an exception is thrown if typed arrays are not supported\n */\nvar TypedFastBitSet = /** @class */ (function () {\n function TypedFastBitSet(iterable, words) {\n var e_1, _a;\n if (words === void 0) { words = new Uint32Array(8); }\n this.words = words;\n if (isIterable(iterable)) {\n try {\n for (var iterable_1 = __values(iterable), iterable_1_1 = iterable_1.next(); !iterable_1_1.done; iterable_1_1 = iterable_1.next()) {\n var key = iterable_1_1.value;\n this.add(key);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (iterable_1_1 && !iterable_1_1.done && (_a = iterable_1.return)) _a.call(iterable_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n }\n /**\n * @returns a new TypedFastBitset given a Uint32Array of words\n */\n TypedFastBitSet.fromWords = function (words) {\n return new TypedFastBitSet(undefined, words);\n };\n /**\n * Add the value (Set the bit at index to true)\n */\n TypedFastBitSet.prototype.add = function (index) {\n this.resize(index);\n this.words[index >>> 5] |= 1 << index;\n };\n /**\n * If the value was not in the set, add it, otherwise remove it (flip bit at index)\n */\n TypedFastBitSet.prototype.flip = function (index) {\n this.resize(index);\n this.words[index >>> 5] ^= 1 << index;\n };\n /**\n * Remove all values, reset memory usage\n */\n TypedFastBitSet.prototype.clear = function () {\n this.words = new Uint32Array(8);\n };\n /**\n * Set the bit at index to false\n */\n TypedFastBitSet.prototype.remove = function (index) {\n this.resize(index);\n this.words[index >>> 5] &= ~(1 << index);\n };\n /**\n * Set bits from start (inclusive) to end (exclusive)\n */\n TypedFastBitSet.prototype.addRange = function (start, end) {\n if (start >= end) {\n return;\n }\n if (this.words.length << 5 <= end) {\n this.resize(end);\n }\n var words = this.words;\n var firstword = start >> 5;\n var endword = (end - 1) >> 5;\n if (firstword === endword) {\n words[firstword] |= (~0 << start) & (~0 >>> -end);\n return;\n }\n words[firstword] |= ~0 << start;\n words.fill(~0, firstword + 1, endword);\n words[endword] |= ~0 >>> -end;\n };\n /**\n * Remove bits from start (inclusive) to end (exclusive)\n */\n TypedFastBitSet.prototype.removeRange = function (start, end) {\n var words = this.words;\n start = Math.min(start, (words.length << 5) - 1);\n end = Math.min(end, (words.length << 5) - 1);\n if (start >= end) {\n return;\n }\n var firstword = start >> 5;\n var endword = (end - 1) >> 5;\n if (firstword === endword) {\n words[firstword] &= ~((~0 << start) & (~0 >>> -end));\n return;\n }\n words[firstword] &= ~(~0 << start);\n words.fill(0, firstword + 1, endword);\n words[endword] &= ~(~0 >>> -end);\n };\n /**\n * @returns true if no bit is set\n */\n TypedFastBitSet.prototype.isEmpty = function () {\n var words = this.words;\n var c = words.length;\n for (var i = 0; i < c; i++) {\n if (words[i] !== 0)\n return false;\n }\n return true;\n };\n /**\n * Is the value contained in the set? Is the bit at index true or false?\n */\n TypedFastBitSet.prototype.has = function (index) {\n return (this.words[index >>> 5] & (1 << index)) !== 0;\n };\n /**\n * Is any value of the (exclusive) range contained in the set?\n */\n TypedFastBitSet.prototype.hasAnyInRange = function (start, end) {\n if (start >= end)\n return false;\n var words = this.words;\n start = Math.min(start, (words.length << 5) - 1);\n end = Math.min(end, (words.length << 5) - 1);\n var firstword = start >>> 5;\n var endword = (end - 1) >> 5;\n if (firstword === endword)\n return (words[firstword] & ((~0 << start) & (~0 >>> -end))) !== 0;\n if ((words[firstword] & (~0 << start)) !== 0)\n return true;\n for (var index = firstword + 1; index < endword - 1; index++)\n if (words[index] !== 0)\n return true;\n return (words[endword] & (~0 >>> -end)) !== 0;\n };\n /**\n * Tries to add the value (Set the bit at index to true)\n *\n * @returns 1 if the value was added, 0 if the value was already present\n */\n TypedFastBitSet.prototype.checkedAdd = function (index) {\n var words = this.words;\n this.resize(index);\n var word = words[index >>> 5];\n var newword = word | (1 << index);\n words[index >>> 5] = newword;\n return ((newword ^ word) >>> index);\n };\n /**\n * Reduce the memory usage to a minimum\n */\n TypedFastBitSet.prototype.trim = function () {\n var words = this.words;\n var nl = words.length;\n while (nl > 0 && words[nl - 1] === 0) {\n nl--;\n }\n this.words = words.slice(0, nl);\n };\n /**\n * Resize the bitset so that we can write a value at index\n */\n TypedFastBitSet.prototype.resize = function (index) {\n var words = this.words;\n if (words.length << 5 > index)\n return;\n var count = (index + 32) >>> 5; // just what is needed\n var newwords = new Uint32Array(count << 1);\n newwords.set(words); // hopefully, this copy is fast\n this.words = newwords;\n };\n /**\n * @returns How many values stored in the set? How many set bits?\n */\n TypedFastBitSet.prototype.size = function () {\n var words = this.words;\n var answer = 0;\n var c = words.length;\n var k = 0 | 0;\n for (; k + 4 < c; k += 4) {\n answer += (0, utils_1.hammingWeight4)(words[k] | 0, words[k + 1] | 0, words[k + 2] | 0, words[k + 3] | 0);\n }\n for (; k < c; ++k) {\n answer += (0, utils_1.hammingWeight)(words[k] | 0);\n }\n return answer;\n };\n /**\n * @returns an array with the set bit locations (values)\n */\n TypedFastBitSet.prototype.array = function () {\n var words = this.words;\n var answer = new Array(this.size());\n var pos = 0 | 0;\n var c = words.length;\n for (var k = 0; k < c; ++k) {\n var w = words[k];\n while (w != 0) {\n var t = w & -w;\n answer[pos++] = (k << 5) + (0, utils_1.hammingWeight)((t - 1) | 0);\n w ^= t;\n }\n }\n return answer;\n };\n TypedFastBitSet.prototype.forEach = function (fnc) {\n var words = this.words;\n var c = words.length;\n for (var k = 0; k < c; ++k) {\n var w = words[k];\n while (w != 0) {\n var t = w & -w;\n fnc(((k << 5) + (0, utils_1.hammingWeight)(t - 1)) | 0);\n w ^= t;\n }\n }\n };\n /**\n * Iterator of set bit locations (values)\n */\n TypedFastBitSet.prototype[Symbol.iterator] = function () {\n var _a;\n var words = this.words;\n var c = words.length;\n var k = 0;\n var w = words[k];\n return _a = {},\n _a[Symbol.iterator] = function () {\n return this;\n },\n _a.next = function () {\n while (k < c) {\n if (w !== 0) {\n var t = w & -w;\n var value = (k << 5) + (0, utils_1.hammingWeight)((t - 1) | 0);\n w ^= t;\n return { done: false, value: value };\n }\n else {\n k++;\n if (k < c) {\n w = words[k];\n }\n }\n }\n return { done: true, value: undefined };\n },\n _a;\n };\n /**\n * @returns a copy of this bitmap\n */\n TypedFastBitSet.prototype.clone = function () {\n return TypedFastBitSet.fromWords(new Uint32Array(this.words));\n };\n /**\n * Check if this bitset intersects with another one,\n * no bitmap is modified\n */\n TypedFastBitSet.prototype.intersects = function (otherbitmap) {\n var words = this.words;\n var otherWords = otherbitmap.words;\n var newcount = Math.min(words.length, otherWords.length);\n for (var k = 0 | 0; k < newcount; ++k) {\n if ((words[k] & otherWords[k]) !== 0)\n return true;\n }\n return false;\n };\n /**\n * Computes the intersection between this bitset and another one,\n * the current bitmap is modified (and returned by the function)\n */\n TypedFastBitSet.prototype.intersection = function (otherbitmap) {\n var words = this.words;\n var otherWords = otherbitmap.words;\n var newcount = Math.min(words.length, otherWords.length);\n var k = 0 | 0;\n for (; k + 7 < newcount; k += 8) {\n words[k] &= otherWords[k];\n words[k + 1] &= otherWords[k + 1];\n words[k + 2] &= otherWords[k + 2];\n words[k + 3] &= otherWords[k + 3];\n words[k + 4] &= otherWords[k + 4];\n words[k + 5] &= otherWords[k + 5];\n words[k + 6] &= otherWords[k + 6];\n words[k + 7] &= otherWords[k + 7];\n }\n for (; k < newcount; ++k) {\n words[k] &= otherWords[k];\n }\n var c = words.length;\n for (k = newcount; k < c; ++k) {\n words[k] = 0;\n }\n return this;\n };\n /**\n * Computes the size of the intersection between this bitset and another one\n */\n TypedFastBitSet.prototype.intersection_size = function (otherbitmap) {\n var words = this.words;\n var otherWords = otherbitmap.words;\n var newcount = Math.min(words.length, otherWords.length);\n var answer = 0 | 0;\n for (var k = 0 | 0; k < newcount; ++k) {\n answer += (0, utils_1.hammingWeight)(words[k] & otherWords[k]);\n }\n return answer;\n };\n /**\n * Computes the intersection between this bitset and another one,\n * a new bitmap is generated\n */\n TypedFastBitSet.prototype.new_intersection = function (otherbitmap) {\n var words = this.words;\n var otherWords = otherbitmap.words;\n var count = Math.min(words.length, otherWords.length);\n var newWords = new Uint32Array(count);\n var k = 0 | 0;\n for (; k + 7 < count; k += 8) {\n newWords[k] = words[k] & otherWords[k];\n newWords[k + 1] = words[k + 1] & otherWords[k + 1];\n newWords[k + 2] = words[k + 2] & otherWords[k + 2];\n newWords[k + 3] = words[k + 3] & otherWords[k + 3];\n newWords[k + 4] = words[k + 4] & otherWords[k + 4];\n newWords[k + 5] = words[k + 5] & otherWords[k + 5];\n newWords[k + 7] = words[k + 7] & otherWords[k + 7];\n newWords[k + 6] = words[k + 6] & otherWords[k + 6];\n }\n for (; k < count; ++k) {\n newWords[k] = words[k] & otherWords[k];\n }\n return new TypedFastBitSet(undefined, newWords);\n };\n /**\n * Computes the intersection between this bitset and another one,\n * the current bitmap is modified\n */\n TypedFastBitSet.prototype.equals = function (otherbitmap) {\n var words = this.words;\n var otherWords = otherbitmap.words;\n var mcount = Math.min(words.length, otherWords.length);\n for (var k = 0 | 0; k < mcount; ++k) {\n if (words[k] != otherWords[k])\n return false;\n }\n if (words.length < otherWords.length) {\n var c = otherWords.length;\n for (var k = words.length; k < c; ++k) {\n if (otherWords[k] != 0)\n return false;\n }\n }\n else if (otherWords.length < words.length) {\n var c = words.length;\n for (var k = otherWords.length; k < c; ++k) {\n if (words[k] != 0)\n return false;\n }\n }\n return true;\n };\n /**\n * Computes the difference between this bitset and another one,\n * the current bitset is modified (and returned by the function)\n */\n TypedFastBitSet.prototype.difference = function (otherbitmap) {\n var words = this.words;\n var otherWords = otherbitmap.words;\n var newcount = Math.min(words.length, otherWords.length);\n var k = 0 | 0;\n for (; k + 7 < newcount; k += 8) {\n words[k] &= ~otherWords[k];\n words[k + 1] &= ~otherWords[k + 1];\n words[k + 2] &= ~otherWords[k + 2];\n words[k + 3] &= ~otherWords[k + 3];\n words[k + 4] &= ~otherWords[k + 4];\n words[k + 5] &= ~otherWords[k + 5];\n words[k + 6] &= ~otherWords[k + 6];\n words[k + 7] &= ~otherWords[k + 7];\n }\n for (; k < newcount; ++k) {\n words[k] &= ~otherWords[k];\n }\n return this;\n };\n /**\n * Computes the difference between this bitset and another one,\n * the other bitset is modified (and returned by the function)\n *\n * (for this set A and other set B, this computes B = A - B and returns B)\n */\n TypedFastBitSet.prototype.difference2 = function (otherbitmap) {\n var mincount = Math.min(this.words.length, otherbitmap.words.length);\n otherbitmap.resize((this.words.length << 5) - 1);\n var words = this.words;\n var otherWords = otherbitmap.words;\n var k = 0 | 0;\n for (; k + 7 < mincount; k += 8) {\n otherWords[k] = words[k] & ~otherWords[k];\n otherWords[k + 1] = words[k + 1] & ~otherWords[k + 1];\n otherWords[k + 2] = words[k + 2] & ~otherWords[k + 2];\n otherWords[k + 3] = words[k + 3] & ~otherWords[k + 3];\n otherWords[k + 4] = words[k + 4] & ~otherWords[k + 4];\n otherWords[k + 5] = words[k + 5] & ~otherWords[k + 5];\n otherWords[k + 6] = words[k + 6] & ~otherWords[k + 6];\n otherWords[k + 7] = words[k + 7] & ~otherWords[k + 7];\n }\n for (; k < mincount; ++k) {\n otherWords[k] = this.words[k] & ~otherWords[k];\n }\n // remaining words are all part of difference\n for (; k < this.words.length; ++k) {\n otherWords[k] = this.words[k];\n }\n otherWords.fill(0, k);\n return otherbitmap;\n };\n /**\n * Computes the difference between this bitset and another one,\n * a new bitmap is generated\n */\n TypedFastBitSet.prototype.new_difference = function (otherbitmap) {\n return this.clone().difference(otherbitmap); // should be fast enough\n };\n /**\n * Computes the size of the difference between this bitset and another one\n */\n TypedFastBitSet.prototype.difference_size = function (otherbitmap) {\n var words = this.words;\n var otherWords = otherbitmap.words;\n var newcount = Math.min(words.length, otherWords.length);\n var answer = 0 | 0;\n var k = 0 | 0;\n for (; k < newcount; ++k) {\n answer += (0, utils_1.hammingWeight)(words[k] & ~otherWords[k]);\n }\n var c = words.length;\n for (; k < c; ++k) {\n answer += (0, utils_1.hammingWeight)(words[k]);\n }\n return answer;\n };\n /**\n * Computes the changed elements (XOR) between this bitset and another one,\n * the current bitset is modified (and returned by the function)\n */\n TypedFastBitSet.prototype.change = function (otherbitmap) {\n var otherWords = otherbitmap.words;\n var mincount = Math.min(this.words.length, otherWords.length);\n this.resize((otherWords.length << 5) - 1);\n var words = this.words;\n var k = 0 | 0;\n for (; k + 7 < mincount; k += 8) {\n words[k] ^= otherWords[k];\n words[k + 1] ^= otherWords[k + 1];\n words[k + 2] ^= otherWords[k + 2];\n words[k + 3] ^= otherWords[k + 3];\n words[k + 4] ^= otherWords[k + 4];\n words[k + 5] ^= otherWords[k + 5];\n words[k + 6] ^= otherWords[k + 6];\n words[k + 7] ^= otherWords[k + 7];\n }\n for (; k < mincount; ++k) {\n words[k] ^= otherWords[k];\n }\n // remaining words are all part of change\n for (; k < otherWords.length; ++k) {\n words[k] = otherWords[k];\n }\n return this;\n };\n /**\n * Computes the change between this bitset and another one,\n * a new bitmap is generated\n */\n TypedFastBitSet.prototype.new_change = function (otherbitmap) {\n var words = this.words;\n var otherWords = otherbitmap.words;\n var count = Math.max(words.length, otherWords.length);\n var newWords = new Uint32Array(count);\n var mcount = Math.min(words.length, otherWords.length);\n var k = 0;\n for (; k + 7 < mcount; k += 8) {\n newWords[k] = words[k] ^ otherWords[k];\n newWords[k + 1] = words[k + 1] ^ otherWords[k + 1];\n newWords[k + 2] = words[k + 2] ^ otherWords[k + 2];\n newWords[k + 3] = words[k + 3] ^ otherWords[k + 3];\n newWords[k + 4] = words[k + 4] ^ otherWords[k + 4];\n newWords[k + 5] = words[k + 5] ^ otherWords[k + 5];\n newWords[k + 6] = words[k + 6] ^ otherWords[k + 6];\n newWords[k + 7] = words[k + 7] ^ otherWords[k + 7];\n }\n for (; k < mcount; ++k) {\n newWords[k] = words[k] ^ otherWords[k];\n }\n var c = words.length;\n for (k = mcount; k < c; ++k) {\n newWords[k] = words[k];\n }\n var c2 = otherWords.length;\n for (k = mcount; k < c2; ++k) {\n newWords[k] = otherWords[k];\n }\n return new TypedFastBitSet(undefined, newWords);\n };\n /**\n * Computes the number of changed elements between this bitset and another one\n */\n TypedFastBitSet.prototype.change_size = function (otherbitmap) {\n var words = this.words;\n var otherWords = otherbitmap.words;\n var mincount = Math.min(words.length, otherWords.length);\n var answer = 0 | 0;\n var k = 0 | 0;\n for (; k < mincount; ++k) {\n answer += (0, utils_1.hammingWeight)(words[k] ^ otherWords[k]);\n }\n var longer = words.length > otherWords.length ? this : otherbitmap;\n var c = longer.words.length;\n for (; k < c; ++k) {\n answer += (0, utils_1.hammingWeight)(longer.words[k]);\n }\n return answer;\n };\n /**\n * @returns a string representation\n */\n TypedFastBitSet.prototype.toString = function () {\n return \"{\" + this.array().join(\",\") + \"}\";\n };\n /**\n * Computes the union between this bitset and another one,\n * the current bitset is modified (and returned by the function)\n */\n TypedFastBitSet.prototype.union = function (otherbitmap) {\n var words = this.words;\n var otherWords = otherbitmap.words;\n var mcount = Math.min(words.length, otherWords.length);\n var k = 0 | 0;\n for (; k + 7 < mcount; k += 8) {\n words[k] |= otherWords[k];\n words[k + 1] |= otherWords[k + 1];\n words[k + 2] |= otherWords[k + 2];\n words[k + 3] |= otherWords[k + 3];\n words[k + 4] |= otherWords[k + 4];\n words[k + 5] |= otherWords[k + 5];\n words[k + 6] |= otherWords[k + 6];\n words[k + 7] |= otherWords[k + 7];\n }\n for (; k < mcount; ++k) {\n words[k] |= otherWords[k];\n }\n if (words.length < otherWords.length) {\n this.resize((otherWords.length << 5) - 1);\n words = this.words;\n var c = otherWords.length;\n for (k = mcount; k < c; ++k) {\n words[k] = otherWords[k];\n }\n }\n return this;\n };\n /**\n * Computes the union between this bitset and another one,\n * a new bitmap is generated\n */\n TypedFastBitSet.prototype.new_union = function (otherbitmap) {\n var words = this.words;\n var otherWords = otherbitmap.words;\n var count = Math.max(words.length, otherWords.length);\n var newWords = new Uint32Array(count);\n var mcount = Math.min(words.length, otherWords.length);\n for (var k = 0; k < mcount; ++k) {\n newWords[k] = words[k] | otherWords[k];\n }\n var c = words.length;\n for (var k = mcount; k < c; ++k) {\n newWords[k] = words[k];\n }\n var c2 = otherWords.length;\n for (var k = mcount; k < c2; ++k) {\n newWords[k] = otherWords[k];\n }\n return new TypedFastBitSet(undefined, newWords);\n };\n /**\n * Computes the size union between this bitset and another one\n */\n TypedFastBitSet.prototype.union_size = function (otherbitmap) {\n var words = this.words;\n var otherWords = otherbitmap.words;\n var mcount = Math.min(words.length, otherWords.length);\n var answer = 0 | 0;\n for (var k = 0 | 0; k < mcount; ++k) {\n answer += (0, utils_1.hammingWeight)(words[k] | otherWords[k]);\n }\n if (words.length < otherWords.length) {\n var c = otherWords.length;\n for (var k = words.length; k < c; ++k) {\n answer += (0, utils_1.hammingWeight)(otherWords[k] | 0);\n }\n }\n else {\n var c = words.length;\n for (var k = otherWords.length; k < c; ++k) {\n answer += (0, utils_1.hammingWeight)(words[k] | 0);\n }\n }\n return answer;\n };\n return TypedFastBitSet;\n}());\nexports.TypedFastBitSet = TypedFastBitSet;\n//# sourceMappingURL=TypedFastBitSet.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./SparseTypedFastBitSet\"), exports);\n__exportStar(require(\"./TypedFastBitSet\"), exports);\n//# sourceMappingURL=index.js.map","import { TypedFastBitSet } from \"typedfastbitset\";\n\n/**\n * Wrapper around TypedFastBitSet with graph-specific optimizations\n *\n * Provides efficient bit-packed set operations optimized for graph algorithms\n * with 8x memory reduction compared to standard JavaScript Set for boolean values.\n */\nexport class GraphBitSet {\n private bitset: TypedFastBitSet;\n private _cardinality = 0;\n\n /**\n * Creates a new GraphBitSet with optional pre-allocated capacity.\n * @param capacity - The initial capacity to pre-allocate for the bitset\n */\n constructor(capacity?: number) {\n this.bitset = new TypedFastBitSet();\n if (capacity) {\n // Pre-allocate for known size\n this.bitset.resize(capacity);\n }\n }\n\n /**\n * Add a single element to the set.\n * @param index - The element index to add\n */\n add(index: number): void {\n if (!this.bitset.has(index)) {\n this.bitset.add(index);\n this._cardinality++;\n }\n }\n\n /**\n * Remove a single element from the set.\n * @param index - The element index to remove\n */\n remove(index: number): void {\n if (this.bitset.has(index)) {\n this.bitset.remove(index);\n this._cardinality--;\n }\n }\n\n /**\n * Check if an element exists in the set.\n * @param index - The element index to check\n * @returns True if the element exists, false otherwise\n */\n has(index: number): boolean {\n return this.bitset.has(index);\n }\n\n /**\n * Clear all elements\n */\n clear(): void {\n this.bitset.clear();\n this._cardinality = 0;\n }\n\n /**\n * Check if the set is empty.\n * @returns True if the set contains no elements, false otherwise\n */\n isEmpty(): boolean {\n return this._cardinality === 0;\n }\n\n /**\n * Optimized for graph algorithms - add a range of indices.\n * @param start - The starting index (inclusive)\n * @param end - The ending index (exclusive)\n */\n addRange(start: number, end: number): void {\n for (let i = start; i < end; i++) {\n if (!this.bitset.has(i)) {\n this.bitset.add(i);\n this._cardinality++;\n }\n }\n }\n\n /**\n * Fast cardinality tracking - get the number of elements in the set.\n * @returns The number of elements in the set\n */\n size(): number {\n return this._cardinality;\n }\n\n /**\n * Batch operations for frontier management - swap contents with another GraphBitSet.\n * @param other - The GraphBitSet to swap contents with\n */\n swap(other: GraphBitSet): void {\n [this.bitset, other.bitset] = [other.bitset, this.bitset];\n [this._cardinality, other._cardinality] = [other._cardinality, this._cardinality];\n }\n\n /**\n * Efficient iteration over all elements in the set.\n * @yields The indices of elements in the set\n */\n *[Symbol.iterator](): Generator<number> {\n // Use TypedFastBitSet's optimized iteration\n yield* this.bitset;\n }\n\n /**\n * Perform union operation with another GraphBitSet, updating this set in place.\n * @param other - The GraphBitSet to union with\n */\n union(other: GraphBitSet): void {\n const result = this.bitset.union(other.bitset);\n this.bitset = result;\n\n const size = this.bitset.size();\n this._cardinality = size;\n }\n\n /**\n * Perform intersection operation with another GraphBitSet, updating this set in place.\n * @param other - The GraphBitSet to intersect with\n */\n intersection(other: GraphBitSet): void {\n const result = this.bitset.intersection(other.bitset);\n this.bitset = result;\n\n const size = this.bitset.size();\n this._cardinality = size;\n }\n\n /**\n * Perform difference operation with another GraphBitSet, updating this set in place.\n * @param other - The GraphBitSet to subtract from this set\n */\n difference(other: GraphBitSet): void {\n const result = this.bitset.difference(other.bitset);\n this.bitset = result;\n\n const size = this.bitset.size();\n this._cardinality = size;\n }\n\n /**\n * Clone the bitset.\n * @returns A new GraphBitSet with the same elements\n */\n clone(): GraphBitSet {\n const cloned = new GraphBitSet();\n cloned.bitset = this.bitset.clone();\n\n cloned._cardinality = this._cardinality;\n return cloned;\n }\n}\n\n/**\n * Specialized bit array for visited tracking\n *\n * More memory efficient than GraphBitSet for simple boolean arrays\n * that don't need set operations.\n */\nexport class VisitedBitArray {\n private words: Uint32Array;\n private wordCount: number;\n private _size: number;\n\n /**\n * Creates a new VisitedBitArray with the specified size.\n * @param size - The number of bits to allocate\n */\n constructor(size: number) {\n this._size = size;\n this.wordCount = Math.ceil(size / 32);\n this.words = new Uint32Array(this.wordCount);\n }\n\n /**\n * Set bit at the specified index.\n * @param index - The bit index to set\n */\n set(index: number): void {\n if (index < 0 || index >= this._size) {\n throw new Error(`Index ${String(index)} out of bounds [0, ${String(this._size)})`);\n }\n\n const wordIndex = index >>> 5; // divide by 32\n const bitIndex = index & 31; // modulo 32\n const word = this.words[wordIndex];\n if (word !== undefined) {\n this.words[wordIndex] = word | (1 << bitIndex);\n }\n }\n\n /**\n * Get bit value at the specified index.\n * @param index - The bit index to get\n * @returns True if the bit is set, false otherwise\n */\n get(index: number): boolean {\n if (index < 0 || index >= this._size) {\n return false;\n }\n\n const wordIndex = index >>> 5;\n const bitIndex = index & 31;\n const word = this.words[wordIndex];\n return word !== undefined && (word & (1 << bitIndex)) !== 0;\n }\n\n /**\n * Clear all bits\n */\n clear(): void {\n this.words.fill(0);\n }\n\n /**\n * Toggle bit at the specified index.\n * @param index - The bit index to toggle\n */\n toggle(index: number): void {\n if (index < 0 || index >= this._size) {\n throw new Error(`Index ${String(index)} out of bounds [0, ${String(this._size)})`);\n }\n\n const wordIndex = index >>> 5;\n const bitIndex = index & 31;\n const word = this.words[wordIndex];\n if (word !== undefined) {\n this.words[wordIndex] = word ^ (1 << bitIndex);\n }\n }\n\n /**\n * Population count for statistics - count the number of set bits.\n * @returns The number of bits set to 1\n */\n popcount(): number {\n let count = 0;\n for (let i = 0; i < this.wordCount; i++) {\n const word = this.words[i];\n if (word !== undefined) {\n count += this.popcountWord(word);\n }\n }\n return count;\n }\n\n /**\n * Efficient population count for a single word.\n * Uses bit manipulation tricks for fast counting.\n * @param n - The 32-bit word to count\n * @returns The number of bits set to 1 in the word\n */\n private popcountWord(n: number): number {\n let x = n;\n x = x - ((x >>> 1) & 0x55555555);\n x = (x & 0x33333333) + ((x >>> 2) & 0x33333333);\n return (((x + (x >>> 4)) & 0xf0f0f0f) * 0x1010101) >>> 24;\n }\n\n /**\n * Get size of the bit array.\n * @returns The total number of bits in the array\n */\n size(): number {\n return this._size;\n }\n\n /**\n * Check if all bits are zero.\n * @returns True if no bits are set, false otherwise\n */\n isEmpty(): boolean {\n for (let i = 0; i < this.wordCount; i++) {\n if (this.words[i] !== 0) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Set multiple bits from an array of indices.\n * @param indices - Array of bit indices to set\n */\n setMultiple(indices: number[]): void {\n for (const index of indices) {\n this.set(index);\n }\n }\n\n /**\n * Get indices of all set bits.\n * @returns Array containing the indices of all bits that are set to 1\n */\n getSetIndices(): number[] {\n const indices: number[] = [];\n for (let wordIndex = 0; wordIndex < this.wordCount; wordIndex++) {\n const word = this.words[wordIndex];\n if (!word || word === 0) {\n continue;\n }\n\n for (let bitIndex = 0; bitIndex < 32; bitIndex++) {\n if (word & (1 << bitIndex)) {\n const index = (wordIndex << 5) + bitIndex;\n if (index < this._size) {\n indices.push(index);\n }\n }\n }\n }\n return indices;\n }\n}\n\n/**\n * Bit-packed distance array for BFS\n *\n * Optimized for storing distances using 16-bit integers (up to 65,535 levels)\n * Still provides 2x memory savings compared to standard 32-bit numbers\n */\nexport class CompactDistanceArray {\n private data: Uint16Array;\n private _size: number;\n private static readonly INFINITY = 65535;\n\n /**\n * Creates a new CompactDistanceArray with the specified size.\n * @param size - The number of distance values to store\n */\n constructor(size: number) {\n this._size = size;\n this.data = new Uint16Array(size);\n this.data.fill(CompactDistanceArray.INFINITY); // Initialize with max value (unvisited)\n }\n\n /**\n * Set distance at the specified index.\n * @param index - The node index to set the distance for\n * @param distance - The distance value to set\n */\n set(index: number, distance: number): void {\n if (distance >= CompactDistanceArray.INFINITY) {\n throw new Error(`Distance exceeds maximum value (${String(CompactDistanceArray.INFINITY - 1)})`);\n }\n\n this.data[index] = distance;\n }\n\n /**\n * Get distance at the specified index.\n * @param index - The node index to get the distance for\n * @returns The distance value, or INFINITY if not set\n */\n get(index: number): number {\n const value = this.data[index];\n return value ?? CompactDistanceArray.INFINITY; // Default to unvisited\n }\n\n /**\n * Check if a node has been visited (has a valid distance).\n * @param index - The node index to check\n * @returns True if the node has been visited, false otherwise\n */\n isVisited(index: number): boolean {\n return this.data[index] !== CompactDistanceArray.INFINITY;\n }\n\n /**\n * Reset all distances to unvisited state.\n */\n clear(): void {\n this.data.fill(CompactDistanceArray.INFINITY);\n }\n\n /**\n * Get the size of the distance array.\n * @returns The number of elements in the array\n */\n size(): number {\n return this._size;\n }\n}\n","import type { NodeId } from \"../types/index.js\";\nimport { CompactDistanceArray, GraphBitSet } from \"./bit-packed.js\";\nimport { CSRGraph } from \"./csr-graph.js\";\n\n/**\n * Options for Direction-Optimized BFS\n */\ninterface DirectionOptimizedBFSOptions {\n alpha?: number; // Default: 15 - Controls top-down to bottom-up switch\n beta?: number; // Default: 18 - Controls bottom-up to top-down switch\n}\n\n/**\n * Result of BFS traversal\n */\ninterface BFSResult<TNodeId> {\n distances: Map<TNodeId, number>;\n parents: Map<TNodeId, TNodeId | null>;\n visitedCount: number;\n}\n\n/**\n * Direction-Optimized Breadth-First Search\n *\n * Dynamically switches between top-down and bottom-up search strategies\n * based on the size of the frontier. Particularly effective for low-diameter\n * graphs like social networks.\n *\n * Based on: Beamer, S., Asanović, K., & Patterson, D. (2012).\n * \"Direction-optimizing breadth-first search.\" SC'12.\n */\nexport class DirectionOptimizedBFS<TNodeId = NodeId> {\n private graph: CSRGraph<TNodeId>;\n private alpha: number;\n private beta: number;\n\n // Data structures\n private parent: Int32Array; // -1 = unvisited, -2 = source, else parent ID\n private frontier: GraphBitSet; // Current frontier bitmap\n private nextFrontier: GraphBitSet; // Next level frontier\n private distances: CompactDistanceArray;\n\n /**\n * Creates a new DirectionOptimizedBFS instance.\n * @param graph - The CSR graph to perform BFS on\n * @param options - Optional configuration for switching thresholds\n */\n constructor(graph: CSRGraph<TNodeId>, options?: DirectionOptimizedBFSOptions) {\n this.graph = graph;\n this.alpha = options?.alpha ?? 15;\n this.beta = options?.beta ?? 18;\n\n const nodeCount = graph.nodeCount();\n this.parent = new Int32Array(nodeCount).fill(-1);\n this.frontier = new GraphBitSet(nodeCount);\n this.nextFrontier = new GraphBitSet(nodeCount);\n this.distances = new CompactDistanceArray(nodeCount);\n }\n\n /**\n * Perform BFS from a single source node.\n * @param source - The source node ID to start the BFS from\n * @returns The BFS result containing distances and parent pointers\n */\n search(source: TNodeId): BFSResult<TNodeId> {\n const sourceIndex = this.graph.nodeToIndex(source);\n this.parent[sourceIndex] = -2; // Mark as source\n this.frontier.add(sourceIndex);\n this.distances.set(sourceIndex, 0);\n\n // let currentDistance = 0; // Variable not used\n // Initialize edgesToCheck to total edges to prevent immediate switch to bottom-up\n let edgesToCheck = this.graph.edgeCount();\n let scoutCount = 0; // Will be set after first top-down step\n let awakeCount = 1; // Number of nodes in current frontier\n let oldAwakeCount = 0;\n\n // Direction tracking\n let useBottomUp = false;\n\n while (!this.frontier.isEmpty()) {\n oldAwakeCount = awakeCount;\n\n if (useBottomUp) {\n // Check if we should switch back to top-down\n if (awakeCount >= oldAwakeCount || awakeCount > this.graph.nodeCount() / this.beta) {\n useBottomUp = false;\n }\n } else {\n // Check if we should switch to bottom-up\n if (scoutCount > edgesToCheck / this.alpha) {\n useBottomUp = true;\n }\n }\n\n if (useBottomUp) {\n awakeCount = this.bottomUpStep();\n } else {\n scoutCount = this.topDownStep();\n awakeCount = this.nextFrontier.size();\n }\n\n // Swap frontiers\n this.frontier.swap(this.nextFrontier);\n this.nextFrontier.clear();\n\n // currentDistance++; // Variable not used\n edgesToCheck = this.calculateEdgesToCheck();\n }\n\n return this.buildResult();\n }\n\n /**\n * Top-down BFS step - explore from frontier.\n * @returns The scout count (total degree of newly discovered nodes)\n */\n private topDownStep(): number {\n let scoutCount = 0;\n\n // Iterate through frontier nodes\n for (const node of this.frontier) {\n const currentDistance = this.distances.get(node);\n\n for (const neighbor of this.graph.iterateNeighborIndices(node)) {\n if (this.parent[neighbor] === -1) {\n this.parent[neighbor] = node;\n this.distances.set(neighbor, currentDistance + 1);\n this.nextFrontier.add(neighbor);\n scoutCount += this.graph.outDegreeByIndex(neighbor);\n }\n }\n }\n\n return scoutCount;\n }\n\n /**\n * Bottom-up BFS step - check unvisited nodes for frontier neighbors.\n * @returns The number of newly discovered nodes\n */\n private bottomUpStep(): number {\n const nodeCount = this.graph.nodeCount();\n let awakeCount = 0;\n\n // Check all unvisited nodes\n for (let node = 0; node < nodeCount; node++) {\n if (this.parent[node] === -1) {\n // Use incoming edges for bottom-up traversal\n for (const neighbor of this.graph.iterateIncomingNeighborIndices(node)) {\n if (this.frontier.has(neighbor)) {\n this.parent[node] = neighbor;\n const neighborDist = this.distances.get(neighbor);\n this.distances.set(node, neighborDist + 1);\n this.nextFrontier.add(node);\n awakeCount++;\n break; // Found a parent, no need to check more\n }\n }\n }\n }\n\n return awakeCount;\n }\n\n /**\n * Calculate edges to check for switching heuristic.\n * @returns The total number of outgoing edges from frontier nodes\n */\n private calculateEdgesToCheck(): number {\n let count = 0;\n for (const node of this.frontier) {\n count += this.graph.outDegreeByIndex(node);\n }\n return count;\n }\n\n /**\n * Build result map from internal data structures.\n * @returns The BFS result containing distances and parent pointers\n */\n private buildResult(): BFSResult<TNodeId> {\n const distances = new Map<TNodeId, number>();\n const parents = new Map<TNodeId, TNodeId | null>();\n let visitedCount = 0;\n\n for (let i = 0; i < this.graph.nodeCount(); i++) {\n if (this.parent[i] !== -1) {\n const nodeId = this.graph.indexToNodeId(i);\n distances.set(nodeId, this.distances.get(i));\n\n if (this.parent[i] === -2) {\n // Source node\n parents.set(nodeId, null);\n } else {\n // Regular node with parent\n const parentIndex = this.parent[i];\n if (parentIndex !== undefined && parentIndex >= 0) {\n parents.set(nodeId, this.graph.indexToNodeId(parentIndex));\n }\n }\n\n visitedCount++;\n }\n }\n\n return { distances, parents, visitedCount };\n }\n\n /**\n * Perform multi-source BFS from multiple source nodes.\n * @param sources - Array of source node IDs to start the BFS from\n * @returns The BFS result containing distances and parent pointers\n */\n searchMultiple(sources: TNodeId[]): BFSResult<TNodeId> {\n // Initialize multiple sources\n for (const source of sources) {\n const sourceIndex = this.graph.nodeToIndex(source);\n this.parent[sourceIndex] = -2; // Mark as source\n this.frontier.add(sourceIndex);\n this.distances.set(sourceIndex, 0);\n }\n\n // let currentDistance = 0; // Variable not used\n let edgesToCheck = 0;\n let scoutCount = 0;\n\n // Calculate initial edges to check\n for (const node of this.frontier) {\n const degree = this.graph.outDegreeByIndex(node);\n edgesToCheck += degree;\n scoutCount += degree;\n }\n\n let awakeCount = sources.length;\n let oldAwakeCount = 0;\n let useBottomUp = false;\n\n while (!this.frontier.isEmpty()) {\n oldAwakeCount = awakeCount;\n\n if (useBottomUp) {\n if (awakeCount >= oldAwakeCount || awakeCount > this.graph.nodeCount() / this.beta) {\n useBottomUp = false;\n }\n } else {\n if (scoutCount > edgesToCheck / this.alpha) {\n useBottomUp = true;\n }\n }\n\n if (useBottomUp) {\n awakeCount = this.bottomUpStep();\n } else {\n scoutCount = this.topDownStep();\n awakeCount = this.nextFrontier.size();\n }\n\n this.frontier.swap(this.nextFrontier);\n this.nextFrontier.clear();\n\n // currentDistance++; // Variable not used\n edgesToCheck = this.calculateEdgesToCheck();\n }\n\n return this.buildResult();\n }\n\n /**\n * Reset internal state for reuse\n */\n reset(): void {\n this.parent.fill(-1);\n this.frontier.clear();\n this.nextFrontier.clear();\n this.distances.clear();\n }\n}\n\n/**\n * Convenience function for single-source BFS.\n * @param graph - The CSR graph to perform BFS on\n * @param source - The source node ID to start the BFS from\n * @param options - Optional configuration for switching thresholds\n * @returns The BFS result containing distances and parent pointers\n */\nexport function directionOptimizedBFS<TNodeId = NodeId>(\n graph: CSRGraph<TNodeId>,\n source: TNodeId,\n options?: DirectionOptimizedBFSOptions,\n): BFSResult<TNodeId> {\n const bfs = new DirectionOptimizedBFS(graph, options);\n return bfs.search(source);\n}\n\n","import type { NodeId } from \"../types/index.js\";\n\n/**\n * Interface for read-only graph operations\n */\nexport interface ReadonlyGraph<TNodeId = NodeId> {\n nodeCount(): number;\n edgeCount(): number;\n hasNode(nodeId: TNodeId): boolean;\n hasEdge(source: TNodeId, target: TNodeId): boolean;\n neighbors(nodeId: TNodeId): IterableIterator<TNodeId>;\n outDegree(nodeId: TNodeId): number;\n nodes(): IterableIterator<TNodeId>;\n}\n\n/**\n * Internal data structure for CSR representation\n */\ninterface CSRGraphData<TNodeId> {\n // Row pointers: indices where each node's edges start\n rowPointers: Uint32Array;\n\n // Column indices: destination nodes for each edge\n columnIndices: Uint32Array;\n\n // Edge weights (optional)\n edgeWeights?: Float32Array;\n\n // Reverse edges for bottom-up BFS (optional)\n reverseRowPointers?: Uint32Array;\n reverseColumnIndices?: Uint32Array;\n\n // Node ID mapping\n nodeIdToIndex: Map<TNodeId, number>;\n indexToNodeId: TNodeId[];\n}\n\n/**\n * Compressed Sparse Row (CSR) graph representation\n *\n * Provides cache-efficient graph storage with sequential memory access patterns.\n * Optimized for traversal operations and sparse graphs.\n */\nexport class CSRGraph<TNodeId = NodeId> implements ReadonlyGraph<TNodeId> {\n private data: CSRGraphData<TNodeId>;\n\n /**\n * Creates a new CSRGraph from an adjacency list representation.\n * @param adjacencyList - Map of node IDs to arrays of neighbor node IDs\n * @param weights - Optional map of edge weights keyed by \"source-target\" strings\n * @param buildReverse - Whether to build reverse edges for bottom-up BFS (default true)\n */\n constructor(adjacencyList: Map<TNodeId, TNodeId[]>, weights?: Map<string, number>, buildReverse = true) {\n this.data = this.buildCSR(adjacencyList, weights, buildReverse);\n }\n\n /**\n * Build CSR structure from adjacency list.\n * @param adjacencyList - Map of node IDs to arrays of neighbor node IDs\n * @param weights - Optional map of edge weights keyed by \"source-target\" strings\n * @param buildReverse - Whether to build reverse edges for bottom-up BFS\n * @returns The constructed CSR graph data structure\n */\n private buildCSR(\n adjacencyList: Map<TNodeId, TNodeId[]>,\n weights?: Map<string, number>,\n buildReverse = true,\n ): CSRGraphData<TNodeId> {\n // Collect all unique nodes (both sources and targets)\n const allNodes = new Set<TNodeId>();\n for (const [source, neighbors] of adjacencyList) {\n allNodes.add(source);\n for (const neighbor of neighbors) {\n allNodes.add(neighbor);\n }\n }\n\n // Sort nodes for consistent ordering. Numeric IDs sort numerically,\n // string IDs sort lexicographically for predictable iteration order.\n const nodes = Array.from(allNodes).sort((a, b) => {\n if (typeof a === \"number\" && typeof b === \"number\") {\n return a - b;\n }\n\n return String(a).localeCompare(String(b));\n });\n const nodeCount = nodes.length;\n\n // Build node mappings\n const nodeIdToIndex = new Map<TNodeId, number>();\n const indexToNodeId: TNodeId[] = [];\n\n nodes.forEach((nodeId, index) => {\n nodeIdToIndex.set(nodeId, index);\n indexToNodeId[index] = nodeId;\n });\n\n // Count total edges\n let edgeCount = 0;\n for (const neighbors of adjacencyList.values()) {\n edgeCount += neighbors.length;\n }\n\n // Allocate arrays\n const rowPointers = new Uint32Array(nodeCount + 1);\n const columnIndices = new Uint32Array(edgeCount);\n const edgeWeights = weights ? new Float32Array(edgeCount) : undefined;\n\n // Build CSR structure\n let currentEdge = 0;\n for (let i = 0; i < nodeCount; i++) {\n rowPointers[i] = currentEdge;\n const nodeId = indexToNodeId[i];\n if (nodeId === undefined) {\n throw new Error(`Invalid node index ${String(i)}`);\n }\n\n const neighbors = adjacencyList.get(nodeId) ?? [];\n\n // Sort neighbors for better cache locality and binary search\n const sortedNeighbors = neighbors\n .map((n) => {\n const index = nodeIdToIndex.get(n);\n if (index === undefined) {\n throw new Error(`Node ${String(n)} not found in nodeIdToIndex map`);\n }\n\n return { id: n, index };\n })\n .sort((a, b) => a.index - b.index);\n\n for (const neighbor of sortedNeighbors) {\n columnIndices[currentEdge] = neighbor.index;\n\n if (edgeWeights && weights) {\n const edgeKey = `${String(nodeId)}-${String(neighbor.id)}`;\n const weight = weights.get(edgeKey);\n if (weight !== undefined) {\n edgeWeights[currentEdge] = weight;\n } else {\n edgeWeights[currentEdge] = 1;\n }\n }\n\n currentEdge++;\n }\n }\n rowPointers[nodeCount] = currentEdge;\n\n const result: CSRGraphData<TNodeId> = {\n rowPointers,\n columnIndices,\n nodeIdToIndex,\n indexToNodeId,\n };\n\n if (edgeWeights) {\n result.edgeWeights = edgeWeights;\n }\n\n // Build reverse edges for bottom-up BFS\n if (buildReverse) {\n const reverseAdjacency = new Map<number, number[]>();\n for (let i = 0; i < nodeCount; i++) {\n reverseAdjacency.set(i, []);\n }\n\n // Build reverse adjacency from forward edges\n for (let i = 0; i < nodeCount; i++) {\n const start = rowPointers[i];\n const end = rowPointers[i + 1];\n if (start !== undefined && end !== undefined) {\n for (let j = start; j < end; j++) {\n const target = columnIndices[j];\n if (target !== undefined) {\n reverseAdjacency.get(target)?.push(i);\n }\n }\n }\n }\n\n // Build reverse CSR\n const reverseRowPointers = new Uint32Array(nodeCount + 1);\n const reverseColumnIndices = new Uint32Array(edgeCount);\n\n let reverseEdge = 0;\n for (let i = 0; i < nodeCount; i++) {\n reverseRowPointers[i] = reverseEdge;\n const incoming = reverseAdjacency.get(i) ?? [];\n incoming.sort((a, b) => a - b);\n\n for (const source of incoming) {\n reverseColumnIndices[reverseEdge++] = source;\n }\n }\n reverseRowPointers[nodeCount] = reverseEdge;\n\n result.reverseRowPointers = reverseRowPointers;\n result.reverseColumnIndices = reverseColumnIndices;\n }\n\n return result;\n }\n\n // Core API methods\n /**\n * Get the total number of nodes in the graph.\n * @returns The number of nodes\n */\n nodeCount(): number {\n return this.data.indexToNodeId.length;\n }\n\n /**\n * Get the total number of edges in the graph.\n * @returns The number of edges\n */\n edgeCount(): number {\n return this.data.columnIndices.length;\n }\n\n /**\n * Check if a node exists in the graph.\n * @param nodeId - The node ID to check\n * @returns True if the node exists, false otherwise\n */\n hasNode(nodeId: TNodeId): boolean {\n return this.data.nodeIdToIndex.has(nodeId);\n }\n\n /**\n * Check if an edge exists between two nodes.\n * @param source - The source node ID\n * @param target - The target node ID\n * @returns True if the edge exists, false otherwise\n */\n hasEdge(source: TNodeId, target: TNodeId): boolean {\n const sourceIndex = this.data.nodeIdToIndex.get(source);\n const targetIndex = this.data.nodeIdToIndex.get(target);\n\n if (sourceIndex === undefined || targetIndex === undefined) {\n return false;\n }\n\n const start = this.data.rowPointers[sourceIndex];\n const end = this.data.rowPointers[sourceIndex + 1];\n\n // Binary search for target in sorted neighbors\n if (start === undefined || end === undefined) {\n return false;\n }\n\n return this.binarySearch(this.data.columnIndices, targetIndex, start, end) !== -1;\n }\n\n /**\n * Get neighbors of a node as node IDs.\n * @param nodeId - The node ID to get neighbors for\n * @returns An iterator over neighbor node IDs\n */\n neighbors(nodeId: TNodeId): IterableIterator<TNodeId> {\n const nodeIndex = this.data.nodeIdToIndex.get(nodeId);\n if (nodeIndex === undefined) {\n return new Set<TNodeId>().values();\n }\n\n const start = this.data.rowPointers[nodeIndex];\n const end = this.data.rowPointers[nodeIndex + 1];\n\n const { columnIndices, indexToNodeId } = this.data;\n function* generateNeighbors(): Generator<TNodeId> {\n if (start !== undefined && end !== undefined) {\n for (let i = start; i < end; i++) {\n const idx = columnIndices[i];\n if (idx !== undefined) {\n const nodeId = indexToNodeId[idx];\n if (nodeId !== undefined) {\n yield nodeId;\n }\n }\n }\n }\n }\n\n return generateNeighbors();\n }\n\n /**\n * Get all nodes in the graph.\n * @returns An iterator over all node IDs\n */\n nodes(): IterableIterator<TNodeId> {\n return this.data.indexToNodeId.values();\n }\n\n /**\n * Get neighbors as indices (internal use).\n * @param nodeIndex - The internal index of the node\n * @returns Array of neighbor indices\n */\n getNeighborIndices(nodeIndex: number): number[] {\n if (nodeIndex < 0 || nodeIndex >= this.data.indexToNodeId.length) {\n return [];\n }\n\n const start = this.data.rowPointers[nodeIndex];\n const end = this.data.rowPointers[nodeIndex + 1];\n if (start === undefined || end === undefined) {\n return [];\n }\n\n return Array.from(this.data.columnIndices.subarray(start, end));\n }\n\n /**\n * Get the out-degree (number of outgoing edges) of a node.\n * @param nodeId - The node ID to get the out-degree for\n * @returns The number of outgoing edges from the node\n */\n outDegree(nodeId: TNodeId): number {\n const nodeIndex = this.data.nodeIdToIndex.get(nodeId);\n if (nodeIndex === undefined) {\n return 0;\n }\n\n return this.outDegreeByIndex(nodeIndex);\n }\n\n /**\n * Get out-degree by index (internal use).\n * @param nodeIndex - The internal index of the node\n * @returns The number of outgoing edges from the node\n */\n outDegreeByIndex(nodeIndex: number): number {\n const start = this.data.rowPointers[nodeIndex];\n const end = this.data.rowPointers[nodeIndex + 1];\n if (start !== undefined && end !== undefined) {\n return end - start;\n }\n\n return 0;\n }\n\n /**\n * Iterator support for neighbor indices.\n * @param nodeIndex - The internal index of the node\n * @yields The indices of neighboring nodes\n */\n *iterateNeighborIndices(nodeIndex: number): Generator<number> {\n const start = this.data.rowPointers[nodeIndex];\n const end = this.data.rowPointers[nodeIndex + 1];\n\n if (start !== undefined && end !== undefined) {\n for (let i = start; i < end; i++) {\n const value = this.data.columnIndices[i];\n if (value !== undefined) {\n yield value;\n }\n }\n }\n }\n\n /**\n * Iterator support for incoming neighbor indices (for bottom-up BFS).\n * @param nodeIndex - The internal index of the node\n * @yields The indices of nodes with edges pointing to this node\n */\n *iterateIncomingNeighborIndices(nodeIndex: number): Generator<number> {\n if (!this.data.reverseRowPointers || !this.data.reverseColumnIndices) {\n return;\n }\n\n const start = this.data.reverseRowPointers[nodeIndex];\n const end = this.data.reverseRowPointers[nodeIndex + 1];\n\n if (start !== undefined && end !== undefined) {\n for (let i = start; i < end; i++) {\n const value = this.data.reverseColumnIndices[i];\n if (value !== undefined) {\n yield value;\n }\n }\n }\n }\n\n /**\n * Convert node ID to internal index.\n * @param nodeId - The node ID to convert\n * @returns The internal index for the node\n */\n nodeToIndex(nodeId: TNodeId): number {\n const index = this.data.nodeIdToIndex.get(nodeId);\n if (index === undefined) {\n throw new Error(`Node ${String(nodeId)} not found in graph`);\n }\n\n return index;\n }\n\n /**\n * Convert internal index to node ID.\n * @param index - The internal index to convert\n * @returns The node ID for the given index\n */\n indexToNodeId(index: number): TNodeId {\n const nodeId = this.data.indexToNodeId[index];\n if (nodeId === undefined) {\n throw new Error(`Index ${String(index)} out of bounds`);\n }\n\n return nodeId;\n }\n\n /**\n * Get edge weight between two nodes.\n * @param source - The source node ID\n * @param target - The target node ID\n * @returns The edge weight, or undefined if the edge doesn't exist or has no weight\n */\n getEdgeWeight(source: TNodeId, target: TNodeId): number | undefined {\n if (!this.data.edgeWeights) {\n return undefined;\n }\n\n const sourceIndex = this.data.nodeIdToIndex.get(source);\n const targetIndex = this.data.nodeIdToIndex.get(target);\n\n if (sourceIndex === undefined || targetIndex === undefined) {\n return undefined;\n }\n\n const start = this.data.rowPointers[sourceIndex];\n const end = this.data.rowPointers[sourceIndex + 1];\n\n if (start === undefined || end === undefined) {\n return undefined;\n }\n\n const edgeIndex = this.binarySearch(this.data.columnIndices, targetIndex, start, end);\n if (edgeIndex === -1) {\n return undefined;\n }\n\n return this.data.edgeWeights[edgeIndex];\n }\n\n /**\n * Binary search for target in sorted array.\n * @param arr - The typed array to search in\n * @param target - The value to search for\n * @param start - The starting index (inclusive)\n * @param end - The ending index (exclusive)\n * @returns The index of the target, or -1 if not found\n */\n private binarySearch(arr: Uint32Array, target: number, start: number, end: number): number {\n let left = start;\n let right = end - 1;\n\n while (left <= right) {\n const mid = (left + right) >>> 1;\n const value = arr[mid];\n\n if (value === undefined) {\n return -1;\n }\n\n if (value === target) {\n return mid;\n }\n\n if (value < target) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n\n return -1;\n }\n\n /**\n * Create CSR graph from standard Graph interface.\n * @param graph - The graph object to convert, must implement nodes, neighbors, hasNode, and optionally getEdge\n * @param graph.nodes - Function that returns an iterator over node objects with id property\n * @param graph.neighbors - Function that returns an iterator over neighbor node IDs\n * @param graph.hasNode - Function that checks if a node exists in the graph\n * @param graph.getEdge - Optional function that returns edge data including weight\n * @returns A new CSRGraph instance\n */\n static fromGraph<TNodeId = NodeId>(graph: {\n nodes(): IterableIterator<{ id: TNodeId }>;\n neighbors(nodeId: TNodeId): IterableIterator<TNodeId>;\n hasNode(nodeId: TNodeId): boolean;\n getEdge?(source: TNodeId, target: TNodeId): { weight?: number } | undefined;\n }): CSRGraph<TNodeId> {\n const adjacencyList = new Map<TNodeId, TNodeId[]>();\n const weights = new Map<string, number>();\n\n // Build adjacency list\n for (const node of graph.nodes()) {\n const neighbors: TNodeId[] = [];\n for (const neighbor of graph.neighbors(node.id)) {\n neighbors.push(neighbor);\n\n // Get edge weight if available\n if (graph.getEdge) {\n const edge = graph.getEdge(node.id, neighbor);\n if (edge?.weight !== undefined) {\n weights.set(`${String(node.id)}-${String(neighbor)}`, edge.weight);\n }\n }\n }\n adjacencyList.set(node.id, neighbors);\n }\n\n return new CSRGraph(adjacencyList, weights.size > 0 ? weights : undefined);\n }\n}\n","import type { Graph } from \"../core/graph.js\";\nimport type { NodeId } from \"../types/index.js\";\nimport { CSRGraph, type ReadonlyGraph } from \"./csr-graph.js\";\n\n/**\n * Adapter to convert standard Graph to CSR format\n *\n * Provides transparent conversion while maintaining API compatibility\n */\nexport class GraphAdapter<TNodeId = NodeId> implements ReadonlyGraph<TNodeId> {\n private csrGraph: CSRGraph<TNodeId>;\n\n /**\n * Creates a new GraphAdapter that wraps or converts a graph to CSR format.\n * @param graph - The graph to adapt (either standard Graph or ReadonlyGraph)\n */\n constructor(graph: Graph | ReadonlyGraph<TNodeId>) {\n // Check if already a CSRGraph\n if (graph instanceof CSRGraph) {\n this.csrGraph = graph as CSRGraph<TNodeId>;\n } else {\n // Convert to CSR format\n this.csrGraph = this.convertToCSR(graph);\n }\n }\n\n /**\n * Convert standard graph to CSR format.\n * @param graph - The graph to convert\n * @returns A new CSRGraph instance\n */\n private convertToCSR(graph: Graph | ReadonlyGraph<TNodeId>): CSRGraph<TNodeId> {\n const adjacencyList = new Map<TNodeId, TNodeId[]>();\n const weights = new Map<string, number>();\n\n // Handle both Graph and ReadonlyGraph interfaces\n if (\"nodes\" in graph && typeof graph.nodes === \"function\") {\n // Build adjacency list from Graph\n for (const node of graph.nodes()) {\n const nodeId = (node as { id: TNodeId }).id;\n const neighbors: TNodeId[] = [];\n\n const graphTyped = graph as Graph;\n for (const neighborId of graphTyped.neighbors(nodeId as NodeId)) {\n neighbors.push(neighborId as TNodeId);\n\n // Get edge weight if available\n if (\"getEdge\" in graph && typeof graph.getEdge === \"function\") {\n const edge = graphTyped.getEdge(nodeId as NodeId, neighborId);\n if (edge?.weight !== undefined) {\n weights.set(`${String(nodeId)}-${String(neighborId)}`, edge.weight);\n }\n }\n }\n\n adjacencyList.set(nodeId, neighbors);\n }\n } else if (\"nodeIds\" in graph && typeof graph.nodeIds === \"function\") {\n // Handle ReadonlyGraph with nodeIds method\n interface ReadonlyGraphWithNodeIds {\n nodeIds(): Iterable<TNodeId>;\n edges?(): Iterable<{ source: TNodeId; target: TNodeId; weight?: number }>;\n }\n const readonlyGraph = graph as ReadonlyGraphWithNodeIds;\n for (const nodeId of readonlyGraph.nodeIds()) {\n adjacencyList.set(nodeId, []);\n }\n\n // Build adjacency from edges\n if (\"edges\" in readonlyGraph && typeof readonlyGraph.edges === \"function\") {\n for (const edge of readonlyGraph.edges()) {\n const neighbors = adjacencyList.get(edge.source);\n if (neighbors) {\n neighbors.push(edge.target);\n if (edge.weight !== undefined) {\n weights.set(`${String(edge.source)}-${String(edge.target)}`, edge.weight);\n }\n }\n }\n }\n }\n\n return new CSRGraph(adjacencyList, weights.size > 0 ? weights : undefined);\n }\n\n // Delegate all methods to CSR implementation\n /**\n * Get the total number of nodes in the graph.\n * @returns The number of nodes\n */\n nodeCount(): number {\n return this.csrGraph.nodeCount();\n }\n\n /**\n * Get the total number of edges in the graph.\n * @returns The number of edges\n */\n edgeCount(): number {\n return this.csrGraph.edgeCount();\n }\n\n /**\n * Check if a node exists in the graph.\n * @param nodeId - The node ID to check\n * @returns True if the node exists, false otherwise\n */\n hasNode(nodeId: TNodeId): boolean {\n return this.csrGraph.hasNode(nodeId);\n }\n\n /**\n * Check if an edge exists between two nodes.\n * @param source - The source node ID\n * @param target - The target node ID\n * @returns True if the edge exists, false otherwise\n */\n hasEdge(source: TNodeId, target: TNodeId): boolean {\n return this.csrGraph.hasEdge(source, target);\n }\n\n /**\n * Get neighbors of a node as node IDs.\n * @param nodeId - The node ID to get neighbors for\n * @returns An iterator over neighbor node IDs\n */\n neighbors(nodeId: TNodeId): IterableIterator<TNodeId> {\n return this.csrGraph.neighbors(nodeId);\n }\n\n /**\n * Get the out-degree (number of outgoing edges) of a node.\n * @param nodeId - The node ID to get the out-degree for\n * @returns The number of outgoing edges from the node\n */\n outDegree(nodeId: TNodeId): number {\n return this.csrGraph.outDegree(nodeId);\n }\n\n /**\n * Get all nodes in the graph.\n * @returns An iterator over all node IDs\n */\n nodes(): IterableIterator<TNodeId> {\n return this.csrGraph.nodes();\n }\n\n /**\n * Get the underlying CSR graph.\n * @returns The CSRGraph instance used internally\n */\n getCSRGraph(): CSRGraph<TNodeId> {\n return this.csrGraph;\n }\n}\n\n/**\n * Configuration for graph algorithm optimizations\n */\nexport interface GraphAlgorithmConfig {\n // Enable optimizations\n useDirectionOptimizedBFS?: boolean;\n useCSRFormat?: boolean;\n useBitPackedStructures?: boolean;\n\n // Algorithm-specific parameters\n bfsAlpha?: number;\n bfsBeta?: number;\n\n // Memory vs speed tradeoffs\n preallocateSize?: number;\n enableCaching?: boolean;\n}\n\n/**\n * Configure optimizations globally.\n * @deprecated This function is a no-op and will be removed in a future version\n * @param _config - The configuration object (ignored)\n */\nexport function configureOptimizations(_config: GraphAlgorithmConfig): void {\n // No-op for backward compatibility\n}\n\n/**\n * Get current configuration.\n * @deprecated This function returns empty config and will be removed in a future version\n * @returns An empty configuration object\n */\nexport function getOptimizationConfig(): GraphAlgorithmConfig {\n return {};\n}\n\n/**\n * Check if a graph is already in CSR format.\n * @param graph - The graph to check\n * @returns True if the graph is a CSRGraph instance\n */\nexport function isCSRGraph<TNodeId = NodeId>(graph: unknown): graph is CSRGraph<TNodeId> {\n return graph instanceof CSRGraph;\n}\n\n/**\n * Convert any graph to CSR format.\n * @param graph - The graph to convert\n * @returns A CSRGraph instance (either the original if already CSR, or a new converted one)\n */\nexport function toCSRGraph<TNodeId = NodeId>(\n graph: Graph | ReadonlyGraph<TNodeId> | CSRGraph<TNodeId>,\n): CSRGraph<TNodeId> {\n if (isCSRGraph<TNodeId>(graph)) {\n return graph;\n }\n\n const adapter = new GraphAdapter<TNodeId>(graph);\n return adapter.getCSRGraph();\n}\n\n/**\n * Create an optimized graph from nodes and edges.\n * @param nodes - Array of node IDs\n * @param edges - Array of edge tuples [source, target, weight?]\n * @returns A new CSRGraph instance\n */\nexport function createOptimizedGraph<TNodeId = NodeId>(\n nodes: TNodeId[],\n edges: [TNodeId, TNodeId, number?][],\n): CSRGraph<TNodeId> {\n const adjacencyList = new Map<TNodeId, TNodeId[]>();\n const weights = new Map<string, number>();\n\n // Initialize nodes\n for (const node of nodes) {\n adjacencyList.set(node, []);\n }\n\n // Add edges\n for (const [source, target, weight] of edges) {\n const neighbors = adjacencyList.get(source);\n if (neighbors) {\n neighbors.push(target);\n if (weight !== undefined) {\n weights.set(`${String(source)}-${String(target)}`, weight);\n }\n }\n }\n\n return new CSRGraph(adjacencyList, weights.size > 0 ? weights : undefined);\n}\n","import { Graph } from \"../core/graph.js\";\nimport type { NodeId } from \"../types/index.js\";\n\n/**\n * Reconstructs a path from source to target using a predecessor map\n * @param target - The target node\n * @param predecessor - Map of node to its predecessor in the path\n * @returns Array of nodes from source to target, or empty array if no path exists\n */\nexport function reconstructPath<T>(target: T, predecessor: Map<T, T | null>): T[] {\n const path: T[] = [];\n let current: T | null = target;\n\n // Build path backwards from target to source\n while (current !== null) {\n path.unshift(current);\n const pred = predecessor.get(current);\n if (pred === undefined) {\n // No path exists\n return [];\n }\n\n current = pred;\n }\n\n return path;\n}\n\n/**\n * Find common neighbors between two nodes\n * @param graph - The graph\n * @param source - First node\n * @param target - Second node\n * @param directed - Whether to consider edge direction\n * @returns Set of common neighbor node IDs\n */\nexport function getCommonNeighbors(graph: Graph, source: NodeId, target: NodeId, directed = false): Set<NodeId> {\n const sourceNeighbors = new Set(directed ? graph.outNeighbors(source) : graph.neighbors(source));\n const targetNeighbors = new Set(directed ? graph.outNeighbors(target) : graph.neighbors(target));\n\n const common = new Set<NodeId>();\n for (const neighbor of sourceNeighbors) {\n if (targetNeighbors.has(neighbor)) {\n common.add(neighbor);\n }\n }\n\n return common;\n}\n\n/**\n * Find common neighbors for link prediction in directed graphs\n * This finds nodes that form a path from source to target (source->X->target)\n * @param graph - The graph\n * @param source - First node\n * @param target - Second node\n * @returns Set of intermediate node IDs\n */\nexport function getIntermediateNodes(graph: Graph, source: NodeId, target: NodeId): Set<NodeId> {\n const sourceOutNeighbors = new Set(graph.outNeighbors(source));\n const targetInNeighbors = new Set(graph.inNeighbors(target));\n\n const common = new Set<NodeId>();\n for (const neighbor of sourceOutNeighbors) {\n if (targetInNeighbors.has(neighbor)) {\n common.add(neighbor);\n }\n }\n\n return common;\n}\n\n/**\n * Generate a consistent edge key for undirected graphs\n * @param source - Source node\n * @param target - Target node\n * @param isDirected - Whether the graph is directed\n * @returns A consistent edge identifier\n */\nexport function getEdgeKey(source: NodeId, target: NodeId, isDirected: boolean): string {\n if (isDirected) {\n return `${String(source)}->${String(target)}`;\n }\n\n // For undirected graphs, sort to ensure consistency\n const [first, second] = source < target ? [source, target] : [target, source];\n return `${String(first)}-${String(second)}`;\n}\n\n/**\n * Calculate total edge weight in a graph\n * @param graph - The graph\n * @returns Total weight of all edges\n */\nexport function getTotalEdgeWeight(graph: Graph): number {\n let totalWeight = 0;\n for (const edge of graph.edges()) {\n totalWeight += edge.weight ?? 1;\n }\n return graph.isDirected ? totalWeight : totalWeight / 2;\n}\n\n/**\n * Get node degree with optional mode for directed graphs\n * @param graph - The graph\n * @param nodeId - The node ID\n * @param mode - Degree mode for directed graphs\n * @returns Node degree\n */\nexport function getNodeDegree(graph: Graph, nodeId: NodeId, mode: \"in\" | \"out\" | \"total\" = \"total\"): number {\n if (!graph.isDirected || mode === \"total\") {\n return graph.degree(nodeId);\n }\n\n if (mode === \"in\") {\n return graph.inDegree(nodeId);\n }\n\n return graph.outDegree(nodeId);\n}\n\n/**\n * Convert directed graph to undirected\n * @param graph - The directed graph\n * @returns A new undirected graph\n */\nexport function makeUndirected(graph: Graph): Graph {\n if (!graph.isDirected) {\n return graph;\n }\n\n const undirected = new Graph({ directed: false });\n\n // Add all nodes\n for (const node of graph.nodes()) {\n undirected.addNode(node.id, node.data);\n }\n\n // Add edges (will automatically be made bidirectional)\n for (const edge of graph.edges()) {\n // For undirected, we only add each edge once\n if (!undirected.hasEdge(edge.source, edge.target)) {\n undirected.addEdge(edge.source, edge.target, edge.weight, edge.data);\n }\n }\n\n return undirected;\n}\n\n/**\n * Renumber communities consecutively starting from 0\n * @param communities - Map of node to community ID\n * @returns Map with renumbered community IDs\n */\nexport function renumberCommunities<T>(communities: Map<T, number>): Map<T, number> {\n const uniqueCommunities = new Set(communities.values());\n const remapping = new Map<number, number>();\n let newId = 0;\n\n for (const community of uniqueCommunities) {\n remapping.set(community, newId++);\n }\n\n const renumbered = new Map<T, number>();\n for (const [node, community] of communities) {\n const newCommunity = remapping.get(community);\n if (newCommunity !== undefined) {\n renumbered.set(node, newCommunity);\n }\n }\n\n return renumbered;\n}\n","import type { Graph } from \"../../core/graph.js\";\nimport { CSRGraph } from \"../../optimized/csr-graph.js\";\nimport { DirectionOptimizedBFS } from \"../../optimized/direction-optimized-bfs.js\";\nimport { toCSRGraph } from \"../../optimized/graph-adapter.js\";\nimport type { NodeId, ShortestPathResult, TraversalOptions, TraversalResult } from \"../../types/index.js\";\nimport { reconstructPath } from \"../../utils/graph-utilities.js\";\n\n/**\n * Unified BFS implementation that automatically optimizes for large graphs\n *\n * This module provides a single, user-friendly BFS implementation that:\n * - Automatically uses Direction-Optimized BFS for large graphs (>10k nodes)\n * - Maintains backward compatibility with existing APIs\n * - Requires no configuration or understanding of optimization thresholds\n * - Provides the best performance by default\n */\n\n// Cache for CSR conversions to avoid repeated conversions\nconst csrCache = new WeakMap<Graph, CSRGraph>();\n\n/**\n * Get or create CSR representation of a graph\n * @param graph - The input graph to convert\n * @returns CSR graph representation (cached for efficiency)\n */\nfunction getCSRGraph(graph: Graph): CSRGraph {\n let csrGraph = csrCache.get(graph);\n if (!csrGraph) {\n csrGraph = toCSRGraph(graph);\n csrCache.set(graph, csrGraph);\n }\n\n return csrGraph;\n}\n\n/**\n * Perform breadth-first search starting from a given node\n *\n * Automatically uses the most optimized implementation based on graph size.\n * No configuration needed - just call this function for the best performance.\n * @param graph - The input graph to traverse\n * @param startNode - The node to start the BFS from\n * @param options - Traversal options (callbacks, target node, etc.)\n * @returns Traversal result with visited nodes, order, and tree structure\n */\nexport function breadthFirstSearch(graph: Graph, startNode: NodeId, options: TraversalOptions = {}): TraversalResult {\n if (!graph.hasNode(startNode)) {\n throw new Error(`Start node ${String(startNode)} not found in graph`);\n }\n\n // Automatically use optimized implementation for large graphs\n if (graph.nodeCount > 10000) {\n return breadthFirstSearchOptimized(graph, startNode, options);\n }\n\n // Standard implementation for smaller graphs\n return breadthFirstSearchStandard(graph, startNode, options);\n}\n\n/**\n * Standard BFS implementation for smaller graphs\n * @param graph - The input graph to traverse\n * @param startNode - The node to start the BFS from\n * @param options - Traversal options (callbacks, target node, etc.)\n * @returns Traversal result with visited nodes, order, and tree structure\n */\nfunction breadthFirstSearchStandard(graph: Graph, startNode: NodeId, options: TraversalOptions = {}): TraversalResult {\n const visited = new Set<NodeId>();\n const queue: { node: NodeId; level: number }[] = [];\n const order: NodeId[] = [];\n const tree = new Map<NodeId, NodeId | null>();\n\n // Initialize with start node\n queue.push({ node: startNode, level: 0 });\n visited.add(startNode);\n tree.set(startNode, null);\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n break;\n }\n\n order.push(current.node);\n\n // Call visitor callback if provided\n if (options.visitCallback) {\n options.visitCallback(current.node, current.level);\n }\n\n // Early termination if target found\n if (options.targetNode && current.node === options.targetNode) {\n break;\n }\n\n // Explore neighbors\n for (const neighbor of graph.neighbors(current.node)) {\n if (!visited.has(neighbor)) {\n visited.add(neighbor);\n tree.set(neighbor, current.node);\n queue.push({ node: neighbor, level: current.level + 1 });\n }\n }\n }\n\n return { visited, order, tree };\n}\n\n/**\n * Optimized BFS implementation using Direction-Optimized BFS\n * @param graph - The input graph to traverse\n * @param startNode - The node to start the BFS from\n * @param options - Traversal options (callbacks, target node, etc.)\n * @returns Traversal result with visited nodes, order, and tree structure\n */\nfunction breadthFirstSearchOptimized(graph: Graph, startNode: NodeId, options: TraversalOptions = {}): TraversalResult {\n const csrGraph = getCSRGraph(graph);\n\n const dobfs = new DirectionOptimizedBFS(csrGraph, {\n alpha: 15.0,\n beta: 20.0,\n });\n\n const result = dobfs.search(startNode);\n\n // Convert result to TraversalResult format\n const visited = new Set<NodeId>();\n const order: NodeId[] = [];\n const tree = new Map<NodeId, NodeId | null>();\n\n // Build traversal order using BFS from distances\n const nodesByDistance = new Map<number, NodeId[]>();\n let maxDistance = 0;\n\n for (const [nodeId, distance] of result.distances) {\n visited.add(nodeId);\n tree.set(nodeId, result.parents.get(nodeId) ?? null);\n\n if (!nodesByDistance.has(distance)) {\n nodesByDistance.set(distance, []);\n }\n\n nodesByDistance.get(distance)?.push(nodeId);\n maxDistance = Math.max(maxDistance, distance);\n }\n\n // Reconstruct BFS order\n for (let d = 0; d <= maxDistance; d++) {\n const nodes = nodesByDistance.get(d);\n if (nodes) {\n order.push(...nodes);\n }\n }\n\n // Handle visit callback if provided\n if (options.visitCallback) {\n for (const [nodeId, distance] of result.distances) {\n options.visitCallback(nodeId, distance);\n }\n }\n\n return { visited, order, tree };\n}\n\n/**\n * Find shortest path between two nodes using BFS\n *\n * Automatically optimized for large graphs. Returns null if no path exists.\n * @param graph - The input graph to search\n * @param source - The source node ID\n * @param target - The target node ID\n * @returns Shortest path result or null if no path exists\n */\nexport function shortestPathBFS(graph: Graph, source: NodeId, target: NodeId): ShortestPathResult | null {\n if (!graph.hasNode(source)) {\n throw new Error(`Source node ${String(source)} not found in graph`);\n }\n\n if (!graph.hasNode(target)) {\n throw new Error(`Target node ${String(target)} not found in graph`);\n }\n\n // Special case: source equals target\n if (source === target) {\n return {\n distance: 0,\n path: [source],\n predecessor: new Map([[source, null]]),\n };\n }\n\n // Use optimized implementation for large graphs\n if (graph.nodeCount > 10000) {\n return shortestPathBFSOptimized(graph, source, target);\n }\n\n // Standard implementation\n return shortestPathBFSStandard(graph, source, target);\n}\n\n/**\n * Standard shortest path BFS\n * @param graph - The input graph to search\n * @param source - The source node ID\n * @param target - The target node ID\n * @returns Shortest path result or null if no path exists\n */\nfunction shortestPathBFSStandard(graph: Graph, source: NodeId, target: NodeId): ShortestPathResult | null {\n const visited = new Set<NodeId>();\n const queue: { node: NodeId; distance: number }[] = [];\n const predecessor = new Map<NodeId, NodeId | null>();\n\n // Initialize BFS\n queue.push({ node: source, distance: 0 });\n visited.add(source);\n predecessor.set(source, null);\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n break;\n }\n\n // Target found\n if (current.node === target) {\n const path = reconstructPath(target, predecessor);\n return {\n distance: current.distance,\n path,\n predecessor,\n };\n }\n\n // Explore neighbors\n for (const neighbor of graph.neighbors(current.node)) {\n if (!visited.has(neighbor)) {\n visited.add(neighbor);\n predecessor.set(neighbor, current.node);\n queue.push({ node: neighbor, distance: current.distance + 1 });\n }\n }\n }\n\n // No path found\n return null;\n}\n\n/**\n * Optimized shortest path using Direction-Optimized BFS\n * @param graph - The input graph to search\n * @param source - The source node ID\n * @param target - The target node ID\n * @returns Shortest path result or null if no path exists\n */\nfunction shortestPathBFSOptimized(graph: Graph, source: NodeId, target: NodeId): ShortestPathResult | null {\n const csrGraph = getCSRGraph(graph);\n\n const dobfs = new DirectionOptimizedBFS(csrGraph, {\n alpha: 15.0,\n beta: 20.0,\n });\n\n // Perform BFS\n const result = dobfs.search(source);\n\n // Check if target was reached\n const distance = result.distances.get(target);\n if (distance === undefined) {\n return null; // No path found\n }\n\n // Reconstruct path\n const path = reconstructPath(target, result.parents);\n\n return {\n distance,\n path,\n predecessor: result.parents,\n };\n}\n\n/**\n * Find shortest paths from source to all reachable nodes\n *\n * Automatically optimized for large graphs.\n * @param graph - The input graph to search\n * @param source - The source node ID to compute shortest paths from\n * @returns Map of node IDs to their shortest path results\n */\nexport function singleSourceShortestPathBFS(graph: Graph, source: NodeId): Map<NodeId, ShortestPathResult> {\n if (!graph.hasNode(source)) {\n throw new Error(`Source node ${String(source)} not found in graph`);\n }\n\n // Use optimized implementation for large graphs\n if (graph.nodeCount > 10000) {\n return singleSourceShortestPathBFSOptimized(graph, source);\n }\n\n // Standard implementation\n return singleSourceShortestPathBFSStandard(graph, source);\n}\n\n/**\n * Standard single-source shortest paths\n * @param graph - The input graph to search\n * @param source - The source node ID to compute shortest paths from\n * @returns Map of node IDs to their shortest path results\n */\nfunction singleSourceShortestPathBFSStandard(graph: Graph, source: NodeId): Map<NodeId, ShortestPathResult> {\n const results = new Map<NodeId, ShortestPathResult>();\n const visited = new Set<NodeId>();\n const queue: { node: NodeId; distance: number }[] = [];\n const predecessor = new Map<NodeId, NodeId | null>();\n const distances = new Map<NodeId, number>();\n\n // Initialize BFS\n queue.push({ node: source, distance: 0 });\n visited.add(source);\n predecessor.set(source, null);\n distances.set(source, 0);\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n break;\n }\n\n // Explore neighbors\n for (const neighbor of graph.neighbors(current.node)) {\n if (!visited.has(neighbor)) {\n visited.add(neighbor);\n predecessor.set(neighbor, current.node);\n distances.set(neighbor, current.distance + 1);\n queue.push({ node: neighbor, distance: current.distance + 1 });\n }\n }\n }\n\n // Build results after BFS completes\n // This avoids copying the predecessor map for each node\n for (const [node, distance] of distances) {\n const path = reconstructPath(node, predecessor);\n results.set(node, {\n distance,\n path,\n predecessor, // Share the same predecessor map\n });\n }\n\n return results;\n}\n\n/**\n * Optimized single-source shortest paths\n * @param graph - The input graph to search\n * @param source - The source node ID to compute shortest paths from\n * @returns Map of node IDs to their shortest path results\n */\nfunction singleSourceShortestPathBFSOptimized(graph: Graph, source: NodeId): Map<NodeId, ShortestPathResult> {\n const csrGraph = getCSRGraph(graph);\n\n const dobfs = new DirectionOptimizedBFS(csrGraph, {\n alpha: 15.0,\n beta: 20.0,\n });\n\n const bfsResult = dobfs.search(source);\n\n // Convert to expected format\n const results = new Map<NodeId, ShortestPathResult>();\n\n for (const [nodeId, distance] of bfsResult.distances) {\n // Reconstruct path for each node\n const path = reconstructPath(nodeId, bfsResult.parents);\n\n results.set(nodeId, {\n distance,\n path,\n predecessor: bfsResult.parents, // Share the same predecessor map\n });\n }\n\n return results;\n}\n\n/**\n * Check if the graph is bipartite using BFS coloring\n *\n * Note: This function does not use Direction-Optimized BFS as the\n * coloring logic is specific and doesn't benefit from the optimization.\n * @param graph - The undirected graph to check\n * @returns True if the graph is bipartite, false otherwise\n */\nexport function isBipartite(graph: Graph): boolean {\n if (graph.isDirected) {\n throw new Error(\"Bipartite test requires an undirected graph\");\n }\n\n const color = new Map<NodeId, 0 | 1>();\n const visited = new Set<NodeId>();\n\n // Check each connected component\n for (const node of Array.from(graph.nodes())) {\n if (!visited.has(node.id)) {\n const queue: NodeId[] = [node.id];\n color.set(node.id, 0);\n visited.add(node.id);\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n break;\n }\n\n const currentColor = color.get(current);\n if (currentColor === undefined) {\n continue;\n }\n\n for (const neighbor of Array.from(graph.neighbors(current))) {\n if (!visited.has(neighbor)) {\n // Color with opposite color\n color.set(neighbor, currentColor === 0 ? 1 : 0);\n visited.add(neighbor);\n queue.push(neighbor);\n } else if (color.get(neighbor) === currentColor) {\n // Same color as current node - not bipartite\n return false;\n }\n }\n }\n }\n }\n\n return true;\n}\n","import { Graph } from \"../../core/graph.js\";\nimport type { NodeId, TraversalOptions, TraversalResult } from \"../../types/index.js\";\n\n/**\n * Depth-First Search (DFS) implementation\n *\n * Explores graph by going as deep as possible before backtracking.\n * Useful for cycle detection, topological sorting, and connectivity analysis.\n */\n\n/**\n * DFS traversal options\n */\nexport interface DFSOptions extends TraversalOptions {\n recursive?: boolean; // Use recursive implementation (default: false for browser safety)\n preOrder?: boolean; // Visit nodes in pre-order (default: true)\n}\n\n/**\n * Perform depth-first search starting from a given node\n * @param graph - The input graph to traverse\n * @param startNode - The node to start the DFS from\n * @param options - DFS options (recursive mode, pre/post order, etc.)\n * @returns Traversal result with visited nodes, order, and tree structure\n */\nexport function depthFirstSearch(graph: Graph, startNode: NodeId, options: DFSOptions = {}): TraversalResult {\n if (!graph.hasNode(startNode)) {\n throw new Error(`Start node ${String(startNode)} not found in graph`);\n }\n\n const visited = new Set<NodeId>();\n const order: NodeId[] = [];\n const tree = new Map<NodeId, NodeId | null>();\n\n if (options.recursive) {\n dfsRecursive(graph, startNode, visited, order, tree, options, 0);\n } else {\n dfsIterative(graph, startNode, visited, order, tree, options);\n }\n\n return { visited, order, tree };\n}\n\n/**\n * Iterative DFS implementation (safer for browsers)\n * @param graph - The input graph to traverse\n * @param startNode - The node to start the DFS from\n * @param visited - Set to track visited nodes\n * @param order - Array to store traversal order\n * @param tree - Map to store parent relationships\n * @param options - DFS options (recursive mode, pre/post order, etc.)\n */\nfunction dfsIterative(\n graph: Graph,\n startNode: NodeId,\n visited: Set<NodeId>,\n order: NodeId[],\n tree: Map<NodeId, NodeId | null>,\n options: DFSOptions,\n): void {\n if (options.preOrder === false) {\n // For post-order, use a simpler recursive approach to ensure correctness\n dfsRecursive(graph, startNode, visited, order, tree, options, 0, null);\n return;\n }\n\n const stack: { node: NodeId; parent: NodeId | null; depth: number }[] = [];\n stack.push({ node: startNode, parent: null, depth: 0 });\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current) {\n break;\n }\n\n if (!visited.has(current.node)) {\n visited.add(current.node);\n tree.set(current.node, current.parent);\n\n // Pre-order processing\n order.push(current.node);\n\n // Call visitor callback if provided\n if (options.visitCallback) {\n options.visitCallback(current.node, current.depth);\n }\n\n // Early termination if target found\n if (options.targetNode && current.node === options.targetNode) {\n break;\n }\n\n // Add neighbors to stack in reverse order to maintain left-to-right traversal\n const neighbors = Array.from(graph.neighbors(current.node));\n for (let i = neighbors.length - 1; i >= 0; i--) {\n const neighbor = neighbors[i];\n if (neighbor !== undefined && !visited.has(neighbor)) {\n stack.push({ node: neighbor, parent: current.node, depth: current.depth + 1 });\n }\n }\n }\n }\n}\n\n/**\n * Recursive DFS implementation\n * @param graph - The input graph to traverse\n * @param node - Current node being visited\n * @param visited - Set to track visited nodes\n * @param order - Array to store traversal order\n * @param tree - Map to store parent relationships\n * @param options - DFS options (recursive mode, pre/post order, etc.)\n * @param depth - Current depth in the traversal tree\n * @param parent - Parent node of the current node\n */\nfunction dfsRecursive(\n graph: Graph,\n node: NodeId,\n visited: Set<NodeId>,\n order: NodeId[],\n tree: Map<NodeId, NodeId | null>,\n options: DFSOptions,\n depth: number,\n parent: NodeId | null = null,\n): void {\n visited.add(node);\n tree.set(node, parent);\n\n // Pre-order processing\n if (options.preOrder !== false) {\n order.push(node);\n\n if (options.visitCallback) {\n options.visitCallback(node, depth);\n }\n\n // Early termination if target found\n if (options.targetNode && node === options.targetNode) {\n return;\n }\n }\n\n // Recursively visit neighbors\n for (const neighbor of Array.from(graph.neighbors(node))) {\n if (!visited.has(neighbor)) {\n dfsRecursive(graph, neighbor, visited, order, tree, options, depth + 1, node);\n }\n }\n\n // Post-order processing\n if (options.preOrder === false) {\n order.push(node);\n\n if (options.visitCallback) {\n options.visitCallback(node, depth);\n }\n }\n}\n\n/**\n * Detect cycles in a graph using DFS\n * @param graph - The input graph to check for cycles\n * @returns True if the graph contains a cycle, false otherwise\n */\nexport function hasCycleDFS(graph: Graph): boolean {\n const visited = new Set<NodeId>();\n\n // Check each unvisited node for cycles\n for (const node of Array.from(graph.nodes())) {\n if (!visited.has(node.id)) {\n if (graph.isDirected) {\n const recursionStack = new Set<NodeId>();\n if (hasCycleUtilDirected(graph, node.id, visited, recursionStack)) {\n return true;\n }\n } else {\n if (hasCycleUtilUndirected(graph, node.id, visited, null)) {\n return true;\n }\n }\n }\n }\n\n return false;\n}\n\n/**\n * Utility function for cycle detection in directed graphs\n * @param graph - The directed graph to check\n * @param node - Current node being visited\n * @param visited - Set of all visited nodes\n * @param recursionStack - Set of nodes in the current recursion path\n * @returns True if a cycle is found, false otherwise\n */\nfunction hasCycleUtilDirected(graph: Graph, node: NodeId, visited: Set<NodeId>, recursionStack: Set<NodeId>): boolean {\n visited.add(node);\n recursionStack.add(node);\n\n // Check all neighbors\n for (const neighbor of Array.from(graph.neighbors(node))) {\n if (!visited.has(neighbor)) {\n if (hasCycleUtilDirected(graph, neighbor, visited, recursionStack)) {\n return true;\n }\n } else if (recursionStack.has(neighbor)) {\n // Back edge found - cycle detected\n return true;\n }\n }\n\n recursionStack.delete(node);\n return false;\n}\n\n/**\n * Utility function for cycle detection in undirected graphs\n * @param graph - The undirected graph to check\n * @param node - Current node being visited\n * @param visited - Set of all visited nodes\n * @param parent - Parent node of the current node\n * @returns True if a cycle is found, false otherwise\n */\nfunction hasCycleUtilUndirected(graph: Graph, node: NodeId, visited: Set<NodeId>, parent: NodeId | null): boolean {\n visited.add(node);\n\n // Check all neighbors\n for (const neighbor of Array.from(graph.neighbors(node))) {\n if (!visited.has(neighbor)) {\n if (hasCycleUtilUndirected(graph, neighbor, visited, node)) {\n return true;\n }\n } else if (neighbor !== parent) {\n // Found a visited node that's not the parent - cycle detected\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Topological sorting using DFS (for directed acyclic graphs)\n * @param graph - The directed acyclic graph to sort\n * @returns Array of node IDs in topological order, or null if graph has cycles\n */\nexport function topologicalSort(graph: Graph): NodeId[] | null {\n if (!graph.isDirected) {\n throw new Error(\"Topological sort requires a directed graph\");\n }\n\n // First check if graph has cycles\n if (hasCycleDFS(graph)) {\n return null; // Cannot topologically sort a graph with cycles\n }\n\n const visited = new Set<NodeId>();\n const stack: NodeId[] = [];\n\n // Perform DFS from each unvisited node\n for (const node of Array.from(graph.nodes())) {\n if (!visited.has(node.id)) {\n topologicalSortUtil(graph, node.id, visited, stack);\n }\n }\n\n // Return nodes in reverse order of finishing times\n return stack.reverse();\n}\n\n/**\n * Utility function for topological sorting\n * @param graph - The directed graph being sorted\n * @param node - Current node being visited\n * @param visited - Set of visited nodes\n * @param stack - Stack to store nodes in reverse topological order\n */\nfunction topologicalSortUtil(graph: Graph, node: NodeId, visited: Set<NodeId>, stack: NodeId[]): void {\n visited.add(node);\n\n // Visit all neighbors first\n for (const neighbor of Array.from(graph.neighbors(node))) {\n if (!visited.has(neighbor)) {\n topologicalSortUtil(graph, neighbor, visited, stack);\n }\n }\n\n // Add current node to stack after visiting all neighbors\n stack.push(node);\n}\n\n/**\n * Find strongly connected components using DFS (for directed graphs)\n * @param graph - The directed graph to analyze\n * @returns Array of strongly connected components (each is an array of node IDs)\n */\nexport function findStronglyConnectedComponents(graph: Graph): NodeId[][] {\n if (!graph.isDirected) {\n throw new Error(\"Strongly connected components require a directed graph\");\n }\n\n const visited = new Set<NodeId>();\n const finishOrder: NodeId[] = [];\n\n // Step 1: Get nodes in order of finishing times\n for (const node of Array.from(graph.nodes())) {\n if (!visited.has(node.id)) {\n dfsFinishOrder(graph, node.id, visited, finishOrder);\n }\n }\n\n // Step 2: Create transpose graph (reverse all edges)\n const transposeGraph = createTransposeGraph(graph);\n\n // Step 3: DFS on transpose graph in reverse finish order\n const visited2 = new Set<NodeId>();\n const components: NodeId[][] = [];\n\n for (let i = finishOrder.length - 1; i >= 0; i--) {\n const node = finishOrder[i];\n if (node !== undefined && !visited2.has(node)) {\n const component: NodeId[] = [];\n dfsCollectComponent(transposeGraph, node, visited2, component);\n components.push(component);\n }\n }\n\n return components;\n}\n\n/**\n * DFS to record finish order\n * @param graph - The graph being traversed\n * @param node - Current node being visited\n * @param visited - Set of visited nodes\n * @param finishOrder - Array to store nodes in order of completion\n */\nfunction dfsFinishOrder(graph: Graph, node: NodeId, visited: Set<NodeId>, finishOrder: NodeId[]): void {\n visited.add(node);\n\n for (const neighbor of Array.from(graph.neighbors(node))) {\n if (!visited.has(neighbor)) {\n dfsFinishOrder(graph, neighbor, visited, finishOrder);\n }\n }\n\n finishOrder.push(node);\n}\n\n/**\n * DFS to collect nodes in a component\n * @param graph - The graph being traversed\n * @param node - Current node being visited\n * @param visited - Set of visited nodes\n * @param component - Array to collect nodes in the current component\n */\nfunction dfsCollectComponent(graph: Graph, node: NodeId, visited: Set<NodeId>, component: NodeId[]): void {\n visited.add(node);\n component.push(node);\n\n for (const neighbor of Array.from(graph.neighbors(node))) {\n if (!visited.has(neighbor)) {\n dfsCollectComponent(graph, neighbor, visited, component);\n }\n }\n}\n\n/**\n * Create transpose (reverse) of a directed graph\n * @param graph - The directed graph to transpose\n * @returns A new graph with all edges reversed\n */\nfunction createTransposeGraph(graph: Graph): Graph {\n const transpose = new Graph({ directed: true });\n\n // Add all nodes\n for (const node of Array.from(graph.nodes())) {\n transpose.addNode(node.id, node.data);\n }\n\n // Add reverse edges\n for (const edge of Array.from(graph.edges())) {\n transpose.addEdge(edge.target, edge.source, edge.weight, edge.data);\n }\n\n return transpose;\n}\n","import type { Graph } from \"../../core/graph.js\";\nimport type { NodeId, ShortestPathResult } from \"../../types/index.js\";\nimport { reconstructPath } from \"../../utils/graph-utilities.js\";\n\n/**\n * Bellman-Ford algorithm implementation for single-source shortest paths\n *\n * Finds shortest paths from a source node to all other nodes in a weighted graph.\n * Unlike Dijkstra's algorithm, it can handle negative edge weights and detect\n * negative cycles.\n */\n\n/**\n * Bellman-Ford algorithm options\n */\nexport interface BellmanFordOptions {\n /**\n * Target node for early termination (optional)\n */\n target?: NodeId;\n}\n\n/**\n * Result of Bellman-Ford algorithm\n */\nexport interface BellmanFordResult {\n /**\n * Distance from source to each reachable node\n */\n distances: Map<NodeId, number>;\n /**\n * Predecessor of each node in shortest path tree\n */\n predecessors: Map<NodeId, NodeId | null>;\n /**\n * Whether a negative cycle was detected\n */\n hasNegativeCycle: boolean;\n /**\n * Nodes involved in negative cycle (if any)\n */\n negativeCycleNodes: NodeId[];\n}\n\n/**\n * Find shortest paths from source using Bellman-Ford algorithm\n * @param graph - The graph to search\n * @param source - The starting node for the search\n * @param options - Algorithm options including optional target for early termination\n * @returns The distances, predecessors, and negative cycle information\n */\nexport function bellmanFord(graph: Graph, source: NodeId, options: BellmanFordOptions = {}): BellmanFordResult {\n if (!graph.hasNode(source)) {\n throw new Error(`Source node ${String(source)} not found in graph`);\n }\n\n const distances = new Map<NodeId, number>();\n const predecessors = new Map<NodeId, NodeId | null>();\n const nodes = Array.from(graph.nodes()).map((node) => node.id);\n\n // Initialize distances\n for (const nodeId of nodes) {\n distances.set(nodeId, nodeId === source ? 0 : Infinity);\n predecessors.set(nodeId, null);\n }\n\n // Relax edges |V| - 1 times\n for (let i = 0; i < nodes.length - 1; i++) {\n let updated = false;\n\n for (const edge of Array.from(graph.edges())) {\n const u = edge.source;\n const v = edge.target;\n const weight = edge.weight ?? 1;\n\n const distanceU = distances.get(u);\n const distanceV = distances.get(v);\n\n if (distanceU !== undefined && distanceV !== undefined && distanceU !== Infinity) {\n const newDistance = distanceU + weight;\n\n if (newDistance < distanceV) {\n distances.set(v, newDistance);\n predecessors.set(v, u);\n updated = true;\n\n // Early termination if target reached\n if (options.target && v === options.target) {\n break;\n }\n }\n }\n }\n\n // If no update in this iteration, we can stop early\n if (!updated) {\n break;\n }\n }\n\n // Check for negative cycles\n const negativeCycleNodes: NodeId[] = [];\n let hasNegativeCycle = false;\n\n for (const edge of graph.edges()) {\n const u = edge.source;\n const v = edge.target;\n const weight = edge.weight ?? 1;\n\n const distanceU = distances.get(u);\n const distanceV = distances.get(v);\n\n if (distanceU !== undefined && distanceV !== undefined && distanceU !== Infinity) {\n const newDistance = distanceU + weight;\n\n if (newDistance < distanceV) {\n hasNegativeCycle = true;\n negativeCycleNodes.push(v);\n }\n }\n }\n\n return {\n distances,\n predecessors,\n hasNegativeCycle,\n negativeCycleNodes,\n };\n}\n\n/**\n * Find shortest path between two specific nodes using Bellman-Ford\n * @param graph - The graph to search\n * @param source - The starting node for the path\n * @param target - The destination node for the path\n * @returns The shortest path result or null if no path exists\n */\nexport function bellmanFordPath(graph: Graph, source: NodeId, target: NodeId): ShortestPathResult | null {\n if (!graph.hasNode(source)) {\n throw new Error(`Source node ${String(source)} not found in graph`);\n }\n\n if (!graph.hasNode(target)) {\n throw new Error(`Target node ${String(target)} not found in graph`);\n }\n\n const result = bellmanFord(graph, source, { target });\n\n if (result.hasNegativeCycle) {\n throw new Error(\"Graph contains a negative cycle\");\n }\n\n const distance = result.distances.get(target);\n\n if (distance === undefined || distance === Infinity) {\n return null; // No path exists\n }\n\n // Reconstruct path\n const path = reconstructPath(target, result.predecessors);\n\n return {\n distance,\n path,\n predecessor: result.predecessors,\n };\n}\n\n/**\n * Check if graph has negative cycles using Bellman-Ford\n * @param graph - The graph to check for negative cycles\n * @returns True if the graph contains a negative cycle\n */\nexport function hasNegativeCycle(graph: Graph): boolean {\n const nodes = Array.from(graph.nodes());\n\n if (nodes.length === 0) {\n return false;\n }\n\n // Need to check from multiple sources in case of disconnected components\n const checked = new Set<NodeId>();\n\n for (const node of nodes) {\n if (!checked.has(node.id)) {\n const result = bellmanFord(graph, node.id);\n\n if (result.hasNegativeCycle) {\n return true;\n }\n\n // Mark all reachable nodes as checked\n for (const [nodeId, distance] of Array.from(result.distances)) {\n if (distance !== Infinity) {\n checked.add(nodeId);\n }\n }\n }\n }\n\n return false;\n}\n","/**\n * Priority Queue implementation using a binary heap\n *\n * Optimized for graph algorithms requiring efficient priority-based operations.\n * Uses a min-heap by default but supports custom comparison functions.\n */\nexport class PriorityQueue<T> {\n private heap: { item: T; priority: number }[];\n private compareFn: (a: number, b: number) => number;\n\n /**\n * Creates a new PriorityQueue instance.\n * @param compareFn - Custom comparison function for priorities. Returns negative if a has higher priority than b.\n */\n constructor(compareFn?: (a: number, b: number) => number) {\n this.heap = [];\n // Default to min-heap (smaller priority values have higher priority)\n this.compareFn = compareFn ?? ((a, b) => a - b);\n }\n\n /**\n * Add an item with the given priority to the queue\n * @param item - The item to add to the queue\n * @param priority - The priority value for the item (lower values have higher priority in min-heap)\n */\n enqueue(item: T, priority: number): void {\n const element = { item, priority };\n this.heap.push(element);\n this.heapifyUp(this.heap.length - 1);\n }\n\n /**\n * Remove and return the item with the highest priority\n * @returns The item with the highest priority, or undefined if the queue is empty\n */\n dequeue(): T | undefined {\n if (this.heap.length === 0) {\n return undefined;\n }\n\n if (this.heap.length === 1) {\n return this.heap.pop()?.item;\n }\n\n const root = this.heap[0];\n const lastElement = this.heap.pop();\n\n if (!root) {\n return undefined;\n }\n\n if (lastElement) {\n this.heap[0] = lastElement;\n this.heapifyDown(0);\n }\n\n return root.item;\n }\n\n /**\n * View the item with the highest priority without removing it\n * @returns The item with the highest priority, or undefined if the queue is empty\n */\n peek(): T | undefined {\n const first = this.heap[0];\n return first ? first.item : undefined;\n }\n\n /**\n * Check if the queue is empty\n * @returns True if the queue has no items, false otherwise\n */\n isEmpty(): boolean {\n return this.heap.length === 0;\n }\n\n /**\n * Get the number of items in the queue\n * @returns The number of items currently in the queue\n */\n size(): number {\n return this.heap.length;\n }\n\n /**\n * Update the priority of an item if it exists in the queue\n * @param item - The item whose priority should be updated\n * @param newPriority - The new priority value for the item\n * @returns True if the item was found and updated, false otherwise\n */\n updatePriority(item: T, newPriority: number): boolean {\n const index = this.heap.findIndex((element) => element.item === item);\n\n if (index === -1) {\n return false;\n }\n\n const element = this.heap[index];\n if (!element) {\n return false;\n }\n\n const oldPriority = element.priority;\n element.priority = newPriority;\n\n // Determine whether to heapify up or down based on priority change\n if (this.compareFn(newPriority, oldPriority) < 0) {\n this.heapifyUp(index);\n } else if (this.compareFn(newPriority, oldPriority) > 0) {\n this.heapifyDown(index);\n }\n\n return true;\n }\n\n /**\n * Clear all items from the queue\n */\n clear(): void {\n this.heap = [];\n }\n\n /**\n * Convert queue to array (for testing/debugging)\n * @returns An array of all items with their priorities\n */\n toArray(): { item: T; priority: number }[] {\n return [...this.heap];\n }\n\n /**\n * Move element up the heap until heap property is satisfied\n * @param index - The index of the element to heapify up\n */\n private heapifyUp(index: number): void {\n if (index === 0) {\n return;\n }\n\n const parentIndex = Math.floor((index - 1) / 2);\n\n const current = this.heap[index];\n const parent = this.heap[parentIndex];\n\n if (current && parent && this.compareFn(current.priority, parent.priority) < 0) {\n this.swap(index, parentIndex);\n this.heapifyUp(parentIndex);\n }\n }\n\n /**\n * Move element down the heap until heap property is satisfied\n * @param index - The index of the element to heapify down\n */\n private heapifyDown(index: number): void {\n const leftChildIndex = 2 * index + 1;\n const rightChildIndex = 2 * index + 2;\n let targetIndex = index;\n\n // Find the child with highest priority (lowest value for min-heap)\n const leftChild = this.heap[leftChildIndex];\n const target = this.heap[targetIndex];\n\n if (\n leftChildIndex < this.heap.length &&\n leftChild &&\n target &&\n this.compareFn(leftChild.priority, target.priority) < 0\n ) {\n targetIndex = leftChildIndex;\n }\n\n const rightChild = this.heap[rightChildIndex];\n const newTarget = this.heap[targetIndex];\n\n if (\n rightChildIndex < this.heap.length &&\n rightChild &&\n newTarget &&\n this.compareFn(rightChild.priority, newTarget.priority) < 0\n ) {\n targetIndex = rightChildIndex;\n }\n\n // If we found a child with higher priority, swap and continue\n if (targetIndex !== index) {\n this.swap(index, targetIndex);\n this.heapifyDown(targetIndex);\n }\n }\n\n /**\n * Swap two elements in the heap\n * @param i - Index of the first element\n * @param j - Index of the second element\n */\n private swap(i: number, j: number): void {\n const temp = this.heap[i];\n const other = this.heap[j];\n if (temp && other) {\n this.heap[i] = other;\n this.heap[j] = temp;\n }\n }\n}\n","import type { Graph } from \"../../core/graph.js\";\nimport { PriorityQueue } from \"../../data-structures/priority-queue.js\";\nimport type { NodeId, ShortestPathResult } from \"../../types/index.js\";\n\ninterface SearchState {\n distances: Map<NodeId, number>;\n previous: Map<NodeId, NodeId | null>;\n visited: Set<NodeId>;\n frontier: PriorityQueue<NodeId>;\n}\n\n/**\n * Bidirectional Dijkstra's algorithm implementation\n *\n * Performs simultaneous forward and backward searches to find shortest paths\n * more efficiently than standard Dijkstra for point-to-point queries.\n *\n * Time Complexity: O(2 * sqrt(V + E) log V) expected for random graphs\n * Space Complexity: O(V)\n *\n * Key optimizations:\n * - Alternating expansion based on frontier size\n * - Early termination when searches meet\n * - Efficient meeting point detection\n */\nexport class BidirectionalDijkstra {\n private graph: Graph;\n private forwardSearch: SearchState;\n private backwardSearch: SearchState;\n private meetingNode: NodeId | null = null;\n private shortestDistance = Infinity;\n\n /**\n * Creates a new BidirectionalDijkstra instance\n * @param graph - The graph to search for shortest paths\n */\n constructor(graph: Graph) {\n this.graph = graph;\n this.forwardSearch = this.initSearchState();\n this.backwardSearch = this.initSearchState();\n }\n\n private initSearchState(): SearchState {\n return {\n distances: new Map(),\n previous: new Map(),\n visited: new Set(),\n frontier: new PriorityQueue<NodeId>(),\n };\n }\n\n /**\n * Find shortest path between source and target nodes\n * @param source - The starting node for the path\n * @param target - The destination node for the path\n * @returns The shortest path result or null if no path exists\n */\n public findShortestPath(source: NodeId, target: NodeId): ShortestPathResult | null {\n // Reset state for new search\n this.reset();\n if (!this.graph.hasNode(source)) {\n throw new Error(`Source node ${String(source)} not found in graph`);\n }\n\n if (!this.graph.hasNode(target)) {\n throw new Error(`Target node ${String(target)} not found in graph`);\n }\n\n // Special case: source equals target\n if (source === target) {\n return {\n distance: 0,\n path: [source],\n predecessor: new Map([[source, null]]),\n };\n }\n\n // Initialize forward search from source\n this.forwardSearch.distances.set(source, 0);\n this.forwardSearch.previous.set(source, null);\n this.forwardSearch.frontier.enqueue(source, 0);\n\n // Initialize backward search from target\n this.backwardSearch.distances.set(target, 0);\n this.backwardSearch.previous.set(target, null);\n this.backwardSearch.frontier.enqueue(target, 0);\n\n // Main search loop\n while (!this.forwardSearch.frontier.isEmpty() || !this.backwardSearch.frontier.isEmpty()) {\n // Alternate between forward and backward search\n // Choose the search with smaller frontier for better performance\n let searchExpanded = false;\n\n if (\n !this.forwardSearch.frontier.isEmpty() &&\n (this.backwardSearch.frontier.isEmpty() ||\n this.forwardSearch.frontier.size() <= this.backwardSearch.frontier.size())\n ) {\n if (this.expandSearch(this.forwardSearch, this.backwardSearch, true)) {\n break;\n }\n\n searchExpanded = true;\n }\n\n if (!this.backwardSearch.frontier.isEmpty() && !searchExpanded) {\n if (this.expandSearch(this.backwardSearch, this.forwardSearch, false)) {\n break;\n }\n }\n\n // Continue until both frontiers are empty or we've found an optimal path\n if (this.forwardSearch.frontier.isEmpty() && this.backwardSearch.frontier.isEmpty()) {\n break;\n }\n }\n\n if (this.meetingNode === null) {\n return null;\n }\n\n return {\n distance: this.shortestDistance,\n path: this.reconstructPath(),\n predecessor: new Map(), // Combined from both searches\n };\n }\n\n private expandSearch(search: SearchState, oppositeSearch: SearchState, isForward: boolean): boolean {\n const current = search.frontier.dequeue();\n if (current === undefined) {\n return false;\n }\n\n const distance = search.distances.get(current);\n if (distance === undefined) {\n return false;\n }\n\n if (search.visited.has(current)) {\n return false;\n }\n\n search.visited.add(current);\n\n // Check if we've met the opposite search\n if (oppositeSearch.distances.has(current)) {\n const totalDistance = distance + (oppositeSearch.distances.get(current) ?? 0);\n if (totalDistance < this.shortestDistance) {\n this.shortestDistance = totalDistance;\n this.meetingNode = current;\n }\n }\n\n // Explore neighbors\n const neighbors = isForward\n ? Array.from(this.graph.neighbors(current))\n : Array.from(this.graph.inNeighbors(current));\n\n for (const neighbor of neighbors) {\n if (search.visited.has(neighbor)) {\n continue;\n }\n\n const edge = isForward ? this.graph.getEdge(current, neighbor) : this.graph.getEdge(neighbor, current);\n\n if (!edge) {\n continue;\n }\n\n const edgeWeight = edge.weight ?? 1;\n if (edgeWeight < 0) {\n throw new Error(\"Bidirectional Dijkstra does not support negative edge weights\");\n }\n\n const newDistance = distance + edgeWeight;\n const currentNeighborDistance = search.distances.get(neighbor);\n\n if (!search.distances.has(neighbor) || newDistance < (currentNeighborDistance ?? Infinity)) {\n search.distances.set(neighbor, newDistance);\n search.previous.set(neighbor, current);\n search.frontier.enqueue(neighbor, newDistance);\n }\n }\n\n return false;\n }\n\n private _getMinDistance(frontier: PriorityQueue<NodeId>): number {\n if (frontier.isEmpty()) {\n return Infinity;\n }\n\n // Since we can't peek at priority directly, we estimate based on the smallest known distance\n const minDist = Infinity;\n\n // For a more accurate implementation, we'd need to track the minimum distance\n // For now, we'll use a simple heuristic\n return minDist;\n }\n\n private reconstructPath(): NodeId[] {\n if (!this.meetingNode) {\n return [];\n }\n\n const path: NodeId[] = [];\n\n // Reconstruct forward path\n let current: NodeId | null = this.meetingNode;\n const forwardPath: NodeId[] = [];\n\n while (current !== null) {\n forwardPath.push(current);\n current = this.forwardSearch.previous.get(current) ?? null;\n }\n\n // Add forward path in reverse order (except meeting node)\n for (let i = forwardPath.length - 1; i > 0; i--) {\n const node = forwardPath[i];\n if (node !== undefined) {\n path.push(node);\n }\n }\n\n // Add meeting node\n path.push(this.meetingNode);\n\n // Reconstruct and add backward path\n current = this.backwardSearch.previous.get(this.meetingNode) ?? null;\n while (current !== null) {\n path.push(current);\n current = this.backwardSearch.previous.get(current) ?? null;\n }\n\n return path;\n }\n\n /**\n * Reset the search state for reuse\n */\n public reset(): void {\n this.forwardSearch = this.initSearchState();\n this.backwardSearch = this.initSearchState();\n this.meetingNode = null;\n this.shortestDistance = Infinity;\n }\n}\n","import type { Graph } from \"../../core/graph.js\";\nimport { PriorityQueue } from \"../../data-structures/priority-queue.js\";\nimport type { DijkstraOptions, NodeId, ShortestPathResult } from \"../../types/index.js\";\nimport { reconstructPath } from \"../../utils/graph-utilities.js\";\nimport { BidirectionalDijkstra } from \"./bidirectional-dijkstra.js\";\n\n/**\n * Dijkstra's algorithm implementation for single-source shortest paths\n *\n * Finds shortest paths from a source node to all other nodes in a weighted graph\n * with non-negative edge weights using a priority queue for efficiency.\n */\n\n/**\n * Find shortest paths from source to all reachable nodes using Dijkstra's algorithm\n * @param graph - The graph to search\n * @param source - The starting node for the search\n * @param options - Algorithm options including optional target for early termination\n * @returns A map of node IDs to their shortest path results\n */\nexport function dijkstra(graph: Graph, source: NodeId, options: DijkstraOptions = {}): Map<NodeId, ShortestPathResult> {\n if (!graph.hasNode(source)) {\n throw new Error(`Source node ${String(source)} not found in graph`);\n }\n\n const distances = new Map<NodeId, number>();\n const previous = new Map<NodeId, NodeId | null>();\n const visited = new Set<NodeId>();\n const pq = new PriorityQueue<NodeId>();\n\n // Initialize distances\n for (const node of Array.from(graph.nodes())) {\n const distance = node.id === source ? 0 : Infinity;\n distances.set(node.id, distance);\n previous.set(node.id, null);\n pq.enqueue(node.id, distance);\n }\n\n while (!pq.isEmpty()) {\n const currentNode = pq.dequeue();\n if (currentNode === undefined) {\n break;\n }\n\n const currentDistance = distances.get(currentNode);\n if (currentDistance === undefined) {\n continue;\n }\n\n // Skip if already visited (can happen with priority queue updates)\n if (visited.has(currentNode)) {\n continue;\n }\n\n visited.add(currentNode);\n\n // Early termination if target reached\n if (options.target && currentNode === options.target) {\n break;\n }\n\n // Skip if this node is unreachable\n if (currentDistance === Infinity) {\n break;\n }\n\n // Check all neighbors\n for (const neighbor of Array.from(graph.neighbors(currentNode))) {\n if (visited.has(neighbor)) {\n continue;\n }\n\n const edge = graph.getEdge(currentNode, neighbor);\n if (!edge) {\n continue;\n }\n\n const edgeWeight = edge.weight ?? 1;\n\n if (edgeWeight < 0) {\n throw new Error(\"Dijkstra's algorithm does not support negative edge weights\");\n }\n\n const tentativeDistance = currentDistance + edgeWeight;\n const neighborDistance = distances.get(neighbor);\n if (neighborDistance === undefined) {\n continue;\n }\n\n // Found a shorter path\n if (tentativeDistance < neighborDistance) {\n distances.set(neighbor, tentativeDistance);\n previous.set(neighbor, currentNode);\n // Add to priority queue with new distance\n pq.enqueue(neighbor, tentativeDistance);\n }\n }\n }\n\n // Build results\n const results = new Map<NodeId, ShortestPathResult>();\n\n for (const [nodeId, distance] of distances) {\n if (distance < Infinity) {\n const path = reconstructPath(nodeId, previous);\n results.set(nodeId, {\n distance,\n path,\n predecessor: new Map(previous),\n });\n }\n }\n\n return results;\n}\n\n/**\n * Find shortest path between two specific nodes using optimized Dijkstra's algorithm\n *\n * Uses bidirectional search by default for improved performance on point-to-point queries.\n * Automatically falls back to standard Dijkstra for very small graphs or when explicitly disabled.\n * @param graph - The graph to search\n * @param source - The starting node for the path\n * @param target - The destination node for the path\n * @param options - Algorithm options including bidirectional search toggle\n * @returns The shortest path result or null if no path exists\n */\nexport function dijkstraPath(\n graph: Graph,\n source: NodeId,\n target: NodeId,\n options: DijkstraOptions = {},\n): ShortestPathResult | null {\n if (!graph.hasNode(source)) {\n throw new Error(`Source node ${String(source)} not found in graph`);\n }\n\n if (!graph.hasNode(target)) {\n throw new Error(`Target node ${String(target)} not found in graph`);\n }\n\n // Special case: source equals target\n if (source === target) {\n return {\n distance: 0,\n path: [source],\n predecessor: new Map([[source, null]]),\n };\n }\n\n // Use bidirectional search by default for point-to-point queries\n // Only disable if explicitly requested or graph is very small (overhead dominates)\n const useBidirectional = options.bidirectional !== false && graph.nodeCount > 10;\n\n if (useBidirectional) {\n const biDijkstra = new BidirectionalDijkstra(graph);\n return biDijkstra.findShortestPath(source, target);\n }\n\n // Fallback to standard dijkstra\n const results = dijkstra(graph, source, { target });\n return results.get(target) ?? null;\n}\n\n/**\n * Single-source shortest paths with early termination optimization\n * @param graph - The graph to search\n * @param source - The starting node for the search\n * @param cutoff - Optional maximum distance to search\n * @returns A map of node IDs to their distances from the source\n */\nexport function singleSourceShortestPath(graph: Graph, source: NodeId, cutoff?: number): Map<NodeId, number> {\n if (!graph.hasNode(source)) {\n throw new Error(`Source node ${String(source)} not found in graph`);\n }\n\n const distances = new Map<NodeId, number>();\n const visited = new Set<NodeId>();\n const pq = new PriorityQueue<NodeId>();\n\n // Initialize distances\n for (const node of Array.from(graph.nodes())) {\n const distance = node.id === source ? 0 : Infinity;\n distances.set(node.id, distance);\n pq.enqueue(node.id, distance);\n }\n\n while (!pq.isEmpty()) {\n const currentNode = pq.dequeue();\n if (currentNode === undefined) {\n break;\n }\n\n const currentDistance = distances.get(currentNode);\n if (currentDistance === undefined) {\n continue;\n }\n\n // Skip if already visited\n if (visited.has(currentNode)) {\n continue;\n }\n\n visited.add(currentNode);\n\n // Skip if unreachable or beyond cutoff\n if (currentDistance === Infinity || (cutoff !== undefined && currentDistance > cutoff)) {\n break;\n }\n\n // Check all neighbors\n for (const neighbor of Array.from(graph.neighbors(currentNode))) {\n if (visited.has(neighbor)) {\n continue;\n }\n\n const edge = graph.getEdge(currentNode, neighbor);\n if (!edge) {\n continue;\n }\n\n const edgeWeight = edge.weight ?? 1;\n const tentativeDistance = currentDistance + edgeWeight;\n const neighborDistance = distances.get(neighbor);\n if (neighborDistance === undefined) {\n continue;\n }\n\n // Found a shorter path\n if (tentativeDistance < neighborDistance) {\n distances.set(neighbor, tentativeDistance);\n pq.enqueue(neighbor, tentativeDistance);\n }\n }\n }\n\n // Filter out unreachable nodes and apply cutoff\n const result = new Map<NodeId, number>();\n\n for (const [nodeId, distance] of distances) {\n if (distance < Infinity && (cutoff === undefined || distance <= cutoff)) {\n result.set(nodeId, distance);\n }\n }\n\n return result;\n}\n\n/**\n * All-pairs shortest paths using repeated Dijkstra\n * Note: For dense graphs, consider Floyd-Warshall algorithm instead\n * @param graph - The graph to compute all-pairs shortest paths for\n * @returns A nested map of source to target to distance\n */\nexport function allPairsShortestPath(graph: Graph): Map<NodeId, Map<NodeId, number>> {\n const results = new Map<NodeId, Map<NodeId, number>>();\n\n for (const node of Array.from(graph.nodes())) {\n const distances = singleSourceShortestPath(graph, node.id);\n results.set(node.id, distances);\n }\n\n return results;\n}\n","import { Graph } from \"../../core/graph.js\";\nimport type { NodeId } from \"../../types/index.js\";\n\nexport interface FloydWarshallResult {\n distances: Map<NodeId, Map<NodeId, number>>;\n predecessors: Map<NodeId, Map<NodeId, NodeId | null>>;\n hasNegativeCycle: boolean;\n}\n\n/**\n * Computes all-pairs shortest paths using the Floyd-Warshall algorithm\n * @param graph - The graph to compute shortest paths for\n * @returns The distances, predecessors, and negative cycle detection result\n */\nexport function floydWarshall(graph: Graph): FloydWarshallResult {\n const nodes = Array.from(graph.nodes()).map((n) => n.id);\n const distances = new Map<NodeId, Map<NodeId, number>>();\n const predecessors = new Map<NodeId, Map<NodeId, NodeId | null>>();\n\n for (const node of nodes) {\n distances.set(node, new Map());\n predecessors.set(node, new Map());\n\n const nodeDistances = distances.get(node);\n const nodePredecessors = predecessors.get(node);\n\n if (!nodeDistances || !nodePredecessors) {\n continue;\n }\n\n for (const other of nodes) {\n if (node === other) {\n nodeDistances.set(other, 0);\n nodePredecessors.set(other, null);\n } else {\n nodeDistances.set(other, Infinity);\n nodePredecessors.set(other, null);\n }\n }\n }\n\n for (const edge of Array.from(graph.edges())) {\n const weight = edge.weight ?? 1;\n const sourceDistances = distances.get(edge.source);\n const sourcePredecessors = predecessors.get(edge.source);\n\n if (sourceDistances && sourcePredecessors) {\n sourceDistances.set(edge.target, weight);\n sourcePredecessors.set(edge.target, edge.source);\n }\n\n if (!graph.isDirected) {\n const targetDistances = distances.get(edge.target);\n const targetPredecessors = predecessors.get(edge.target);\n\n if (targetDistances && targetPredecessors) {\n targetDistances.set(edge.source, weight);\n targetPredecessors.set(edge.source, edge.target);\n }\n }\n }\n\n for (const k of nodes) {\n for (const i of nodes) {\n for (const j of nodes) {\n const distancesI = distances.get(i);\n const distancesK = distances.get(k);\n const predecessorsI = predecessors.get(i);\n const predecessorsK = predecessors.get(k);\n\n if (!distancesI || !distancesK || !predecessorsI || !predecessorsK) {\n continue;\n }\n\n const distIK = distancesI.get(k);\n const distKJ = distancesK.get(j);\n const distIJ = distancesI.get(j);\n\n if (distIK === undefined || distKJ === undefined || distIJ === undefined) {\n continue;\n }\n\n if (distIK + distKJ < distIJ) {\n distancesI.set(j, distIK + distKJ);\n const predKJ = predecessorsK.get(j);\n predecessorsI.set(j, predKJ ?? null);\n }\n }\n }\n }\n\n let hasNegativeCycle = false;\n for (const node of nodes) {\n const nodeDistances = distances.get(node);\n if (!nodeDistances) {\n continue;\n }\n\n const selfDistance = nodeDistances.get(node);\n if (selfDistance !== undefined && selfDistance < 0) {\n hasNegativeCycle = true;\n break;\n }\n }\n\n return {\n distances,\n predecessors,\n hasNegativeCycle,\n };\n}\n\n/**\n * Finds the shortest path between two nodes using Floyd-Warshall\n * @param graph - The graph to search\n * @param source - The starting node for the path\n * @param target - The destination node for the path\n * @returns The path and distance or null if no path exists\n */\nexport function floydWarshallPath(\n graph: Graph,\n source: NodeId,\n target: NodeId,\n): { path: NodeId[]; distance: number } | null {\n const result = floydWarshall(graph);\n\n if (!graph.hasNode(source) || !graph.hasNode(target)) {\n return null;\n }\n\n const sourceDistances = result.distances.get(source);\n if (!sourceDistances) {\n return null;\n }\n\n const distance = sourceDistances.get(target);\n if (distance === undefined || distance === Infinity) {\n return null;\n }\n\n const path: NodeId[] = [];\n let current: NodeId | null = target;\n\n while (current !== null && current !== source) {\n path.unshift(current);\n\n const sourcePredecessors = result.predecessors.get(source);\n if (!sourcePredecessors) {\n return null;\n }\n\n current = sourcePredecessors.get(current) ?? null;\n\n if (path.length > graph.nodeCount) {\n return null;\n }\n }\n\n if (current === source) {\n path.unshift(source);\n return { path, distance };\n }\n\n return null;\n}\n\n/**\n * Computes the transitive closure of a graph using Floyd-Warshall\n * @param graph - The graph to compute transitive closure for\n * @returns A map of each node to the set of nodes reachable from it\n */\nexport function transitiveClosure(graph: Graph): Map<NodeId, Set<NodeId>> {\n const result = floydWarshall(graph);\n const closure = new Map<NodeId, Set<NodeId>>();\n\n for (const [source, distances] of Array.from(result.distances)) {\n const reachable = new Set<NodeId>();\n for (const [target, distance] of Array.from(distances)) {\n if (distance < Infinity) {\n reachable.add(target);\n }\n }\n closure.set(source, reachable);\n }\n\n return closure;\n}\n","import type { Graph } from \"../../core/graph.js\";\nimport { PriorityQueue } from \"../../data-structures/priority-queue.js\";\nimport { CSRGraph } from \"../../optimized/csr-graph.js\";\nimport { DirectionOptimizedBFS } from \"../../optimized/direction-optimized-bfs.js\";\nimport { toCSRGraph } from \"../../optimized/graph-adapter.js\";\nimport type { NodeId } from \"../../types/index.js\";\n\n/**\n * Threshold for switching to CSR-optimized implementations.\n * Based on benchmarks showing CSR benefits at this scale due to\n * improved cache locality and reduced memory allocation overhead.\n */\nconst LARGE_GRAPH_THRESHOLD = 10000;\n\n/**\n * BFS that tracks shortest path counts (for betweenness centrality)\n *\n * This variant of BFS computes:\n * - Shortest distances from source to all reachable nodes\n * - All predecessors on shortest paths\n * - Number of shortest paths (sigma)\n * - Stack of nodes in reverse BFS order\n * @param graph - The input graph to traverse\n * @param source - The source node to start BFS from\n * @param options - Configuration options\n * @param options.optimized - Whether to use CSR-optimized implementation for large graphs\n * @returns Object containing distances, predecessors, path counts (sigma), and traversal stack\n */\nexport function bfsWithPathCounting(\n graph: Graph,\n source: NodeId,\n options: { optimized?: boolean } = {},\n): {\n distances: Map<NodeId, number>;\n predecessors: Map<NodeId, NodeId[]>;\n sigma: Map<NodeId, number>;\n stack: NodeId[];\n} {\n const useOptimized = options.optimized ?? false;\n\n // Use CSR format for large graphs\n if (useOptimized && graph.nodeCount > LARGE_GRAPH_THRESHOLD) {\n const csrGraph = toCSRGraph(graph);\n return bfsWithPathCountingCSR(csrGraph, source);\n }\n\n const distances = new Map<NodeId, number>();\n const predecessors = new Map<NodeId, NodeId[]>();\n const sigma = new Map<NodeId, number>();\n const stack: NodeId[] = [];\n const queue: NodeId[] = [];\n\n // Initialize\n distances.set(source, 0);\n sigma.set(source, 1);\n queue.push(source);\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (current === undefined) {\n continue;\n }\n\n stack.push(current);\n\n const currentDistance = distances.get(current) ?? 0;\n const currentSigma = sigma.get(current) ?? 0;\n\n // Process neighbors\n const neighbors = graph.neighbors(current);\n for (const neighbor of neighbors) {\n // First time visiting this neighbor\n if (!distances.has(neighbor)) {\n distances.set(neighbor, currentDistance + 1);\n queue.push(neighbor);\n }\n\n // Found a shortest path to neighbor\n if (distances.get(neighbor) === currentDistance + 1) {\n const neighborSigma = sigma.get(neighbor) ?? 0;\n sigma.set(neighbor, neighborSigma + currentSigma);\n\n const preds = predecessors.get(neighbor) ?? [];\n preds.push(current);\n predecessors.set(neighbor, preds);\n }\n }\n }\n\n return {\n distances,\n predecessors,\n sigma,\n stack,\n };\n}\n\n/**\n * BFS that only returns distances (for closeness centrality)\n *\n * Optimized variant that skips predecessor tracking\n * @param graph - The input graph to traverse\n * @param source - The source node to start BFS from\n * @param cutoff - Maximum distance to explore (optional)\n * @param options - Configuration options\n * @param options.optimized - Whether to use CSR-optimized implementation for large graphs\n * @returns Map of node IDs to their shortest distances from the source\n */\nexport function bfsDistancesOnly(\n graph: Graph,\n source: NodeId,\n cutoff?: number,\n options: { optimized?: boolean } = {},\n): Map<NodeId, number> {\n const useOptimized = options.optimized ?? false;\n\n // Use CSR format for large graphs\n if (useOptimized && graph.nodeCount > LARGE_GRAPH_THRESHOLD) {\n const csrGraph = toCSRGraph(graph);\n return bfsDistancesOnlyCSR(csrGraph, source, cutoff);\n }\n\n const distances = new Map<NodeId, number>();\n const queue: NodeId[] = [];\n\n distances.set(source, 0);\n queue.push(source);\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (current === undefined) {\n continue;\n }\n\n const currentDistance = distances.get(current) ?? 0;\n\n // Stop if we've reached the cutoff distance\n if (cutoff !== undefined && currentDistance >= cutoff) {\n continue;\n }\n\n const neighbors = graph.neighbors(current);\n for (const neighbor of neighbors) {\n if (!distances.has(neighbor)) {\n distances.set(neighbor, currentDistance + 1);\n queue.push(neighbor);\n }\n }\n }\n\n return distances;\n}\n\n/**\n * BFS for bipartite checking with partition sets\n *\n * Returns whether the graph is bipartite and the two partitions if it is\n * @param graph - The input graph to check for bipartiteness\n * @returns Object with bipartite status and optional partition sets\n */\nexport function bfsColoringWithPartitions(graph: Graph): {\n isBipartite: boolean;\n partitions?: [Set<NodeId>, Set<NodeId>];\n} {\n const colors = new Map<NodeId, number>();\n const partitionA = new Set<NodeId>();\n const partitionB = new Set<NodeId>();\n\n // Handle disconnected components\n for (const node of graph.nodes()) {\n if (!colors.has(node.id)) {\n const queue: NodeId[] = [node.id];\n colors.set(node.id, 0);\n partitionA.add(node.id);\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (current === undefined) {\n continue;\n }\n\n const currentColor = colors.get(current) ?? 0;\n const nextColor = 1 - currentColor;\n\n for (const neighbor of graph.neighbors(current)) {\n if (!colors.has(neighbor)) {\n colors.set(neighbor, nextColor);\n queue.push(neighbor);\n\n if (nextColor === 0) {\n partitionA.add(neighbor);\n } else {\n partitionB.add(neighbor);\n }\n } else if (colors.get(neighbor) === currentColor) {\n // Same color as current node - not bipartite\n return { isBipartite: false };\n }\n }\n }\n }\n }\n\n return {\n isBipartite: true,\n partitions: [partitionA, partitionB],\n };\n}\n\n/**\n * BFS for finding augmenting paths (for flow algorithms)\n *\n * Finds a path from source to sink in a residual graph with positive capacity\n * @param residualGraph - Map representing the residual graph with capacities\n * @param source - The source node ID\n * @param sink - The sink node ID\n * @returns Object with path and capacity, or null if no path exists\n */\nexport function bfsAugmentingPath(\n residualGraph: Map<string, Map<string, number>>,\n source: string,\n sink: string,\n): {\n path: string[];\n pathCapacity: number;\n} | null {\n const parent = new Map<string, string | null>();\n const queue: string[] = [];\n\n parent.set(source, null);\n queue.push(source);\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (current === undefined) {\n continue;\n }\n\n if (current === sink) {\n // Reconstruct path\n const path: string[] = [];\n let node: string | null = sink;\n let pathCapacity = Infinity;\n\n while (node !== null) {\n path.unshift(node);\n const parentNode = parent.get(node);\n\n if (parentNode !== null && parentNode !== undefined) {\n const capacity = residualGraph.get(parentNode)?.get(node) ?? 0;\n pathCapacity = Math.min(pathCapacity, capacity);\n }\n\n node = parentNode ?? null;\n }\n\n return { path, pathCapacity };\n }\n\n const neighbors = residualGraph.get(current);\n if (neighbors) {\n for (const [neighbor, capacity] of neighbors) {\n if (!parent.has(neighbor) && capacity > 0) {\n parent.set(neighbor, current);\n queue.push(neighbor);\n }\n }\n }\n }\n\n return null;\n}\n\n/**\n * BFS for weighted graphs using priority queue (simplified Dijkstra)\n *\n * Returns distances from source using edge weights\n * @param graph - The input weighted graph to traverse\n * @param source - The source node to start BFS from\n * @param cutoff - Maximum distance to explore (optional)\n * @param options - Configuration options\n * @param options.optimized - Whether to use CSR-optimized implementation for large graphs\n * @returns Map of node IDs to their shortest weighted distances from the source\n */\nexport function bfsWeightedDistances(\n graph: Graph,\n source: NodeId,\n cutoff?: number,\n options: { optimized?: boolean } = {},\n): Map<NodeId, number> {\n const useOptimized = options.optimized ?? false;\n\n // Use CSR format for large graphs\n if (useOptimized && graph.nodeCount > LARGE_GRAPH_THRESHOLD) {\n const csrGraph = toCSRGraph(graph);\n return bfsWeightedDistancesCSR(csrGraph, source, cutoff);\n }\n\n const distances = new Map<NodeId, number>();\n const visited = new Set<NodeId>();\n\n // Use efficient priority queue instead of array-based queue\n const queue = new PriorityQueue<NodeId>();\n\n distances.set(source, 0);\n queue.enqueue(source, 0);\n\n while (!queue.isEmpty()) {\n const current = queue.dequeue();\n if (current === undefined) {\n continue;\n }\n\n const currentDist = distances.get(current) ?? 0;\n\n if (visited.has(current)) {\n continue;\n }\n\n visited.add(current);\n\n // Stop if we've reached the cutoff distance\n if (cutoff !== undefined && currentDist >= cutoff) {\n continue;\n }\n\n for (const neighbor of graph.neighbors(current)) {\n if (!visited.has(neighbor)) {\n const edge = graph.getEdge(current, neighbor);\n const weight = edge?.weight ?? 1;\n const newDistance = currentDist + weight;\n\n const oldDistance = distances.get(neighbor);\n if (oldDistance === undefined || newDistance < oldDistance) {\n distances.set(neighbor, newDistance);\n queue.enqueue(neighbor, newDistance);\n }\n }\n }\n }\n\n return distances;\n}\n\n/**\n * CSR-optimized version of bfsWithPathCounting\n * @param graph - The CSR graph representation\n * @param source - The source node to start BFS from\n * @returns Object containing distances, predecessors, path counts (sigma), and traversal stack\n */\nfunction bfsWithPathCountingCSR(\n graph: CSRGraph,\n source: NodeId,\n): {\n distances: Map<NodeId, number>;\n predecessors: Map<NodeId, NodeId[]>;\n sigma: Map<NodeId, number>;\n stack: NodeId[];\n} {\n const distances = new Map<NodeId, number>();\n const predecessors = new Map<NodeId, NodeId[]>();\n const sigma = new Map<NodeId, number>();\n const stack: NodeId[] = [];\n const queue: NodeId[] = [];\n\n // Initialize\n distances.set(source, 0);\n sigma.set(source, 1);\n queue.push(source);\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (current === undefined) {\n continue;\n }\n\n stack.push(current);\n\n const currentDistance = distances.get(current) ?? 0;\n const currentSigma = sigma.get(current) ?? 0;\n\n // Process neighbors using CSR iteration\n for (const neighbor of graph.neighbors(current)) {\n // First time visiting this neighbor\n if (!distances.has(neighbor)) {\n distances.set(neighbor, currentDistance + 1);\n queue.push(neighbor);\n }\n\n // Found a shortest path to neighbor\n if (distances.get(neighbor) === currentDistance + 1) {\n const neighborSigma = sigma.get(neighbor) ?? 0;\n sigma.set(neighbor, neighborSigma + currentSigma);\n\n const preds = predecessors.get(neighbor) ?? [];\n preds.push(current);\n predecessors.set(neighbor, preds);\n }\n }\n }\n\n return {\n distances,\n predecessors,\n sigma,\n stack,\n };\n}\n\n/**\n * CSR-optimized version of bfsDistancesOnly\n * @param graph - The CSR graph representation\n * @param source - The source node to start BFS from\n * @param cutoff - Maximum distance to explore (optional)\n * @returns Map of node IDs to their shortest distances from the source\n */\nfunction bfsDistancesOnlyCSR(graph: CSRGraph, source: NodeId, cutoff?: number): Map<NodeId, number> {\n // Use Direction-Optimized BFS for best performance\n if (graph.nodeCount() > LARGE_GRAPH_THRESHOLD) {\n const dobfs = new DirectionOptimizedBFS(graph);\n const result = dobfs.search(source);\n\n // Filter by cutoff if specified\n if (cutoff !== undefined) {\n const filtered = new Map<NodeId, number>();\n for (const [nodeId, distance] of result.distances) {\n if (distance <= cutoff) {\n filtered.set(nodeId, distance);\n }\n }\n return filtered;\n }\n\n return result.distances;\n }\n\n // Fallback to standard BFS on CSR\n const distances = new Map<NodeId, number>();\n const queue: NodeId[] = [];\n\n distances.set(source, 0);\n queue.push(source);\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (current === undefined) {\n continue;\n }\n\n const currentDistance = distances.get(current) ?? 0;\n\n // Stop if we've reached the cutoff distance\n if (cutoff !== undefined && currentDistance >= cutoff) {\n continue;\n }\n\n for (const neighbor of graph.neighbors(current)) {\n if (!distances.has(neighbor)) {\n distances.set(neighbor, currentDistance + 1);\n queue.push(neighbor);\n }\n }\n }\n\n return distances;\n}\n\n/**\n * CSR-optimized version of bfsWeightedDistances\n * @param graph - The CSR graph representation\n * @param source - The source node to start BFS from\n * @param cutoff - Maximum distance to explore (optional)\n * @returns Map of node IDs to their shortest weighted distances from the source\n */\nfunction bfsWeightedDistancesCSR(graph: CSRGraph, source: NodeId, cutoff?: number): Map<NodeId, number> {\n const distances = new Map<NodeId, number>();\n const visited = new Set<NodeId>();\n\n // Use efficient priority queue\n const queue = new PriorityQueue<NodeId>();\n\n distances.set(source, 0);\n queue.enqueue(source, 0);\n\n while (!queue.isEmpty()) {\n const current = queue.dequeue();\n if (current === undefined) {\n continue;\n }\n\n const currentDist = distances.get(current) ?? 0;\n\n if (visited.has(current)) {\n continue;\n }\n\n visited.add(current);\n\n // Stop if we've reached the cutoff distance\n if (cutoff !== undefined && currentDist >= cutoff) {\n continue;\n }\n\n for (const neighbor of graph.neighbors(current)) {\n if (!visited.has(neighbor)) {\n // Use actual edge weight from CSR graph, default to 1\n const weight = graph.getEdgeWeight(current, neighbor) ?? 1;\n const newDistance = currentDist + weight;\n\n const oldDistance = distances.get(neighbor);\n if (oldDistance === undefined || newDistance < oldDistance) {\n distances.set(neighbor, newDistance);\n queue.enqueue(neighbor, newDistance);\n }\n }\n }\n }\n\n return distances;\n}\n","import type { Graph } from \"../../core/graph.js\";\nimport type { NodeId } from \"../../types/index.js\";\nimport { bfsWithPathCounting } from \"../traversal/bfs-variants.js\";\n\n/**\n * Betweenness centrality implementation using Brandes' algorithm\n *\n * Measures the extent to which a node lies on paths between other nodes.\n * Uses the fast O(VE) algorithm by Ulrik Brandes.\n */\n\n/**\n * Betweenness centrality options.\n *\n * Every member is `readonly` and carries `| undefined`: the GPU package compiles this declaration\n * a second time under `exactOptionalPropertyTypes`, where `sources?: readonly number[]` and\n * `sources?: readonly number[] | undefined` are different types (plan decision PD-6).\n */\nexport interface BetweennessCentralityOptions {\n /** Whether to normalize the centrality values (default: false) */\n readonly normalized?: boolean | undefined;\n /** Whether to use endpoints in path counting (default: false) */\n readonly endpoints?: boolean | undefined;\n /** Whether to use optimized BFS implementation for large graphs */\n readonly optimized?: boolean | undefined;\n /**\n * Sampled betweenness: the source NODE INDICES to run from. Indices are meaningful only against\n * a `GraphSnapshot`, so the legacy `Graph`-taking entry points below THROW when this is set.\n */\n readonly sources?: readonly number[] | undefined;\n /** Sampled betweenness: how many sources to draw when `sources` is not given. */\n readonly k?: number | undefined;\n}\n\n/**\n * Refuse the index-space options on a path that has no index space.\n *\n * Ignoring them would be the expensive silence: a caller asking for a 128-source sample would get\n * an exact all-sources run, correct and a thousand times too slow, with no signal at all.\n * @param options - The caller's options\n * @param fn - The entry point's name, for the message\n */\nfunction rejectIndexOptions(options: BetweennessCentralityOptions, fn: string): void {\n if (options.sources !== undefined || options.k !== undefined) {\n throw new Error(\n `${fn}: 'sources' and 'k' are node INDICES and are meaningful only against a GraphSnapshot; ` +\n \"call accelerated(accelerator).betweennessCentrality(snapshot, options) instead\",\n );\n }\n}\n\n/**\n * Result of Brandes algorithm computation for a single source\n */\ninterface BrandesResult {\n stack: NodeId[];\n predecessors: Map<NodeId, NodeId[]>;\n sigma: Map<NodeId, number>;\n distance: Map<NodeId, number>;\n}\n\n/**\n * Run single-source shortest path computation using BFS\n * @param graph - The input graph to analyze\n * @param source - The source node for shortest path computation\n * @param optimized - Whether to use optimized BFS implementation\n * @returns The BFS result containing stack, predecessors, sigma, and distances\n */\nfunction brandesSingleSource(graph: Graph, source: NodeId, optimized?: boolean): BrandesResult {\n const result = bfsWithPathCounting(graph, source, optimized !== undefined ? { optimized } : {});\n\n return {\n stack: result.stack,\n predecessors: result.predecessors,\n sigma: result.sigma,\n distance: result.distances,\n };\n}\n\n/**\n * Accumulate betweenness contributions from a single source\n * @param result - The BFS result from brandesSingleSource\n * @param source - The source node used in BFS\n * @param centrality - The centrality map to update\n * @param options - Algorithm configuration options\n */\nfunction accumulateBetweenness(\n result: BrandesResult,\n source: NodeId,\n centrality: Record<string, number>,\n options: BetweennessCentralityOptions,\n): void {\n const { stack, predecessors, sigma } = result;\n const delta = new Map<NodeId, number>();\n\n // Initialize delta\n for (const node of stack) {\n delta.set(node, 0);\n }\n\n // Accumulation - back-propagation of dependencies\n // Process nodes in reverse BFS order\n for (let i = stack.length - 1; i >= 0; i--) {\n const w = stack[i];\n if (!w) {\n continue;\n }\n\n const wPreds = predecessors.get(w) ?? [];\n const wSigma = sigma.get(w) ?? 0;\n const wDelta = delta.get(w) ?? 0;\n\n for (const v of wPreds) {\n const vSigma = sigma.get(v) ?? 0;\n const vDelta = delta.get(v) ?? 0;\n\n if (vSigma > 0 && wSigma > 0) {\n let contribution = (vSigma / wSigma) * (1 + wDelta);\n\n // Apply endpoints option: when false, exclude endpoint contributions\n if (!options.endpoints) {\n // For standard betweenness, don't count paths that only involve endpoints\n const isTargetEndpoint = wPreds.length === 0 && w !== source;\n if (isTargetEndpoint) {\n contribution = 0; // Exclude endpoint contributions\n }\n }\n\n delta.set(v, vDelta + contribution);\n }\n }\n\n if (w !== source) {\n const currentCentrality = centrality[String(w)] ?? 0;\n centrality[String(w)] = currentCentrality + wDelta;\n }\n }\n}\n\n/**\n * Accumulate edge betweenness contributions from a single source\n * @param result - The BFS result from brandesSingleSource\n * @param source - The source node used in BFS\n * @param edgeCentrality - The edge centrality map to update\n * @param options - Algorithm configuration options\n */\nfunction accumulateEdgeBetweenness(\n result: BrandesResult,\n source: NodeId,\n edgeCentrality: Map<string, number>,\n options: BetweennessCentralityOptions,\n): void {\n const { stack, predecessors, sigma } = result;\n const delta = new Map<NodeId, number>();\n\n // Initialize delta\n for (const node of stack) {\n delta.set(node, 0);\n }\n\n // Accumulation for edges\n // Process nodes in reverse BFS order\n for (let i = stack.length - 1; i >= 0; i--) {\n const w = stack[i];\n if (!w) {\n continue;\n }\n\n const wPreds = predecessors.get(w) ?? [];\n const wSigma = sigma.get(w) ?? 0;\n const wDelta = delta.get(w) ?? 0;\n\n for (const v of wPreds) {\n const vSigma = sigma.get(v) ?? 0;\n\n if (vSigma > 0 && wSigma > 0) {\n let edgeContribution = (vSigma / wSigma) * (1 + wDelta);\n\n // Apply endpoints option for edge betweenness\n if (!options.endpoints) {\n const isTargetEndpoint = wPreds.length === 0 && w !== source;\n if (isTargetEndpoint) {\n edgeContribution = 0; // Exclude endpoint contributions\n }\n }\n\n // Update edge centrality\n const edgeKey = `${String(v)}-${String(w)}`;\n const currentEdgeCentrality = edgeCentrality.get(edgeKey) ?? 0;\n edgeCentrality.set(edgeKey, currentEdgeCentrality + edgeContribution);\n\n // Update node delta\n const vDelta = delta.get(v) ?? 0;\n delta.set(v, vDelta + edgeContribution);\n }\n }\n }\n}\n\n/**\n * Apply normalization to centrality values\n * @param centrality - The centrality map to normalize in place\n * @param nodeCount - Total number of nodes in the graph\n * @param isDirected - Whether the graph is directed\n */\nfunction normalizeCentrality(centrality: Record<string, number>, nodeCount: number, isDirected: boolean): void {\n const n = nodeCount;\n const normalizationFactor = isDirected ? (n - 1) * (n - 2) : ((n - 1) * (n - 2)) / 2;\n\n if (normalizationFactor > 0) {\n for (const key in centrality) {\n const value = centrality[key];\n if (value !== undefined) {\n centrality[key] = value / normalizationFactor;\n }\n }\n }\n}\n\n/**\n * Calculate betweenness centrality for all nodes using Brandes' algorithm\n * @param graph - The input graph to analyze\n * @param options - Algorithm configuration options\n * @returns Centrality scores for each node keyed by node ID\n */\nexport function betweennessCentrality(\n graph: Graph,\n options: BetweennessCentralityOptions = {},\n): Record<string, number> {\n rejectIndexOptions(options, \"betweennessCentrality\");\n const nodes = Array.from(graph.nodes()).map((node) => node.id);\n const centrality: Record<string, number> = {};\n\n // Initialize centrality scores\n for (const nodeId of nodes) {\n centrality[String(nodeId)] = 0;\n }\n\n // Brandes' algorithm - run from each source\n for (const source of nodes) {\n const result = brandesSingleSource(graph, source, options.optimized);\n accumulateBetweenness(result, source, centrality, options);\n }\n\n // For undirected graphs, divide by 2 (each shortest path is counted twice)\n if (!graph.isDirected) {\n for (const nodeId of nodes) {\n const key = String(nodeId);\n const value = centrality[key];\n if (value !== undefined) {\n centrality[key] = value / 2;\n }\n }\n }\n\n // Normalization\n if (options.normalized) {\n normalizeCentrality(centrality, nodes.length, graph.isDirected);\n }\n\n return centrality;\n}\n\n/**\n * Calculate betweenness centrality for a specific node\n * @param graph - The input graph to analyze\n * @param targetNode - The node to calculate centrality for\n * @param options - Algorithm configuration options\n * @returns The betweenness centrality score for the target node\n */\nexport function nodeBetweennessCentrality(\n graph: Graph,\n targetNode: NodeId,\n options: BetweennessCentralityOptions = {},\n): number {\n rejectIndexOptions(options, \"nodeBetweennessCentrality\");\n if (!graph.hasNode(targetNode)) {\n throw new Error(`Node ${String(targetNode)} not found in graph`);\n }\n\n const allCentralities = betweennessCentrality(graph, options);\n return allCentralities[String(targetNode)] ?? 0;\n}\n\n/**\n * Calculate edge betweenness centrality\n * @param graph - The input graph to analyze\n * @param options - Algorithm configuration options\n * @returns Edge centrality scores keyed by edge string representation\n */\nexport function edgeBetweennessCentrality(\n graph: Graph,\n options: BetweennessCentralityOptions = {},\n): Map<string, number> {\n rejectIndexOptions(options, \"edgeBetweennessCentrality\");\n const nodes = Array.from(graph.nodes()).map((node) => node.id);\n const edgeCentrality = new Map<string, number>();\n\n // Initialize edge centrality scores\n for (const edge of Array.from(graph.edges())) {\n const edgeKey = `${String(edge.source)}-${String(edge.target)}`;\n edgeCentrality.set(edgeKey, 0);\n }\n\n // Modified Brandes' algorithm for edge betweenness\n for (const source of nodes) {\n const result = brandesSingleSource(graph, source, options.optimized);\n accumulateEdgeBetweenness(result, source, edgeCentrality, options);\n }\n\n // For undirected graphs, divide by 2 (each shortest path is counted twice)\n if (!graph.isDirected) {\n for (const [edgeKey, centrality] of Array.from(edgeCentrality)) {\n edgeCentrality.set(edgeKey, centrality / 2);\n }\n }\n\n // Normalization for edges\n if (options.normalized) {\n const n = nodes.length;\n const normalizationFactor = graph.isDirected ? (n - 1) * (n - 2) : ((n - 1) * (n - 2)) / 2;\n\n if (normalizationFactor > 0) {\n for (const [edgeKey, centrality] of Array.from(edgeCentrality)) {\n edgeCentrality.set(edgeKey, centrality / normalizationFactor);\n }\n }\n }\n\n return edgeCentrality;\n}\n","import type { Graph } from \"../../core/graph.js\";\nimport type { NodeId } from \"../../types/index.js\";\nimport { bfsDistancesOnly, bfsWeightedDistances } from \"../traversal/bfs-variants.js\";\n\n/**\n * Closeness centrality implementation\n *\n * Measures how close a node is to all other nodes in the graph.\n * Uses BFS to compute shortest path distances efficiently.\n */\n\n/**\n * Closeness centrality options\n */\nexport interface ClosenessCentralityOptions {\n /**\n * Whether to normalize the centrality values (default: false)\n */\n normalized?: boolean;\n /**\n * Use harmonic mean instead of reciprocal of sum (default: false)\n * Better for disconnected graphs\n */\n harmonic?: boolean;\n /**\n * Consider only nodes within this distance (default: undefined = all nodes)\n */\n cutoff?: number;\n /**\n * Whether to use optimized BFS implementation for large graphs\n */\n optimized?: boolean;\n}\n\n/**\n * Calculate closeness centrality from distances\n * @param distances - Map of node IDs to their distances from source\n * @param sourceNode - The source node for distance calculations\n * @param totalNodes - Total number of nodes in the graph\n * @param options - Algorithm configuration options\n * @returns The closeness centrality score for the source node\n */\nfunction calculateClosenessFromDistances(\n distances: Map<NodeId, number>,\n sourceNode: NodeId,\n totalNodes: number,\n options: ClosenessCentralityOptions,\n): number {\n if (distances.size <= 1) {\n return 0; // No other nodes reachable\n }\n\n let centrality = 0;\n\n if (options.harmonic) {\n // Harmonic centrality: sum of reciprocals of distances\n for (const [targetNode, distance] of distances) {\n if (targetNode !== sourceNode && distance > 0 && distance < Infinity) {\n centrality += 1 / distance;\n }\n }\n\n // Normalization for harmonic centrality\n if (options.normalized && totalNodes > 1) {\n centrality = centrality / (totalNodes - 1);\n }\n } else {\n // Standard closeness: reciprocal of sum of distances\n let totalDistance = 0;\n let reachableNodes = 0;\n\n for (const [targetNode, distance] of distances) {\n if (targetNode !== sourceNode && distance < Infinity) {\n totalDistance += distance;\n reachableNodes++;\n }\n }\n\n if (totalDistance > 0) {\n centrality = 1 / totalDistance;\n\n // Wasserman and Faust normalization for disconnected graphs\n if (options.normalized && totalNodes > 1) {\n centrality = (centrality * reachableNodes) / (totalNodes - 1);\n }\n }\n }\n\n return centrality;\n}\n\n/**\n * Calculate closeness centrality for all nodes in the graph\n *\n * Closeness centrality measures how close a node is to all other nodes\n * in the graph. It is the reciprocal of the sum of the shortest path\n * distances to all other reachable nodes.\n * @param graph - The input graph\n * @param options - Algorithm options\n * @returns Centrality scores for each node\n * @example\n * ```typescript\n * const graph = new Graph();\n * graph.addEdge(\"A\", \"B\");\n * graph.addEdge(\"B\", \"C\");\n *\n * const centrality = closenessCentrality(graph);\n * // { A: 0.5, B: 1.0, C: 0.5 }\n * ```\n *\n * Time Complexity: O(V * (V + E)) for unweighted graphs\n * Space Complexity: O(V)\n */\nexport function closenessCentrality(graph: Graph, options: ClosenessCentralityOptions = {}): Record<string, number> {\n const nodes = Array.from(graph.nodes()).map((node) => node.id);\n const centrality: Record<string, number> = {};\n\n for (const sourceNode of nodes) {\n centrality[String(sourceNode)] = nodeClosenessCentrality(graph, sourceNode, options);\n }\n\n return centrality;\n}\n\n/**\n * Calculate closeness centrality for a specific node\n * @param graph - The input graph to analyze\n * @param node - The node to calculate centrality for\n * @param options - Algorithm configuration options\n * @returns The closeness centrality score for the node\n */\nexport function nodeClosenessCentrality(graph: Graph, node: NodeId, options: ClosenessCentralityOptions = {}): number {\n if (!graph.hasNode(node)) {\n throw new Error(`Node ${String(node)} not found in graph`);\n }\n\n // Use optimized BFS variant for unweighted graphs\n const distances = bfsDistancesOnly(\n graph,\n node,\n options.cutoff,\n options.optimized !== undefined ? { optimized: options.optimized } : {},\n );\n const totalNodes = graph.nodeCount;\n\n return calculateClosenessFromDistances(distances, node, totalNodes, options);\n}\n\n/**\n * Calculate weighted closeness centrality using Dijkstra's algorithm\n * @param graph - The input graph to analyze\n * @param options - Algorithm configuration options\n * @returns Centrality scores for each node keyed by node ID\n */\nexport function weightedClosenessCentrality(\n graph: Graph,\n options: ClosenessCentralityOptions = {},\n): Record<string, number> {\n const nodes = Array.from(graph.nodes()).map((node) => node.id);\n const centrality: Record<string, number> = {};\n\n for (const sourceNode of nodes) {\n centrality[String(sourceNode)] = nodeWeightedClosenessCentrality(graph, sourceNode, options);\n }\n\n return centrality;\n}\n\n/**\n * Calculate weighted closeness centrality for a specific node using Dijkstra\n * @param graph - The input graph to analyze\n * @param node - The node to calculate centrality for\n * @param options - Algorithm configuration options\n * @returns The weighted closeness centrality score for the node\n */\nexport function nodeWeightedClosenessCentrality(\n graph: Graph,\n node: NodeId,\n options: ClosenessCentralityOptions = {},\n): number {\n if (!graph.hasNode(node)) {\n throw new Error(`Node ${String(node)} not found in graph`);\n }\n\n // Use optimized weighted BFS variant (simplified Dijkstra)\n const distances = bfsWeightedDistances(\n graph,\n node,\n options.cutoff,\n options.optimized !== undefined ? { optimized: options.optimized } : {},\n );\n const totalNodes = graph.nodeCount;\n\n return calculateClosenessFromDistances(distances, node, totalNodes, options);\n}\n","import type { Graph } from \"../../core/graph.js\";\nimport type { CentralityOptions, CentralityResult } from \"../../types/index.js\";\n\n/**\n * Degree centrality implementation\n *\n * Measures the importance of a node based on the number of connections it has.\n * The most basic centrality measure that simply counts incident edges.\n */\n\n/**\n * Calculate degree centrality for all nodes in the graph\n * @param graph - The input graph to analyze\n * @param options - Algorithm configuration options\n * @returns Centrality scores for each node keyed by node ID\n */\nexport function degreeCentrality(graph: Graph, options: CentralityOptions = {}): CentralityResult {\n const centrality: CentralityResult = {};\n const { nodeCount } = graph;\n\n // Calculate normalization factor (same for both directed and undirected graphs)\n const maxPossibleDegree = nodeCount - 1;\n\n for (const node of graph.nodes()) {\n let degree: number;\n\n if (graph.isDirected && options.mode) {\n // For directed graphs, calculate specific degree type\n switch (options.mode) {\n case \"in\": {\n degree = graph.inDegree(node.id);\n break;\n }\n case \"out\": {\n degree = graph.outDegree(node.id);\n break;\n }\n case \"total\": {\n degree = graph.degree(node.id);\n break;\n }\n default: {\n degree = graph.degree(node.id);\n }\n }\n } else {\n // For undirected graphs or default case\n degree = graph.degree(node.id);\n }\n\n // Apply normalization if requested\n const normalizedDegree = options.normalized && maxPossibleDegree > 0 ? degree / maxPossibleDegree : degree;\n\n centrality[node.id.toString()] = normalizedDegree;\n }\n\n return centrality;\n}\n\n/**\n * Calculate degree centrality for a specific node\n * @param graph - The input graph to analyze\n * @param nodeId - The node to calculate centrality for\n * @param options - Algorithm configuration options\n * @returns The degree centrality score for the node\n */\nexport function nodeDegreeCentrality(graph: Graph, nodeId: string | number, options: CentralityOptions = {}): number {\n if (!graph.hasNode(nodeId)) {\n throw new Error(`Node ${String(nodeId)} not found in graph`);\n }\n\n const { nodeCount } = graph;\n let degree: number;\n\n if (graph.isDirected && options.mode) {\n switch (options.mode) {\n case \"in\": {\n degree = graph.inDegree(nodeId);\n break;\n }\n case \"out\": {\n degree = graph.outDegree(nodeId);\n break;\n }\n case \"total\": {\n degree = graph.degree(nodeId);\n break;\n }\n default: {\n degree = graph.degree(nodeId);\n }\n }\n } else {\n degree = graph.degree(nodeId);\n }\n\n // Apply normalization if requested\n const maxPossibleDegree = nodeCount - 1;\n\n return options.normalized && maxPossibleDegree > 0 ? degree / maxPossibleDegree : degree;\n}\n","import type { Graph } from \"../../core/graph.js\";\nimport { PriorityQueue } from \"../../data-structures/priority-queue.js\";\nimport type { NodeId } from \"../../types/index.js\";\n\n/**\n * Delta-based PageRank implementation for faster convergence\n *\n * This algorithm tracks changes (deltas) between iterations and only processes\n * nodes with significant changes, dramatically reducing computation for graphs\n * where only some nodes are actively changing their PageRank values.\n *\n * Key optimizations:\n * - Only active nodes (with significant deltas) are processed\n * - Early termination for converged vertices\n * - Priority queue processing for high-impact updates\n * - Adaptive convergence detection per vertex\n *\n * Expected speedup: 10-100x for incremental updates on large graphs\n */\n\nexport interface DeltaPageRankOptions {\n /**\n * Damping factor (probability of following a link) (default: 0.85)\n */\n dampingFactor?: number;\n /**\n * Convergence tolerance (default: 1e-6)\n */\n tolerance?: number;\n /**\n * Maximum number of iterations (default: 100)\n */\n maxIterations?: number;\n /**\n * Minimum delta to keep vertex active (default: tolerance / 10)\n */\n deltaThreshold?: number;\n /**\n * Personalization vector for Personalized PageRank (default: null)\n */\n personalization?: Map<NodeId, number>;\n /**\n * Weight attribute for weighted PageRank (default: null = unweighted)\n */\n weight?: string;\n}\n\n/**\n * Delta-based PageRank class that tracks changes between iterations\n * and only processes nodes with significant changes for improved performance.\n */\nexport class DeltaPageRank {\n private graph: Graph;\n private scores: Map<NodeId, number>;\n private deltas: Map<NodeId, number>;\n private activeNodes: Set<NodeId>;\n private outDegrees: Map<NodeId, number>;\n private outWeights: Map<NodeId, number>;\n private danglingNodes: Set<NodeId>;\n private nodeCount: number;\n\n /**\n * Creates a new DeltaPageRank instance for the given graph.\n * @param graph - The directed graph to compute PageRank on\n */\n constructor(graph: Graph) {\n if (!graph.isDirected) {\n throw new Error(\"DeltaPageRank requires a directed graph\");\n }\n\n this.graph = graph;\n this.scores = new Map();\n this.deltas = new Map();\n this.activeNodes = new Set();\n this.outDegrees = new Map();\n this.outWeights = new Map();\n this.danglingNodes = new Set();\n this.nodeCount = graph.nodeCount;\n\n this.initialize();\n }\n\n private initialize(): void {\n const initialValue = 1.0 / this.nodeCount;\n\n // Initialize data structures\n for (const node of this.graph.nodes()) {\n const nodeId = node.id;\n this.scores.set(nodeId, 0); // Start with zero, will add initial value as delta\n this.deltas.set(nodeId, initialValue);\n this.activeNodes.add(nodeId);\n\n // Precompute out-degrees and weights\n let outDegree = 0;\n let totalOutWeight = 0;\n\n for (const neighbor of Array.from(this.graph.neighbors(nodeId))) {\n outDegree++;\n const edge = this.graph.getEdge(nodeId, neighbor);\n totalOutWeight += edge?.weight ?? 1;\n }\n\n this.outDegrees.set(nodeId, outDegree);\n this.outWeights.set(nodeId, totalOutWeight);\n\n if (outDegree === 0) {\n this.danglingNodes.add(nodeId);\n }\n }\n }\n\n /**\n * Computes PageRank scores using delta-based iteration for faster convergence.\n * @param options - Configuration options for PageRank computation\n * @returns Map of node IDs to their PageRank scores\n */\n public compute(options: DeltaPageRankOptions = {}): Map<NodeId, number> {\n const {\n dampingFactor = 0.85,\n tolerance = 1e-6,\n maxIterations = 100,\n deltaThreshold = tolerance / 10,\n personalization,\n weight,\n } = options;\n\n if (dampingFactor < 0 || dampingFactor > 1) {\n throw new Error(\"Damping factor must be between 0 and 1\");\n }\n\n if (this.nodeCount === 0) {\n return new Map();\n }\n\n // Normalize personalization vector if provided\n let personalVector: Map<NodeId, number> | null = null;\n if (personalization) {\n personalVector = new Map(personalization);\n this.normalizeMap(personalVector);\n }\n\n const randomJump = (1 - dampingFactor) / this.nodeCount;\n let iteration = 0;\n\n while (this.activeNodes.size > 0 && iteration < maxIterations) {\n iteration++;\n\n // Create next iteration's deltas\n const nextDeltas = new Map<NodeId, number>();\n\n // Initialize all nodes with zero delta\n for (const node of this.graph.nodes()) {\n nextDeltas.set(node.id, 0);\n }\n\n // Handle dangling nodes contribution\n let danglingSum = 0;\n for (const danglingNode of this.danglingNodes) {\n const currentScore = this.scores.get(danglingNode) ?? 0;\n const delta = this.deltas.get(danglingNode) ?? 0;\n danglingSum += currentScore + delta;\n }\n\n if (danglingSum > 0) {\n const danglingContribution = (dampingFactor * danglingSum) / this.nodeCount;\n for (const node of this.graph.nodes()) {\n const nodeId = node.id;\n const currentDelta = nextDeltas.get(nodeId) ?? 0;\n if (personalVector) {\n const personalContrib = danglingContribution * (personalVector.get(nodeId) ?? 0);\n nextDeltas.set(nodeId, currentDelta + personalContrib);\n } else {\n nextDeltas.set(nodeId, currentDelta + danglingContribution);\n }\n }\n }\n\n // Process only active nodes\n for (const nodeId of this.activeNodes) {\n const delta = this.deltas.get(nodeId) ?? 0;\n\n // Skip if delta is too small\n if (Math.abs(delta) < deltaThreshold) {\n continue;\n }\n\n // Apply delta to score\n const currentScore = this.scores.get(nodeId) ?? 0;\n this.scores.set(nodeId, currentScore + delta);\n\n const outWeight = this.outWeights.get(nodeId) ?? 0;\n if (outWeight > 0) {\n // Distribute delta to neighbors\n for (const neighbor of Array.from(this.graph.neighbors(nodeId))) {\n let edgeWeight = 1;\n if (weight) {\n const edge = this.graph.getEdge(nodeId, neighbor);\n edgeWeight = edge?.weight ?? 1;\n }\n\n const contribution = dampingFactor * delta * (edgeWeight / outWeight);\n const currentDelta = nextDeltas.get(neighbor) ?? 0;\n nextDeltas.set(neighbor, currentDelta + contribution);\n }\n }\n }\n\n // Add teleportation probability as delta\n for (const node of this.graph.nodes()) {\n const nodeId = node.id;\n const currentDelta = nextDeltas.get(nodeId) ?? 0;\n if (personalVector) {\n nextDeltas.set(nodeId, currentDelta + (1 - dampingFactor) * (personalVector.get(nodeId) ?? 0));\n } else {\n nextDeltas.set(nodeId, currentDelta + randomJump);\n }\n }\n\n // Find active nodes for next iteration\n const nextActive = new Set<NodeId>();\n let maxDelta = 0;\n\n for (const [nodeId, delta] of nextDeltas) {\n maxDelta = Math.max(maxDelta, Math.abs(delta));\n if (Math.abs(delta) >= deltaThreshold) {\n nextActive.add(nodeId);\n }\n }\n\n // Update for next iteration\n this.deltas = nextDeltas;\n this.activeNodes = nextActive;\n\n // Global convergence check\n if (maxDelta < tolerance) {\n break;\n }\n }\n\n // Normalize final scores\n this.normalizeMap(this.scores);\n\n return new Map(this.scores);\n }\n\n /**\n * Update PageRank scores after graph modification.\n * This is where delta-based approach really shines.\n * @param modifiedNodes - Set of nodes that were modified (edges added/removed)\n * @param options - Configuration options for PageRank computation\n * @returns Updated PageRank scores\n */\n public update(modifiedNodes: Set<NodeId>, options: DeltaPageRankOptions = {}): Map<NodeId, number> {\n // Mark modified nodes and their neighbors as active\n this.activeNodes.clear();\n\n for (const nodeId of modifiedNodes) {\n this.activeNodes.add(nodeId);\n\n // Add incoming neighbors\n for (const neighbor of Array.from(this.graph.inNeighbors(nodeId))) {\n this.activeNodes.add(neighbor);\n }\n\n // Add outgoing neighbors\n for (const neighbor of Array.from(this.graph.neighbors(nodeId))) {\n this.activeNodes.add(neighbor);\n }\n }\n\n // Recompute only for active nodes\n return this.compute(options);\n }\n\n private normalizeMap(map: Map<NodeId, number>): void {\n let sum = 0;\n for (const value of map.values()) {\n sum += value;\n }\n\n if (sum > 0) {\n for (const [key, value] of Array.from(map)) {\n map.set(key, value / sum);\n }\n }\n }\n}\n\n/**\n * Priority queue based implementation for even better performance\n * Processes nodes in order of their delta magnitude\n */\nexport class PriorityDeltaPageRank {\n private graph: Graph;\n private scores: Map<NodeId, number>;\n private priorityQueue: PriorityQueue<NodeId>;\n private nodeDeltas: Map<NodeId, number>;\n private outWeights: Map<NodeId, number>;\n private danglingNodes: Set<NodeId>;\n private nodeCount: number;\n\n /**\n * Creates a new PriorityDeltaPageRank instance for the given graph.\n * @param graph - The directed graph to compute PageRank on\n */\n constructor(graph: Graph) {\n if (!graph.isDirected) {\n throw new Error(\"PriorityDeltaPageRank requires a directed graph\");\n }\n\n this.graph = graph;\n this.scores = new Map();\n this.nodeDeltas = new Map();\n this.outWeights = new Map();\n this.danglingNodes = new Set();\n this.nodeCount = graph.nodeCount;\n\n // Priority queue ordered by delta magnitude (larger deltas have higher priority)\n this.priorityQueue = new PriorityQueue<NodeId>((a, b) => b - a);\n\n this.initialize();\n }\n\n private initialize(): void {\n const initialValue = 1.0 / this.nodeCount;\n\n // Initialize all nodes with initial delta\n for (const node of this.graph.nodes()) {\n const nodeId = node.id;\n this.scores.set(nodeId, 0); // Start with zero scores\n this.nodeDeltas.set(nodeId, initialValue);\n this.priorityQueue.enqueue(nodeId, initialValue);\n\n // Precompute out-weights\n let totalOutWeight = 0;\n let outDegree = 0;\n\n for (const neighbor of Array.from(this.graph.neighbors(nodeId))) {\n outDegree++;\n const edge = this.graph.getEdge(nodeId, neighbor);\n totalOutWeight += edge?.weight ?? 1;\n }\n\n this.outWeights.set(nodeId, totalOutWeight);\n\n if (outDegree === 0) {\n this.danglingNodes.add(nodeId);\n }\n }\n }\n\n /**\n * Computes PageRank scores using priority queue-based delta iteration.\n * Processes nodes in order of their delta magnitude for optimal convergence.\n * @param options - Configuration options for PageRank computation\n * @returns Map of node IDs to their PageRank scores\n */\n public computeWithPriority(options: DeltaPageRankOptions = {}): Map<NodeId, number> {\n const {\n dampingFactor = 0.85,\n tolerance = 1e-6,\n maxIterations = 100,\n deltaThreshold = tolerance / 10,\n weight,\n } = options;\n\n let iteration = 0;\n let processedCount = 0;\n\n while (!this.priorityQueue.isEmpty() && iteration < maxIterations) {\n const nodeId = this.priorityQueue.dequeue();\n if (nodeId === undefined) {\n break;\n }\n\n const delta = this.nodeDeltas.get(nodeId) ?? 0;\n\n // Skip if delta is too small\n if (Math.abs(delta) < deltaThreshold) {\n continue;\n }\n\n // Apply delta to node's score\n const currentScore = this.scores.get(nodeId) ?? 0;\n this.scores.set(nodeId, currentScore + delta);\n this.nodeDeltas.set(nodeId, 0);\n\n // Distribute delta to neighbors\n const outWeight = this.outWeights.get(nodeId) ?? 0;\n if (outWeight > 0) {\n for (const neighbor of Array.from(this.graph.neighbors(nodeId))) {\n let edgeWeight = 1;\n if (weight) {\n const edge = this.graph.getEdge(nodeId, neighbor);\n edgeWeight = edge?.weight ?? 1;\n }\n\n const contribution = dampingFactor * delta * (edgeWeight / outWeight);\n const currentNeighborDelta = this.nodeDeltas.get(neighbor) ?? 0;\n const newDelta = currentNeighborDelta + contribution;\n this.nodeDeltas.set(neighbor, newDelta);\n\n // Re-enqueue neighbor with updated priority\n if (Math.abs(newDelta) >= deltaThreshold) {\n this.priorityQueue.enqueue(neighbor, Math.abs(newDelta));\n }\n }\n }\n\n processedCount++;\n\n // Periodic convergence check\n if (processedCount % 1000 === 0) {\n let maxDelta = 0;\n for (const d of this.nodeDeltas.values()) {\n maxDelta = Math.max(maxDelta, Math.abs(d));\n }\n if (maxDelta < tolerance) {\n break;\n }\n }\n\n iteration++;\n }\n\n // Apply any remaining deltas\n for (const [nodeId, delta] of this.nodeDeltas) {\n if (Math.abs(delta) >= deltaThreshold) {\n const currentScore = this.scores.get(nodeId) ?? 0;\n this.scores.set(nodeId, currentScore + delta);\n }\n }\n\n // Add teleportation probability\n const teleport = (1 - dampingFactor) / this.nodeCount;\n for (const [nodeId, score] of this.scores) {\n this.scores.set(nodeId, score + teleport);\n }\n\n // Normalize final scores\n this.normalizeMap(this.scores);\n\n return new Map(this.scores);\n }\n\n private normalizeMap(map: Map<NodeId, number>): void {\n let sum = 0;\n for (const value of map.values()) {\n sum += value;\n }\n\n if (sum > 0) {\n for (const [key, value] of Array.from(map)) {\n map.set(key, value / sum);\n }\n }\n }\n}\n","import type { Graph } from \"../../core/graph.js\";\nimport type { CentralityOptions, CentralityResult } from \"../../types/index.js\";\n\n/**\n * Eigenvector centrality implementation\n *\n * Measures the influence of a node based on the influence of its neighbors.\n * A node has high eigenvector centrality if it is connected to nodes\n * that themselves have high eigenvector centrality.\n *\n * Time complexity: O(V + E) per iteration\n * Space complexity: O(V)\n */\n\nexport interface EigenvectorCentralityOptions extends CentralityOptions {\n maxIterations?: number; // Maximum iterations (default: 100)\n tolerance?: number; // Convergence tolerance (default: 1e-6)\n startVector?: Map<string, number>; // Initial vector (optional)\n}\n\n/**\n * Calculate eigenvector centrality for all nodes in the graph.\n * Uses the power iteration method to find the dominant eigenvector.\n * @param graph - The graph to compute eigenvector centrality on\n * @param options - Configuration options for the computation\n * @returns Object mapping node IDs to their eigenvector centrality scores\n */\nexport function eigenvectorCentrality(graph: Graph, options: EigenvectorCentralityOptions = {}): CentralityResult {\n const { maxIterations = 100, tolerance = 1e-6, normalized = true, startVector } = options;\n\n const centrality: CentralityResult = {};\n const nodes = Array.from(graph.nodes());\n const nodeIds = nodes.map((node) => node.id);\n\n if (nodeIds.length === 0) {\n return centrality;\n }\n\n // Initialize the eigenvector\n let currentVector = new Map<string, number>();\n let previousVector = new Map<string, number>();\n\n if (startVector) {\n // Use provided start vector\n for (const nodeId of nodeIds) {\n const key = nodeId.toString();\n currentVector.set(key, startVector.get(key) ?? 1.0 / Math.sqrt(nodeIds.length));\n }\n } else {\n // Initialize with uniform distribution\n const initialValue = 1.0 / Math.sqrt(nodeIds.length);\n for (const nodeId of nodeIds) {\n currentVector.set(nodeId.toString(), initialValue);\n }\n }\n\n // Power iteration\n for (let iteration = 0; iteration < maxIterations; iteration++) {\n previousVector = new Map(currentVector);\n currentVector = new Map();\n\n // Update each node's centrality based on neighbors\n for (const nodeId of nodeIds) {\n let sum = 0;\n const neighbors = Array.from(graph.neighbors(nodeId));\n\n for (const neighbor of neighbors) {\n const neighborKey = neighbor.toString();\n const prevValue = previousVector.get(neighborKey);\n sum += prevValue ?? 0;\n }\n\n currentVector.set(nodeId.toString(), sum);\n }\n\n // Normalize the vector\n let norm = 0;\n for (const value of Array.from(currentVector.values())) {\n norm += value * value;\n }\n norm = Math.sqrt(norm);\n\n if (norm === 0) {\n // Graph has no edges or is disconnected\n for (const nodeId of nodeIds) {\n centrality[nodeId.toString()] = 0;\n }\n return centrality;\n }\n\n // Normalize the vector\n for (const [nodeId, value] of Array.from(currentVector)) {\n currentVector.set(nodeId, value / norm);\n }\n\n // Check for convergence\n let maxDiff = 0;\n for (const [nodeId, value] of Array.from(currentVector)) {\n const prevValue = previousVector.get(nodeId) ?? 0;\n const diff = Math.abs(value - prevValue);\n maxDiff = Math.max(maxDiff, diff);\n }\n\n if (maxDiff < tolerance) {\n break;\n }\n }\n\n // Prepare results\n for (const [nodeId, value] of Array.from(currentVector)) {\n centrality[nodeId] = value;\n }\n\n // Additional normalization if requested (normalize to [0,1] range)\n if (normalized) {\n let maxValue = 0;\n let minValue = Number.POSITIVE_INFINITY;\n\n for (const value of Object.values(centrality)) {\n maxValue = Math.max(maxValue, value);\n minValue = Math.min(minValue, value);\n }\n\n const range = maxValue - minValue;\n if (range > 0) {\n for (const nodeId of Object.keys(centrality)) {\n const centralityValue = centrality[nodeId];\n if (centralityValue !== undefined) {\n centrality[nodeId] = (centralityValue - minValue) / range;\n }\n }\n } else {\n // All values are the same, set to 1\n for (const nodeId of Object.keys(centrality)) {\n centrality[nodeId] = maxValue > 0 ? 1 : 0;\n }\n }\n }\n\n return centrality;\n}\n\n/**\n * Calculate eigenvector centrality for a specific node.\n * @param graph - The graph to compute eigenvector centrality on\n * @param nodeId - The ID of the node to calculate centrality for\n * @param options - Configuration options for the computation\n * @returns The eigenvector centrality score for the specified node\n */\nexport function nodeEigenvectorCentrality(\n graph: Graph,\n nodeId: string | number,\n options: EigenvectorCentralityOptions = {},\n): number {\n if (!graph.hasNode(nodeId)) {\n throw new Error(`Node ${String(nodeId)} not found in graph`);\n }\n\n const centrality = eigenvectorCentrality(graph, options);\n return centrality[nodeId.toString()] ?? 0;\n}\n","import type { Graph } from \"../../core/graph.js\";\nimport type { CentralityOptions } from \"../../types/index.js\";\n\n/**\n * HITS (Hyperlink-Induced Topic Search) algorithm implementation\n *\n * Identifies hub and authority scores for nodes in a graph.\n * - Authorities: nodes with valuable information (pointed to by hubs)\n * - Hubs: nodes that point to many authorities\n *\n * Originally designed for web page ranking but applicable to any directed network.\n *\n * Time complexity: O(V + E) per iteration\n * Space complexity: O(V)\n */\n\nexport interface HITSResult {\n hubs: Record<string, number>;\n authorities: Record<string, number>;\n}\n\nexport interface HITSOptions extends CentralityOptions {\n maxIterations?: number; // Maximum iterations (default: 100)\n tolerance?: number; // Convergence tolerance (default: 1e-6)\n}\n\n/**\n * Calculate HITS hub and authority scores for all nodes in the graph.\n * Uses iterative method with normalization.\n * @param graph - The graph to compute HITS scores on\n * @param options - Configuration options for the computation\n * @returns Object containing hub and authority scores for all nodes\n */\nexport function hits(graph: Graph, options: HITSOptions = {}): HITSResult {\n const { maxIterations = 100, tolerance = 1e-6, normalized = true } = options;\n\n const hubs: Record<string, number> = {};\n const authorities: Record<string, number> = {};\n\n const nodes = Array.from(graph.nodes());\n const nodeIds = nodes.map((node) => node.id);\n\n if (nodeIds.length === 0) {\n return { hubs, authorities };\n }\n\n // Initialize scores\n let currentHubs = new Map<string, number>();\n let currentAuthorities = new Map<string, number>();\n let previousHubs = new Map<string, number>();\n let previousAuthorities = new Map<string, number>();\n\n // Start with uniform distribution\n const initialValue = 1.0 / Math.sqrt(nodeIds.length);\n for (const nodeId of nodeIds) {\n const key = nodeId.toString();\n currentHubs.set(key, initialValue);\n currentAuthorities.set(key, initialValue);\n }\n\n // Iterative computation\n for (let iteration = 0; iteration < maxIterations; iteration++) {\n previousHubs = new Map(currentHubs);\n previousAuthorities = new Map(currentAuthorities);\n\n // Update authority scores\n // Authority score = sum of hub scores of nodes pointing to it\n const newAuthorities = new Map<string, number>();\n for (const nodeId of nodeIds) {\n let authorityScore = 0;\n const inNeighbors = Array.from(graph.inNeighbors(nodeId));\n\n for (const inNeighbor of inNeighbors) {\n const neighborKey = inNeighbor.toString();\n authorityScore += previousHubs.get(neighborKey) ?? 0;\n }\n\n newAuthorities.set(nodeId.toString(), authorityScore);\n }\n\n // Update hub scores\n // Hub score = sum of authority scores of nodes it points to\n const newHubs = new Map<string, number>();\n for (const nodeId of nodeIds) {\n let hubScore = 0;\n const outNeighbors = Array.from(graph.outNeighbors(nodeId));\n\n for (const outNeighbor of outNeighbors) {\n const neighborKey = outNeighbor.toString();\n hubScore += previousAuthorities.get(neighborKey) ?? 0;\n }\n\n newHubs.set(nodeId.toString(), hubScore);\n }\n\n // Normalize authority scores\n let authNorm = 0;\n for (const value of Array.from(newAuthorities.values())) {\n authNorm += value * value;\n }\n authNorm = Math.sqrt(authNorm);\n\n if (authNorm > 0) {\n for (const [nodeId, value] of Array.from(newAuthorities)) {\n newAuthorities.set(nodeId, value / authNorm);\n }\n }\n\n // Normalize hub scores\n let hubNorm = 0;\n for (const value of Array.from(newHubs.values())) {\n hubNorm += value * value;\n }\n hubNorm = Math.sqrt(hubNorm);\n\n if (hubNorm > 0) {\n for (const [nodeId, value] of Array.from(newHubs)) {\n newHubs.set(nodeId, value / hubNorm);\n }\n }\n\n currentAuthorities = newAuthorities;\n currentHubs = newHubs;\n\n // Check for convergence\n let maxDiff = 0;\n for (const [nodeId, value] of currentHubs) {\n const prevValue = previousHubs.get(nodeId) ?? 0;\n const diff = Math.abs(value - prevValue);\n maxDiff = Math.max(maxDiff, diff);\n }\n for (const [nodeId, value] of currentAuthorities) {\n const prevValue = previousAuthorities.get(nodeId) ?? 0;\n const diff = Math.abs(value - prevValue);\n maxDiff = Math.max(maxDiff, diff);\n }\n\n if (maxDiff < tolerance) {\n break;\n }\n }\n\n // Prepare results\n for (const [nodeId, value] of currentHubs) {\n hubs[nodeId] = value;\n }\n for (const [nodeId, value] of currentAuthorities) {\n authorities[nodeId] = value;\n }\n\n // The algorithm already normalizes to unit L2 norm during iterations\n // Additional max normalization is only applied if explicitly requested\n if (!normalized) {\n // If normalization is explicitly disabled, normalize to [0, 1] range\n let maxHub = 0;\n let maxAuth = 0;\n\n for (const value of Object.values(hubs)) {\n maxHub = Math.max(maxHub, value);\n }\n for (const value of Object.values(authorities)) {\n maxAuth = Math.max(maxAuth, value);\n }\n\n if (maxHub > 0) {\n for (const nodeId of Object.keys(hubs)) {\n const hubValue = hubs[nodeId];\n if (hubValue !== undefined) {\n hubs[nodeId] = hubValue / maxHub;\n }\n }\n }\n\n if (maxAuth > 0) {\n for (const nodeId of Object.keys(authorities)) {\n const authValue = authorities[nodeId];\n if (authValue !== undefined) {\n authorities[nodeId] = authValue / maxAuth;\n }\n }\n }\n }\n\n return { hubs, authorities };\n}\n\n/**\n * Calculate HITS scores for a specific node.\n * @param graph - The graph to compute HITS scores on\n * @param nodeId - The ID of the node to calculate scores for\n * @param options - Configuration options for the computation\n * @returns Object containing hub and authority scores for the specified node\n */\nexport function nodeHITS(\n graph: Graph,\n nodeId: string | number,\n options: HITSOptions = {},\n): { hub: number; authority: number } {\n if (!graph.hasNode(nodeId)) {\n throw new Error(`Node ${String(nodeId)} not found in graph`);\n }\n\n const result = hits(graph, options);\n const key = nodeId.toString();\n\n return {\n hub: result.hubs[key] ?? 0,\n authority: result.authorities[key] ?? 0,\n };\n}\n","import type { Graph } from \"../../core/graph.js\";\nimport type { CentralityOptions, CentralityResult } from \"../../types/index.js\";\n\n/**\n * Katz centrality implementation\n *\n * A generalization of eigenvector centrality that gives each node a base amount\n * of influence regardless of its position in the network. Uses an attenuation\n * factor (alpha) to control how much a node's centrality depends on its neighbors.\n *\n * Katz centrality = alpha * sum(neighbors' centrality) + beta\n *\n * Time complexity: O(V + E) per iteration\n * Space complexity: O(V)\n */\n\nexport interface KatzCentralityOptions extends CentralityOptions {\n alpha?: number; // Attenuation factor (default: 0.1)\n beta?: number; // Base centrality weight (default: 1.0)\n maxIterations?: number; // Maximum iterations (default: 100)\n tolerance?: number; // Convergence tolerance (default: 1e-6)\n}\n\n/**\n * Calculate Katz centrality for all nodes in the graph.\n * Uses iterative method to compute centrality scores.\n * @param graph - The graph to compute Katz centrality on\n * @param options - Configuration options for the computation\n * @returns Object mapping node IDs to their Katz centrality scores\n */\nexport function katzCentrality(graph: Graph, options: KatzCentralityOptions = {}): CentralityResult {\n const { alpha = 0.1, beta = 1.0, maxIterations = 100, tolerance = 1e-6, normalized = true } = options;\n\n const centrality: CentralityResult = {};\n const nodes = Array.from(graph.nodes());\n const nodeIds = nodes.map((node) => node.id);\n\n if (nodeIds.length === 0) {\n return centrality;\n }\n\n // Check if alpha is valid (should be less than 1/lambda_max)\n // For simplicity, we'll trust the user's choice or use conservative default\n\n // Initialize centrality scores\n let currentScores = new Map<string, number>();\n let previousScores = new Map<string, number>();\n\n // Start with beta for all nodes\n for (const nodeId of nodeIds) {\n currentScores.set(nodeId.toString(), beta);\n }\n\n // Iterative computation\n for (let iteration = 0; iteration < maxIterations; iteration++) {\n previousScores = new Map(currentScores);\n currentScores = new Map();\n\n // Update each node's centrality\n for (const nodeId of nodeIds) {\n let sum = 0;\n\n // For directed graphs, use in-neighbors\n // For undirected graphs, use all neighbors\n const neighbors = graph.isDirected ? Array.from(graph.inNeighbors(nodeId)) : graph.neighbors(nodeId);\n\n for (const neighbor of neighbors) {\n const neighborKey = neighbor.toString();\n sum += previousScores.get(neighborKey) ?? 0;\n }\n\n currentScores.set(nodeId.toString(), alpha * sum + beta);\n }\n\n // Check for convergence\n let maxDiff = 0;\n for (const [nodeId, value] of Array.from(currentScores)) {\n const prevValue = previousScores.get(nodeId) ?? 0;\n const diff = Math.abs(value - prevValue);\n maxDiff = Math.max(maxDiff, diff);\n }\n\n if (maxDiff < tolerance) {\n break;\n }\n }\n\n // Prepare results\n for (const [nodeId, value] of Array.from(currentScores)) {\n centrality[nodeId] = value;\n }\n\n // Normalize if requested\n if (normalized) {\n let maxValue = 0;\n let minValue = Number.POSITIVE_INFINITY;\n\n for (const value of Object.values(centrality)) {\n maxValue = Math.max(maxValue, value);\n minValue = Math.min(minValue, value);\n }\n\n const range = maxValue - minValue;\n if (range > 0) {\n for (const nodeId of Object.keys(centrality)) {\n const centralityValue = centrality[nodeId];\n if (centralityValue !== undefined) {\n centrality[nodeId] = (centralityValue - minValue) / range;\n }\n }\n }\n }\n\n return centrality;\n}\n\n/**\n * Calculate Katz centrality for a specific node.\n * @param graph - The graph to compute Katz centrality on\n * @param nodeId - The ID of the node to calculate centrality for\n * @param options - Configuration options for the computation\n * @returns The Katz centrality score for the specified node\n */\nexport function nodeKatzCentrality(graph: Graph, nodeId: string | number, options: KatzCentralityOptions = {}): number {\n if (!graph.hasNode(nodeId)) {\n throw new Error(`Node ${String(nodeId)} not found in graph`);\n }\n\n const centrality = katzCentrality(graph, options);\n return centrality[nodeId.toString()] ?? 0;\n}\n","import type { Graph } from \"../../core/graph.js\";\nimport type { NodeId } from \"../../types/index.js\";\n\n/**\n * Simplified Delta-based PageRank that matches the standard algorithm\n * but only processes active nodes for efficiency.\n *\n * Key optimization: Supports incremental updates when graph structure changes,\n * avoiding full recomputation from scratch.\n */\nexport class SimpleDeltaPageRank {\n private graph: Graph;\n private nodeCount: number;\n private previousScores: Map<NodeId, number> | null = null;\n\n /**\n * Creates a new SimpleDeltaPageRank instance for the given graph.\n * @param graph - The directed graph to compute PageRank on\n */\n constructor(graph: Graph) {\n if (!graph.isDirected) {\n throw new Error(\"PageRank requires a directed graph\");\n }\n\n this.graph = graph;\n this.nodeCount = graph.nodeCount;\n }\n\n /**\n * Computes PageRank scores for all nodes in the graph using power iteration.\n * @param options - Configuration options for PageRank computation\n * @param options.dampingFactor - Probability of following a link (default: 0.85)\n * @param options.tolerance - Convergence tolerance threshold (default: 1e-6)\n * @param options.maxIterations - Maximum number of iterations (default: 100)\n * @param options.personalization - Personalization vector for Personalized PageRank\n * @param options.weight - Edge attribute name for weighted PageRank\n * @returns Map of node IDs to their PageRank scores\n */\n public compute(\n options: {\n dampingFactor?: number;\n tolerance?: number;\n maxIterations?: number;\n personalization?: Map<NodeId, number>;\n weight?: string;\n } = {},\n ): Map<NodeId, number> {\n const { dampingFactor = 0.85, tolerance = 1e-6, maxIterations = 100, personalization, weight } = options;\n\n if (this.nodeCount === 0) {\n return new Map();\n }\n\n // Initialize scores\n const scores = new Map<NodeId, number>();\n const newScores = new Map<NodeId, number>();\n\n for (const node of this.graph.nodes()) {\n scores.set(node.id, 1.0 / this.nodeCount);\n }\n\n // Precompute out-degrees and weights\n const outWeights = new Map<NodeId, number>();\n const danglingNodes = new Set<NodeId>();\n\n for (const node of this.graph.nodes()) {\n let totalWeight = 0;\n let outDegree = 0;\n\n for (const neighbor of Array.from(this.graph.neighbors(node.id))) {\n outDegree++;\n const edge = this.graph.getEdge(node.id, neighbor);\n totalWeight += edge?.weight ?? 1;\n }\n\n outWeights.set(node.id, totalWeight);\n if (outDegree === 0) {\n danglingNodes.add(node.id);\n }\n }\n\n // Normalize personalization vector if provided\n let personalVector: Map<NodeId, number> | null = null;\n if (personalization) {\n personalVector = new Map(personalization);\n this.normalizeMap(personalVector);\n }\n\n // Power iteration with active node tracking\n let activeNodes = new Set<NodeId>(scores.keys());\n let iteration = 0;\n\n for (iteration = 0; iteration < maxIterations; iteration++) {\n // Initialize new scores\n for (const nodeId of scores.keys()) {\n if (personalVector) {\n newScores.set(nodeId, (1 - dampingFactor) * (personalVector.get(nodeId) ?? 0));\n } else {\n newScores.set(nodeId, (1 - dampingFactor) / this.nodeCount);\n }\n }\n\n // Handle dangling nodes\n let danglingSum = 0;\n for (const danglingNode of danglingNodes) {\n danglingSum += scores.get(danglingNode) ?? 0;\n }\n\n if (danglingSum > 0) {\n const danglingContribution = (dampingFactor * danglingSum) / this.nodeCount;\n for (const nodeId of scores.keys()) {\n const current = newScores.get(nodeId) ?? 0;\n if (personalVector) {\n const personalContrib = danglingContribution * (personalVector.get(nodeId) ?? 0);\n newScores.set(nodeId, current + personalContrib);\n } else {\n newScores.set(nodeId, current + danglingContribution);\n }\n }\n }\n\n // Propagate rank from active nodes only\n for (const nodeId of activeNodes) {\n const currentRank = scores.get(nodeId) ?? 0;\n const nodeOutWeight = outWeights.get(nodeId) ?? 0;\n\n if (nodeOutWeight > 0) {\n for (const neighbor of Array.from(this.graph.neighbors(nodeId))) {\n let edgeWeight = 1;\n if (weight) {\n const edge = this.graph.getEdge(nodeId, neighbor);\n edgeWeight = edge?.weight ?? 1;\n }\n\n const contribution = dampingFactor * currentRank * (edgeWeight / nodeOutWeight);\n const neighborRank = newScores.get(neighbor) ?? 0;\n newScores.set(neighbor, neighborRank + contribution);\n }\n }\n }\n\n // Check convergence and identify active nodes\n const nextActive = new Set<NodeId>();\n let maxDiff = 0;\n\n for (const nodeId of scores.keys()) {\n const oldRank = scores.get(nodeId) ?? 0;\n const newRank = newScores.get(nodeId) ?? 0;\n const diff = Math.abs(newRank - oldRank);\n maxDiff = Math.max(maxDiff, diff);\n\n // Mark as active if change is significant\n if (diff > tolerance / 10) {\n nextActive.add(nodeId);\n // Also mark neighbors as potentially active\n for (const neighbor of Array.from(this.graph.neighbors(nodeId))) {\n nextActive.add(neighbor);\n }\n for (const neighbor of Array.from(this.graph.inNeighbors(nodeId))) {\n nextActive.add(neighbor);\n }\n }\n }\n\n // Swap score maps\n scores.clear();\n for (const [k, v] of newScores) {\n scores.set(k, v);\n }\n newScores.clear();\n\n activeNodes = nextActive;\n\n if (maxDiff < tolerance) {\n break;\n }\n }\n\n // Store scores for potential incremental updates\n this.previousScores = new Map(scores);\n\n return scores;\n }\n\n /**\n * Perform incremental update after graph modification.\n * This is where delta-based approach provides significant speedup.\n * @param modifiedNodes - Set of nodes that were modified (edges added/removed)\n * @param options - Computation options\n * @param options.dampingFactor - Probability of following a link (default: 0.85)\n * @param options.tolerance - Convergence tolerance threshold (default: 1e-6)\n * @param options.maxIterations - Maximum number of iterations (default: 100)\n * @param options.personalization - Personalization vector for Personalized PageRank\n * @param options.weight - Edge attribute name for weighted PageRank\n * @returns Updated PageRank scores\n */\n public update(\n modifiedNodes: Set<NodeId>,\n options: {\n dampingFactor?: number;\n tolerance?: number;\n maxIterations?: number;\n personalization?: Map<NodeId, number>;\n weight?: string;\n } = {},\n ): Map<NodeId, number> {\n if (!this.previousScores) {\n // No previous computation, do full compute\n return this.compute(options);\n }\n\n const { dampingFactor = 0.85, tolerance = 1e-6, maxIterations = 100, personalization, weight } = options;\n\n // Initialize scores from previous computation\n const scores = new Map(this.previousScores);\n const newScores = new Map<NodeId, number>();\n\n // Ensure all current nodes are included\n for (const node of this.graph.nodes()) {\n if (!scores.has(node.id)) {\n scores.set(node.id, 1.0 / this.nodeCount);\n }\n }\n\n // Start with only modified nodes and their neighbors as active\n let activeNodes = new Set<NodeId>();\n for (const nodeId of modifiedNodes) {\n activeNodes.add(nodeId);\n // Add incoming neighbors\n for (const neighbor of Array.from(this.graph.inNeighbors(nodeId))) {\n activeNodes.add(neighbor);\n }\n // Add outgoing neighbors\n for (const neighbor of Array.from(this.graph.neighbors(nodeId))) {\n activeNodes.add(neighbor);\n }\n }\n\n // Recompute out-weights for modified nodes\n const outWeights = new Map<NodeId, number>();\n const danglingNodes = new Set<NodeId>();\n\n for (const node of this.graph.nodes()) {\n let totalWeight = 0;\n let outDegree = 0;\n\n for (const neighbor of Array.from(this.graph.neighbors(node.id))) {\n outDegree++;\n const edge = this.graph.getEdge(node.id, neighbor);\n totalWeight += edge?.weight ?? 1;\n }\n\n outWeights.set(node.id, totalWeight);\n if (outDegree === 0) {\n danglingNodes.add(node.id);\n }\n }\n\n // Normalize personalization vector if provided\n let personalVector: Map<NodeId, number> | null = null;\n if (personalization) {\n personalVector = new Map(personalization);\n this.normalizeMap(personalVector);\n }\n\n // Run limited iterations focusing on active nodes\n let iteration = 0;\n\n for (iteration = 0; iteration < maxIterations && activeNodes.size > 0; iteration++) {\n // Initialize new scores\n for (const nodeId of scores.keys()) {\n if (personalVector) {\n newScores.set(nodeId, (1 - dampingFactor) * (personalVector.get(nodeId) ?? 0));\n } else {\n newScores.set(nodeId, (1 - dampingFactor) / this.nodeCount);\n }\n }\n\n // Handle dangling nodes\n let danglingSum = 0;\n for (const danglingNode of danglingNodes) {\n danglingSum += scores.get(danglingNode) ?? 0;\n }\n\n if (danglingSum > 0) {\n const danglingContribution = (dampingFactor * danglingSum) / this.nodeCount;\n for (const nodeId of scores.keys()) {\n const current = newScores.get(nodeId) ?? 0;\n if (personalVector) {\n const personalContrib = danglingContribution * (personalVector.get(nodeId) ?? 0);\n newScores.set(nodeId, current + personalContrib);\n } else {\n newScores.set(nodeId, current + danglingContribution);\n }\n }\n }\n\n // Propagate rank from ALL nodes (not just active)\n // This ensures correctness\n for (const nodeId of scores.keys()) {\n const currentRank = scores.get(nodeId) ?? 0;\n const nodeOutWeight = outWeights.get(nodeId) ?? 0;\n\n if (nodeOutWeight > 0) {\n for (const neighbor of Array.from(this.graph.neighbors(nodeId))) {\n let edgeWeight = 1;\n if (weight) {\n const edge = this.graph.getEdge(nodeId, neighbor);\n edgeWeight = edge?.weight ?? 1;\n }\n\n const contribution = dampingFactor * currentRank * (edgeWeight / nodeOutWeight);\n const neighborRank = newScores.get(neighbor) ?? 0;\n newScores.set(neighbor, neighborRank + contribution);\n }\n }\n }\n\n // Check convergence only for active nodes\n const nextActive = new Set<NodeId>();\n let maxDiff = 0;\n\n for (const nodeId of activeNodes) {\n const oldRank = scores.get(nodeId) ?? 0;\n const newRank = newScores.get(nodeId) ?? 0;\n const diff = Math.abs(newRank - oldRank);\n maxDiff = Math.max(maxDiff, diff);\n\n // Mark as active if change is significant\n if (diff > tolerance / 10) {\n nextActive.add(nodeId);\n // Also mark neighbors as potentially active\n for (const neighbor of Array.from(this.graph.neighbors(nodeId))) {\n nextActive.add(neighbor);\n }\n for (const neighbor of Array.from(this.graph.inNeighbors(nodeId))) {\n nextActive.add(neighbor);\n }\n }\n }\n\n // Swap score maps\n scores.clear();\n for (const [k, v] of newScores) {\n scores.set(k, v);\n }\n newScores.clear();\n\n activeNodes = nextActive;\n\n if (maxDiff < tolerance) {\n break;\n }\n }\n\n // Store scores for future incremental updates\n this.previousScores = new Map(scores);\n\n return scores;\n }\n\n private normalizeMap(map: Map<NodeId, number>): void {\n let sum = 0;\n for (const value of map.values()) {\n sum += value;\n }\n\n if (sum > 0) {\n for (const [key, value] of Array.from(map)) {\n map.set(key, value / sum);\n }\n }\n }\n}\n","import type { Graph } from \"../../core/graph.js\";\nimport type { NodeId } from \"../../types/index.js\";\nimport { SimpleDeltaPageRank } from \"./delta-pagerank-simple.js\";\n\n/**\n * PageRank algorithm implementation\n *\n * Measures the importance of nodes in a directed graph based on the\n * structure of incoming links. Originally designed for ranking web pages.\n */\n\n/**\n * PageRank algorithm options\n */\nexport interface PageRankOptions {\n /**\n * Damping factor (probability of following a link) (default: 0.85)\n */\n dampingFactor?: number;\n /**\n * Maximum number of iterations (default: 100)\n */\n maxIterations?: number;\n /**\n * Convergence tolerance (default: 1e-6)\n */\n tolerance?: number;\n /**\n * Initial PageRank values for nodes (default: uniform distribution)\n */\n initialRanks?: Map<NodeId, number>;\n /**\n * Personalization vector for Personalized PageRank (default: null)\n */\n personalization?: Map<NodeId, number>;\n /**\n * Weight attribute for weighted PageRank (default: null = unweighted)\n */\n weight?: string;\n /**\n * Use delta-based optimization for faster convergence.\n * Defaults to true for graphs with >100 nodes, false for smaller graphs.\n * Set explicitly to override automatic heuristic.\n */\n useDelta?: boolean;\n}\n\n/**\n * PageRank algorithm result\n */\nexport interface PageRankResult {\n /**\n * PageRank scores for each node\n */\n ranks: Record<string, number>;\n /**\n * Number of iterations until convergence\n */\n iterations: number;\n /**\n * Whether the algorithm converged\n */\n converged: boolean;\n}\n\n/**\n * Calculate PageRank for all nodes in the graph\n *\n * Uses delta-based optimization by default for improved performance on larger graphs.\n * Automatically falls back to standard algorithm for very small graphs.\n *\n * The delta-based approach provides significant speedup for:\n * - Incremental updates after graph modifications\n * - Graphs with localized changes\n * - Early convergence detection per vertex\n *\n * For initial computation on small-medium graphs, standard algorithm may be faster\n * due to lower overhead.\n * @param graph - The directed input graph to analyze\n * @param options - Algorithm configuration options\n * @returns PageRank result containing ranks, iteration count, and convergence status\n */\nexport function pageRank(graph: Graph, options: PageRankOptions = {}): PageRankResult {\n const {\n dampingFactor = 0.85,\n maxIterations = 100,\n tolerance = 1e-6,\n initialRanks,\n personalization,\n weight,\n } = options;\n\n if (!graph.isDirected) {\n throw new Error(\"PageRank requires a directed graph\");\n }\n\n if (dampingFactor < 0 || dampingFactor > 1) {\n throw new Error(\"Damping factor must be between 0 and 1\");\n }\n\n const nodes = Array.from(graph.nodes()).map((node) => node.id);\n const n = nodes.length;\n\n if (n === 0) {\n return { ranks: {}, iterations: 0, converged: true };\n }\n\n // Use delta-based optimization by default for larger graphs\n // Only disable if explicitly requested or graph is very small (overhead dominates)\n const shouldUseDelta = options.useDelta !== false && n > 100;\n\n if (shouldUseDelta) {\n // Use optimized delta-based implementation\n\n const deltaOptions: {\n dampingFactor: number;\n tolerance: number;\n maxIterations: number;\n personalization?: Map<NodeId, number>;\n weight?: string;\n } = {\n dampingFactor,\n tolerance,\n maxIterations,\n };\n\n if (personalization) {\n deltaOptions.personalization = personalization;\n }\n\n if (weight) {\n deltaOptions.weight = weight;\n }\n\n const deltaPageRank = new SimpleDeltaPageRank(graph);\n const deltaRanks = deltaPageRank.compute(deltaOptions);\n\n // Convert to string-keyed record\n const result: Record<string, number> = {};\n for (const [nodeId, rank] of deltaRanks) {\n result[String(nodeId)] = rank;\n }\n\n return {\n ranks: result,\n iterations: maxIterations, // For now, assume we used all iterations\n converged: true,\n };\n }\n\n // Initialize PageRank values\n let ranks = new Map<NodeId, number>();\n if (initialRanks) {\n for (const nodeId of nodes) {\n ranks.set(nodeId, initialRanks.get(nodeId) ?? 1 / n);\n }\n } else {\n for (const nodeId of nodes) {\n ranks.set(nodeId, 1 / n);\n }\n }\n\n // Normalize initial ranks\n normalizeRanks(ranks);\n\n // Calculate out-degrees and handle dangling nodes\n const outDegrees = new Map<NodeId, number>();\n const outWeights = new Map<NodeId, number>();\n const danglingNodes: NodeId[] = [];\n\n for (const nodeId of nodes) {\n let outDegree = 0;\n let totalOutWeight = 0;\n\n for (const neighbor of Array.from(graph.neighbors(nodeId))) {\n outDegree++;\n if (weight) {\n const edge = graph.getEdge(nodeId, neighbor);\n const edgeWeight = edge?.weight ?? 1;\n totalOutWeight += edgeWeight;\n } else {\n totalOutWeight += 1;\n }\n }\n\n outDegrees.set(nodeId, outDegree);\n outWeights.set(nodeId, totalOutWeight);\n\n if (outDegree === 0) {\n danglingNodes.push(nodeId);\n }\n }\n\n // Setup personalization vector\n let personalVector: Map<NodeId, number> | null = null;\n if (personalization) {\n personalVector = new Map(personalization);\n normalizeRanks(personalVector);\n }\n\n let converged = false;\n let iteration = 0;\n\n // Power iteration\n for (iteration = 0; iteration < maxIterations; iteration++) {\n const newRanks = new Map<NodeId, number>();\n\n // Initialize with teleportation probability\n for (const nodeId of nodes) {\n if (personalVector) {\n newRanks.set(nodeId, (1 - dampingFactor) * (personalVector.get(nodeId) ?? 0));\n } else {\n newRanks.set(nodeId, (1 - dampingFactor) / n);\n }\n }\n\n // Handle dangling nodes\n let danglingSum = 0;\n for (const danglingNode of danglingNodes) {\n danglingSum += ranks.get(danglingNode) ?? 0;\n }\n\n if (danglingSum > 0) {\n const danglingContribution = (dampingFactor * danglingSum) / n;\n for (const nodeId of nodes) {\n const currentRank = newRanks.get(nodeId) ?? 0;\n if (personalVector) {\n const personalContrib = danglingContribution * (personalVector.get(nodeId) ?? 0);\n newRanks.set(nodeId, currentRank + personalContrib);\n } else {\n newRanks.set(nodeId, currentRank + danglingContribution);\n }\n }\n }\n\n // Propagate rank from each node to its neighbors\n for (const nodeId of nodes) {\n const currentRank = ranks.get(nodeId) ?? 0;\n const nodeOutWeight = outWeights.get(nodeId) ?? 0;\n\n if (nodeOutWeight > 0) {\n for (const neighbor of Array.from(graph.neighbors(nodeId))) {\n let edgeWeight = 1;\n if (weight) {\n const edge = graph.getEdge(nodeId, neighbor);\n edgeWeight = edge?.weight ?? 1;\n }\n\n const contribution = dampingFactor * currentRank * (edgeWeight / nodeOutWeight);\n const neighborRank = newRanks.get(neighbor) ?? 0;\n newRanks.set(neighbor, neighborRank + contribution);\n }\n }\n }\n\n // Check for convergence\n let maxDiff = 0;\n for (const nodeId of nodes) {\n const oldRank = ranks.get(nodeId) ?? 0;\n const newRank = newRanks.get(nodeId) ?? 0;\n maxDiff = Math.max(maxDiff, Math.abs(newRank - oldRank));\n }\n\n ranks = newRanks;\n\n if (maxDiff < tolerance) {\n converged = true;\n break;\n }\n }\n\n // Convert to string-keyed record\n const result: Record<string, number> = {};\n for (const nodeId of nodes) {\n result[String(nodeId)] = ranks.get(nodeId) ?? 0;\n }\n\n return {\n ranks: result,\n iterations: iteration + 1,\n converged,\n };\n}\n\n/**\n * Calculate Personalized PageRank for a specific set of source nodes\n * @param graph - The directed input graph to analyze\n * @param personalNodes - Nodes to personalize the PageRank towards\n * @param options - Algorithm configuration options\n * @returns PageRank result containing ranks, iteration count, and convergence status\n */\nexport function personalizedPageRank(\n graph: Graph,\n personalNodes: NodeId[],\n options: Omit<PageRankOptions, \"personalization\"> = {},\n): PageRankResult {\n // Handle empty personal nodes by falling back to standard PageRank\n if (personalNodes.length === 0) {\n return pageRank(graph, options);\n }\n\n const nodes = Array.from(graph.nodes()).map((node) => node.id);\n const personalization = new Map<NodeId, number>();\n\n // Initialize personalization vector\n for (const nodeId of nodes) {\n personalization.set(nodeId, 0);\n }\n\n // Set equal probability for personal nodes\n const personalValue = 1 / personalNodes.length;\n for (const personalNode of personalNodes) {\n if (!graph.hasNode(personalNode)) {\n throw new Error(`Personal node ${String(personalNode)} not found in graph`);\n }\n\n personalization.set(personalNode, personalValue);\n }\n\n return pageRank(graph, {\n ...options,\n personalization,\n });\n}\n\n/**\n * Calculate PageRank centrality (normalized PageRank scores)\n * @param graph - The directed input graph to analyze\n * @param options - Algorithm configuration options\n * @returns PageRank scores for each node keyed by node ID\n */\nexport function pageRankCentrality(graph: Graph, options: PageRankOptions = {}): Record<string, number> {\n const result = pageRank(graph, options);\n return result.ranks;\n}\n\n/**\n * Get the top-k nodes by PageRank score\n * @param graph - The directed input graph to analyze\n * @param k - Number of top nodes to return\n * @param options - Algorithm configuration options\n * @returns Array of top-k nodes with their PageRank scores, sorted descending\n */\nexport function topPageRankNodes(\n graph: Graph,\n k: number,\n options: PageRankOptions = {},\n): { node: NodeId; rank: number }[] {\n const result = pageRank(graph, options);\n\n const nodeRanks: { node: NodeId; rank: number }[] = [];\n for (const [nodeStr, rank] of Object.entries(result.ranks)) {\n nodeRanks.push({ node: nodeStr as NodeId, rank });\n }\n\n // Sort by rank in descending order\n nodeRanks.sort((a, b) => b.rank - a.rank);\n\n return nodeRanks.slice(0, k);\n}\n\n/**\n * Normalize ranks so they sum to 1\n * @param ranks - The ranks map to normalize in place\n */\nfunction normalizeRanks(ranks: Map<NodeId, number>): void {\n let sum = 0;\n for (const rank of ranks.values()) {\n sum += rank;\n }\n\n if (sum > 0) {\n for (const [nodeId, rank] of Array.from(ranks)) {\n ranks.set(nodeId, rank / sum);\n }\n }\n}\n","import type { NodeId } from \"../types/index.js\";\n\n/**\n * Union-Find (Disjoint Set) data structure with path compression and union by rank\n *\n * Efficiently supports dynamic connectivity queries and is essential for\n * algorithms like connected components and minimum spanning trees.\n */\nexport class UnionFind {\n private parent: Map<NodeId, NodeId>;\n private rank: Map<NodeId, number>;\n private componentCount: number;\n\n /**\n * Creates a new UnionFind data structure with the given elements.\n * @param elements - Array of elements to initialize the data structure with\n */\n constructor(elements: NodeId[]) {\n this.parent = new Map();\n this.rank = new Map();\n this.componentCount = elements.length;\n\n // Initialize each element as its own parent with rank 0\n for (const element of elements) {\n this.parent.set(element, element);\n this.rank.set(element, 0);\n }\n }\n\n /**\n * Find the root of the set containing the element with path compression\n * @param element - The element to find the root for\n * @returns The root element of the set containing the given element\n */\n find(element: NodeId): NodeId {\n const parent = this.parent.get(element);\n\n if (parent === undefined) {\n throw new Error(`Element ${String(element)} not found in UnionFind`);\n }\n\n // Path compression: make every node on the path point directly to the root\n if (parent !== element) {\n this.parent.set(element, this.find(parent));\n }\n\n const result = this.parent.get(element);\n if (result === undefined) {\n throw new Error(`Element ${String(element)} not found in UnionFind`);\n }\n\n return result;\n }\n\n /**\n * Union two sets using union by rank\n * @param elementA - The first element whose set should be merged\n * @param elementB - The second element whose set should be merged\n */\n union(elementA: NodeId, elementB: NodeId): void {\n const rootA = this.find(elementA);\n const rootB = this.find(elementB);\n\n // Already in the same set\n if (rootA === rootB) {\n return;\n }\n\n const rankA = this.rank.get(rootA);\n const rankB = this.rank.get(rootB);\n if (rankA === undefined || rankB === undefined) {\n throw new Error(\"Rank not found for root elements\");\n }\n\n // Union by rank: attach smaller tree under root of larger tree\n if (rankA < rankB) {\n this.parent.set(rootA, rootB);\n } else if (rankA > rankB) {\n this.parent.set(rootB, rootA);\n } else {\n // Same rank: make one root and increment its rank\n this.parent.set(rootB, rootA);\n this.rank.set(rootA, rankA + 1);\n }\n\n this.componentCount--;\n }\n\n /**\n * Check if two elements are in the same connected component\n * @param elementA - The first element to check\n * @param elementB - The second element to check\n * @returns True if both elements are in the same component, false otherwise\n */\n connected(elementA: NodeId, elementB: NodeId): boolean {\n try {\n return this.find(elementA) === this.find(elementB);\n } catch {\n return false;\n }\n }\n\n /**\n * Get the number of connected components\n * @returns The current count of disjoint components\n */\n getComponentCount(): number {\n return this.componentCount;\n }\n\n /**\n * Get all elements that belong to the same component as the given element\n * @param element - The element whose component should be retrieved\n * @returns Array of all elements in the same component\n */\n getComponent(element: NodeId): NodeId[] {\n const root = this.find(element);\n const component: NodeId[] = [];\n\n for (const [node] of Array.from(this.parent)) {\n if (this.find(node) === root) {\n component.push(node);\n }\n }\n\n return component;\n }\n\n /**\n * Get all connected components as separate arrays\n * @returns Array of arrays, where each inner array contains elements of one component\n */\n getAllComponents(): NodeId[][] {\n const componentMap = new Map<NodeId, NodeId[]>();\n\n for (const [node] of Array.from(this.parent)) {\n const root = this.find(node);\n\n if (!componentMap.has(root)) {\n componentMap.set(root, []);\n }\n\n const component = componentMap.get(root);\n if (component) {\n component.push(node);\n }\n }\n\n return Array.from(componentMap.values());\n }\n\n /**\n * Get the size of the component containing the given element\n * @param element - The element whose component size should be retrieved\n * @returns The number of elements in the component containing the given element\n */\n getComponentSize(element: NodeId): number {\n return this.getComponent(element).length;\n }\n\n /**\n * Add a new element to the data structure\n * @param element - The element to add as a new singleton set\n */\n addElement(element: NodeId): void {\n if (this.parent.has(element)) {\n return; // Element already exists\n }\n\n this.parent.set(element, element);\n this.rank.set(element, 0);\n this.componentCount++;\n }\n\n /**\n * Check if an element exists in the data structure\n * @param element - The element to check for\n * @returns True if the element exists, false otherwise\n */\n hasElement(element: NodeId): boolean {\n return this.parent.has(element);\n }\n\n /**\n * Get the total number of elements\n * @returns The total count of all elements in the data structure\n */\n size(): number {\n return this.parent.size;\n }\n}\n","import type { Graph } from \"../../core/graph.js\";\nimport { UnionFind } from \"../../data-structures/union-find.js\";\nimport type { NodeId } from \"../../types/index.js\";\n\n/**\n * Connected components algorithms\n *\n * Finds connected components in undirected graphs and strongly connected\n * components in directed graphs using various efficient algorithms.\n */\n\n/**\n * Find connected components in an undirected graph using Union-Find\n * @param graph - The input graph (must be undirected)\n * @returns Array of connected components, each containing an array of node IDs\n */\nexport function connectedComponents(graph: Graph): NodeId[][] {\n if (graph.isDirected) {\n throw new Error(\n \"Connected components algorithm requires an undirected graph. Use stronglyConnectedComponents for directed graphs.\",\n );\n }\n\n const nodes = Array.from(graph.nodes()).map((node) => node.id);\n\n if (nodes.length === 0) {\n return [];\n }\n\n const unionFind = new UnionFind(nodes);\n\n // Union connected nodes\n for (const edge of Array.from(graph.edges())) {\n unionFind.union(edge.source, edge.target);\n }\n\n return unionFind.getAllComponents();\n}\n\n/**\n * Find connected components using DFS (alternative implementation)\n * @param graph - The input graph (must be undirected)\n * @returns Array of connected components, each containing an array of node IDs\n */\nexport function connectedComponentsDFS(graph: Graph): NodeId[][] {\n if (graph.isDirected) {\n throw new Error(\"Connected components algorithm requires an undirected graph\");\n }\n\n const visited = new Set<NodeId>();\n const components: NodeId[][] = [];\n\n for (const node of Array.from(graph.nodes())) {\n if (!visited.has(node.id)) {\n const component: NodeId[] = [];\n dfsComponent(graph, node.id, visited, component);\n components.push(component);\n }\n }\n\n return components;\n}\n\n/**\n * DFS helper for connected components\n * @param graph - The input graph\n * @param nodeId - The starting node ID\n * @param visited - Set of already visited node IDs\n * @param component - Array to accumulate component members\n */\nfunction dfsComponent(graph: Graph, nodeId: NodeId, visited: Set<NodeId>, component: NodeId[]): void {\n visited.add(nodeId);\n component.push(nodeId);\n\n for (const neighbor of Array.from(graph.neighbors(nodeId))) {\n if (!visited.has(neighbor)) {\n dfsComponent(graph, neighbor, visited, component);\n }\n }\n}\n\n/**\n * Find the number of connected components\n * @param graph - The input graph (must be undirected)\n * @returns The number of connected components in the graph\n */\nexport function numberOfConnectedComponents(graph: Graph): number {\n return connectedComponents(graph).length;\n}\n\n/**\n * Check if the graph is connected (has exactly one connected component)\n * @param graph - The input graph (must be undirected)\n * @returns True if the graph is connected, false otherwise\n */\nexport function isConnected(graph: Graph): boolean {\n return numberOfConnectedComponents(graph) <= 1;\n}\n\n/**\n * Find the largest connected component\n * @param graph - The input graph (must be undirected)\n * @returns Array of node IDs in the largest connected component\n */\nexport function largestConnectedComponent(graph: Graph): NodeId[] {\n const components = connectedComponents(graph);\n\n if (components.length === 0) {\n return [];\n }\n\n return components.reduce((largest, current) => (current.length > largest.length ? current : largest));\n}\n\n/**\n * Get the connected component containing a specific node\n * @param graph - The input graph (must be undirected)\n * @param nodeId - The node ID to find the component for\n * @returns Array of node IDs in the same component as the specified node\n */\nexport function getConnectedComponent(graph: Graph, nodeId: NodeId): NodeId[] {\n if (!graph.hasNode(nodeId)) {\n throw new Error(`Node ${String(nodeId)} not found in graph`);\n }\n\n if (graph.isDirected) {\n throw new Error(\"Connected components algorithm requires an undirected graph\");\n }\n\n const visited = new Set<NodeId>();\n const component: NodeId[] = [];\n\n dfsComponent(graph, nodeId, visited, component);\n\n return component;\n}\n\n/**\n * Find strongly connected components using Tarjan's algorithm\n * @param graph - The input graph (must be directed)\n * @returns Array of strongly connected components, each containing an array of node IDs\n */\nexport function stronglyConnectedComponents(graph: Graph): NodeId[][] {\n if (!graph.isDirected) {\n throw new Error(\"Strongly connected components require a directed graph\");\n }\n\n const nodes = Array.from(graph.nodes()).map((node) => node.id);\n const components: NodeId[][] = [];\n const indices = new Map<NodeId, number>();\n const lowLinks = new Map<NodeId, number>();\n const onStack = new Set<NodeId>();\n const stack: NodeId[] = [];\n let index = 0;\n\n function tarjanSCC(nodeId: NodeId): void {\n // Set the depth index for this node\n indices.set(nodeId, index);\n lowLinks.set(nodeId, index);\n index++;\n stack.push(nodeId);\n onStack.add(nodeId);\n\n // Consider successors\n for (const neighbor of Array.from(graph.neighbors(nodeId))) {\n if (!indices.has(neighbor)) {\n // Successor has not yet been visited; recurse on it\n tarjanSCC(neighbor);\n const nodeLL = lowLinks.get(nodeId) ?? 0;\n const neighborLL = lowLinks.get(neighbor) ?? 0;\n lowLinks.set(nodeId, Math.min(nodeLL, neighborLL));\n } else if (onStack.has(neighbor)) {\n // Successor is in stack and hence in the current SCC\n const nodeLL = lowLinks.get(nodeId) ?? 0;\n const neighborIndex = indices.get(neighbor) ?? 0;\n lowLinks.set(nodeId, Math.min(nodeLL, neighborIndex));\n }\n }\n\n // If nodeId is a root node, pop the stack and create an SCC\n const nodeIndex = indices.get(nodeId) ?? 0;\n const nodeLowLink = lowLinks.get(nodeId) ?? 0;\n\n if (nodeLowLink === nodeIndex) {\n const component: NodeId[] = [];\n let w: NodeId;\n\n do {\n const popped = stack.pop();\n if (popped === undefined) {\n break;\n }\n\n w = popped;\n\n onStack.delete(w);\n component.push(w);\n } while (w !== nodeId);\n\n components.push(component);\n }\n }\n\n for (const nodeId of nodes) {\n if (!indices.has(nodeId)) {\n tarjanSCC(nodeId);\n }\n }\n\n return components;\n}\n\n/**\n * Check if a directed graph is strongly connected\n * @param graph - The input graph (must be directed)\n * @returns True if the graph is strongly connected, false otherwise\n */\nexport function isStronglyConnected(graph: Graph): boolean {\n if (!graph.isDirected) {\n throw new Error(\"Strong connectivity check requires a directed graph\");\n }\n\n const components = stronglyConnectedComponents(graph);\n return components.length <= 1;\n}\n\n/**\n * Find weakly connected components in a directed graph\n * (treat the graph as undirected for connectivity)\n * @param graph - The input graph (must be directed)\n * @returns Array of weakly connected components, each containing an array of node IDs\n */\nexport function weaklyConnectedComponents(graph: Graph): NodeId[][] {\n if (!graph.isDirected) {\n throw new Error(\n \"Weakly connected components are for directed graphs. Use connectedComponents for undirected graphs.\",\n );\n }\n\n const nodes = Array.from(graph.nodes()).map((node) => node.id);\n\n if (nodes.length === 0) {\n return [];\n }\n\n const unionFind = new UnionFind(nodes);\n\n // Union nodes connected by edges (ignore direction)\n for (const edge of Array.from(graph.edges())) {\n unionFind.union(edge.source, edge.target);\n }\n\n return unionFind.getAllComponents();\n}\n\n/**\n * Check if a directed graph is weakly connected\n * @param graph - The input graph (must be directed)\n * @returns True if the graph is weakly connected, false otherwise\n */\nexport function isWeaklyConnected(graph: Graph): boolean {\n if (!graph.isDirected) {\n throw new Error(\"Weak connectivity check requires a directed graph\");\n }\n\n return weaklyConnectedComponents(graph).length <= 1;\n}\n\n/**\n * Find condensation graph (quotient graph of strongly connected components)\n * @param graph - The input graph (must be directed)\n * @returns Object containing the condensed graph, component map, and component arrays\n */\nexport function condensationGraph(graph: Graph): {\n condensedGraph: Graph;\n componentMap: Map<NodeId, number>;\n components: NodeId[][];\n} {\n if (!graph.isDirected) {\n throw new Error(\"Condensation graph requires a directed graph\");\n }\n\n const components = stronglyConnectedComponents(graph);\n const componentMap = new Map<NodeId, number>();\n const condensedGraph = new (graph.constructor as new (config: { directed: boolean }) => Graph)({ directed: true });\n\n // Map each node to its component index\n for (let i = 0; i < components.length; i++) {\n const component = components[i];\n if (component) {\n for (const nodeId of component) {\n componentMap.set(nodeId, i);\n }\n // Add component as a node in condensed graph\n condensedGraph.addNode(i);\n }\n }\n\n // Add edges between components\n const addedEdges = new Set<string>();\n\n for (const edge of Array.from(graph.edges())) {\n const sourceComponent = componentMap.get(edge.source);\n const targetComponent = componentMap.get(edge.target);\n\n if (sourceComponent !== undefined && targetComponent !== undefined && sourceComponent !== targetComponent) {\n const edgeKey = `${String(sourceComponent)}-${String(targetComponent)}`;\n\n if (!addedEdges.has(edgeKey)) {\n condensedGraph.addEdge(sourceComponent, targetComponent);\n addedEdges.add(edgeKey);\n }\n }\n }\n\n return {\n condensedGraph,\n componentMap,\n components,\n };\n}\n","import { Graph } from \"../../core/graph.js\";\nimport { UnionFind } from \"../../data-structures/union-find.js\";\nimport type { Edge } from \"../../types/index.js\";\n\nexport interface MSTResult {\n edges: Edge[];\n totalWeight: number;\n}\n\n/**\n * Computes the minimum spanning tree of an undirected graph using Kruskal's algorithm.\n * The algorithm sorts edges by weight and greedily adds edges that don't create cycles,\n * using a union-find data structure to efficiently detect cycles.\n * @param graph - The undirected graph to compute the MST for\n * @returns The minimum spanning tree as a set of edges and the total weight\n * @throws Error if the graph is directed or not connected\n */\nexport function kruskalMST(graph: Graph): MSTResult {\n if (graph.isDirected) {\n throw new Error(\"Kruskal's algorithm requires an undirected graph\");\n }\n\n const edges: Edge[] = [];\n const visitedEdges = new Set<string>();\n\n for (const edge of Array.from(graph.edges())) {\n const edgeKey =\n edge.source < edge.target\n ? `${String(edge.source)}-${String(edge.target)}`\n : `${String(edge.target)}-${String(edge.source)}`;\n\n if (!visitedEdges.has(edgeKey)) {\n visitedEdges.add(edgeKey);\n edges.push(edge);\n }\n }\n\n edges.sort((a, b) => (a.weight ?? 0) - (b.weight ?? 0));\n\n const nodes = Array.from(graph.nodes()).map((n) => n.id);\n const uf = new UnionFind(nodes);\n\n const mstEdges: Edge[] = [];\n let totalWeight = 0;\n\n for (const edge of edges) {\n if (!uf.connected(edge.source, edge.target)) {\n uf.union(edge.source, edge.target);\n mstEdges.push(edge);\n totalWeight += edge.weight ?? 0;\n\n if (mstEdges.length === graph.nodeCount - 1) {\n break;\n }\n }\n }\n\n if (mstEdges.length !== graph.nodeCount - 1) {\n throw new Error(\"Graph is not connected\");\n }\n\n return {\n edges: mstEdges,\n totalWeight,\n };\n}\n\n/**\n * Alias for kruskalMST. Computes the minimum spanning tree of an undirected graph.\n * @param graph - The undirected graph to compute the MST for\n * @returns The minimum spanning tree as a set of edges and the total weight\n * @throws Error if the graph is directed or not connected\n */\nexport function minimumSpanningTree(graph: Graph): MSTResult {\n return kruskalMST(graph);\n}\n","import { Graph } from \"../../core/graph.js\";\nimport { PriorityQueue } from \"../../data-structures/priority-queue.js\";\nimport type { Edge, NodeId } from \"../../types/index.js\";\nimport type { MSTResult } from \"./kruskal.js\";\n\n/**\n * Computes the minimum spanning tree of an undirected graph using Prim's algorithm.\n * The algorithm grows the MST from a starting node by repeatedly adding the minimum\n * weight edge that connects a node in the tree to a node outside the tree.\n * @param graph - The undirected graph to compute the MST for\n * @param startNode - Optional starting node; if not provided, uses the first node in the graph\n * @returns The minimum spanning tree as a set of edges and the total weight\n * @throws Error if the graph is directed, the start node is not found, or the graph is not connected\n */\nexport function primMST(graph: Graph, startNode?: NodeId): MSTResult {\n if (graph.isDirected) {\n throw new Error(\"Prim's algorithm requires an undirected graph\");\n }\n\n const nodes = Array.from(graph.nodes());\n if (nodes.length === 0) {\n return {\n edges: [],\n totalWeight: 0,\n };\n }\n\n const start = startNode ?? nodes[0]?.id;\n if (!start) {\n return {\n edges: [],\n totalWeight: 0,\n };\n }\n\n if (!graph.hasNode(start)) {\n throw new Error(`Start node ${String(start)} not found in graph`);\n }\n\n const visited = new Set<NodeId>();\n const mstEdges: Edge[] = [];\n let totalWeight = 0;\n\n const pq = new PriorityQueue<Edge>();\n\n visited.add(start);\n\n for (const neighbor of Array.from(graph.neighbors(start))) {\n const edge = graph.getEdge(start, neighbor);\n if (edge) {\n pq.enqueue(edge, edge.weight ?? 0);\n }\n }\n\n while (!pq.isEmpty() && mstEdges.length < graph.nodeCount - 1) {\n const edge = pq.dequeue();\n if (!edge) {\n continue;\n }\n\n const unvisitedNode = visited.has(edge.source) ? edge.target : edge.source;\n\n if (visited.has(unvisitedNode)) {\n continue;\n }\n\n visited.add(unvisitedNode);\n mstEdges.push(edge);\n totalWeight += edge.weight ?? 0;\n\n for (const neighbor of Array.from(graph.neighbors(unvisitedNode))) {\n if (!visited.has(neighbor)) {\n const neighborEdge = graph.getEdge(unvisitedNode, neighbor);\n if (neighborEdge) {\n pq.enqueue(neighborEdge, neighborEdge.weight ?? 0);\n }\n }\n }\n }\n\n if (mstEdges.length !== graph.nodeCount - 1) {\n throw new Error(\"Graph is not connected\");\n }\n\n return {\n edges: mstEdges,\n totalWeight,\n };\n}\n","import { Graph } from \"../../core/graph.js\";\nimport type { CommunityResult, ComponentResult, GirvanNewmanOptions, NodeId } from \"../../types/index.js\";\nimport { connectedComponents } from \"../components/connected.js\";\n\n/**\n * Girvan-Newman community detection algorithm\n *\n * Implements the Girvan-Newman method for community detection by iteratively\n * removing edges with the highest betweenness centrality until the graph\n * splits into disconnected components.\n *\n * This is a divisive hierarchical clustering algorithm that produces a\n * dendrogram of community structures.\n *\n * References:\n * - Girvan, M., & Newman, M. E. J. (2002). Community structure in social\n * and biological networks. Proceedings of the National Academy of Sciences,\n * 99(12), 7821-7826.\n * @param graph - The input graph\n * @param options - Algorithm options\n * @returns Array of community detection results representing the dendrogram\n */\nexport function girvanNewman(graph: Graph, options: GirvanNewmanOptions = {}): CommunityResult[] {\n const { maxCommunities } = options;\n const minCommunitySize = options.minCommunitySize ?? 1;\n const maxIterations = options.maxIterations ?? 100; // Prevent infinite loops\n\n const dendrogram: CommunityResult[] = [];\n const workingGraph = graph.clone();\n let iterations = 0;\n\n // Initial state: one large component\n let components = getConnectedComponentsResult(workingGraph);\n dendrogram.push({\n communities: components.components.filter((community) => community.length >= minCommunitySize),\n modularity: calculateModularity(graph, components.componentMap),\n });\n\n while (Array.from(workingGraph.edges()).length > 0 && iterations < maxIterations) {\n iterations++;\n // Calculate edge betweenness centrality\n const { betweenness: edgeBetweenness, edgeEndpoints } = calculateEdgeBetweenness(workingGraph);\n\n if (edgeBetweenness.size === 0) {\n break;\n }\n\n // Find edges with maximum betweenness\n const maxBetweenness = Math.max(...edgeBetweenness.values());\n const edgesToRemove: { source: NodeId; target: NodeId }[] = [];\n\n for (const [edgeKey, centrality] of edgeBetweenness) {\n if (Math.abs(centrality - maxBetweenness) < 1e-10) {\n // Use original edge endpoints to preserve node ID types (number vs string)\n const endpoints = edgeEndpoints.get(edgeKey);\n if (endpoints) {\n edgesToRemove.push(endpoints);\n }\n }\n }\n\n // Remove edges with highest betweenness\n for (const { source, target } of edgesToRemove) {\n workingGraph.removeEdge(source, target);\n }\n\n // Find new connected components (communities)\n components = getConnectedComponentsResult(workingGraph);\n\n // Filter communities by minimum size\n const validCommunities = components.components.filter((community) => community.length >= minCommunitySize);\n\n // Calculate modularity for the new community structure\n const modularity = calculateModularity(graph, components.componentMap);\n\n dendrogram.push({\n communities: validCommunities,\n modularity,\n });\n\n // Stop if desired number of communities reached\n if (maxCommunities && validCommunities.length >= maxCommunities) {\n break;\n }\n\n // Stop if no more meaningful communities can be formed\n if (validCommunities.length === workingGraph.nodeCount) {\n break;\n }\n }\n\n return dendrogram;\n}\n\n/**\n * Edge betweenness result containing centrality values and original edge endpoints\n */\ninterface EdgeBetweennessResult {\n betweenness: Map<string, number>;\n edgeEndpoints: Map<string, { source: NodeId; target: NodeId }>;\n}\n\n/**\n * Calculate edge betweenness centrality for all edges in the graph\n *\n * Edge betweenness is the fraction of shortest paths that pass through the edge.\n * We adapt node betweenness centrality calculation to work with edges.\n * @param graph - The input graph to analyze\n * @returns Object with betweenness map and edge endpoints map (preserving original ID types)\n */\nfunction calculateEdgeBetweenness(graph: Graph): EdgeBetweennessResult {\n const edgeBetweenness = new Map<string, number>();\n const edgeEndpoints = new Map<string, { source: NodeId; target: NodeId }>();\n\n // Initialize all edges with 0 betweenness and store original endpoints\n for (const edge of graph.edges()) {\n const edgeKey = getEdgeKey(edge.source, edge.target);\n edgeBetweenness.set(edgeKey, 0);\n edgeEndpoints.set(edgeKey, { source: edge.source, target: edge.target });\n }\n\n // For each node as source, calculate shortest paths and accumulate edge betweenness\n for (const sourceNode of graph.nodes()) {\n const source = sourceNode.id;\n\n // Run BFS to find all shortest paths from source\n const { distances, predecessors, pathCounts } = findAllShortestPaths(graph, source);\n\n // Calculate dependency for each node and accumulate edge betweenness\n const dependency = new Map<NodeId, number>();\n\n // Initialize dependency\n for (const node of graph.nodes()) {\n dependency.set(node.id, 0);\n }\n\n // Process nodes in order of decreasing distance\n const sortedNodes = Array.from(distances.keys())\n .filter((node) => {\n const distance = distances.get(node);\n return distance !== undefined && distance < Infinity;\n })\n .sort((a, b) => {\n const distanceA = distances.get(a);\n const distanceB = distances.get(b);\n if (distanceA === undefined || distanceB === undefined) {\n return 0;\n }\n\n return distanceB - distanceA;\n });\n\n for (const node of sortedNodes) {\n if (node === source) {\n continue;\n }\n\n const nodeDependency = dependency.get(node);\n const nodePathCount = pathCounts.get(node);\n\n if (nodeDependency === undefined || nodePathCount === undefined) {\n continue;\n }\n\n // Distribute dependency to predecessors\n const nodePredecessors = predecessors.get(node) ?? [];\n for (const predecessor of nodePredecessors) {\n const predPathCount = pathCounts.get(predecessor);\n if (predPathCount === undefined) {\n continue;\n }\n\n const edgeDependency = (predPathCount / nodePathCount) * (1 + nodeDependency);\n\n // Update predecessor dependency\n const currentDependency = dependency.get(predecessor);\n if (currentDependency !== undefined) {\n dependency.set(predecessor, currentDependency + edgeDependency);\n }\n\n // Update edge betweenness\n const edgeKey = getEdgeKey(predecessor, node);\n const currentBetweenness = edgeBetweenness.get(edgeKey) ?? 0;\n edgeBetweenness.set(edgeKey, currentBetweenness + edgeDependency);\n }\n }\n }\n\n // Normalize: divide by 2 for undirected graphs (each edge counted twice)\n if (!graph.isDirected) {\n for (const [edgeKey, betweenness] of edgeBetweenness) {\n edgeBetweenness.set(edgeKey, betweenness / 2);\n }\n }\n\n return { betweenness: edgeBetweenness, edgeEndpoints };\n}\n\n/**\n * Find all shortest paths from a source node using optimized BFS\n * @param graph - The input graph to search\n * @param source - The source node to compute shortest paths from\n * @returns Object containing distances, predecessors, and path counts\n */\nfunction findAllShortestPaths(\n graph: Graph,\n source: NodeId,\n): {\n distances: Map<NodeId, number>;\n predecessors: Map<NodeId, NodeId[]>;\n pathCounts: Map<NodeId, number>;\n} {\n const distances = new Map<NodeId, number>();\n const predecessors = new Map<NodeId, NodeId[]>();\n const pathCounts = new Map<NodeId, number>();\n const queue: NodeId[] = [];\n const visited = new Set<NodeId>();\n\n // Only initialize for reachable nodes\n distances.set(source, 0);\n predecessors.set(source, []);\n pathCounts.set(source, 1);\n queue.push(source);\n\n // Optimized BFS with early termination\n let queueIndex = 0;\n while (queueIndex < queue.length) {\n const current = queue[queueIndex++];\n if (!current) {\n continue;\n }\n\n if (visited.has(current)) {\n continue;\n }\n\n visited.add(current);\n\n const currentDistance = distances.get(current);\n if (currentDistance === undefined) {\n continue;\n }\n\n for (const neighbor of graph.neighbors(current)) {\n // Skip if already processed\n if (visited.has(neighbor)) {\n continue;\n }\n\n const edgeWeight = 1; // Unweighted for community detection\n const newDistance = currentDistance + edgeWeight;\n const neighborDistance = distances.get(neighbor) ?? Infinity;\n\n if (newDistance < neighborDistance) {\n // Found shorter path\n distances.set(neighbor, newDistance);\n predecessors.set(neighbor, [current]);\n const currentPathCount = pathCounts.get(current);\n if (currentPathCount !== undefined) {\n pathCounts.set(neighbor, currentPathCount);\n }\n\n queue.push(neighbor);\n } else if (newDistance === neighborDistance) {\n // Found alternative shortest path\n const neighborPredecessors = predecessors.get(neighbor);\n if (neighborPredecessors) {\n neighborPredecessors.push(current);\n const currentPathCount = pathCounts.get(current);\n if (currentPathCount !== undefined) {\n pathCounts.set(neighbor, (pathCounts.get(neighbor) ?? 0) + currentPathCount);\n }\n }\n }\n }\n }\n\n return { distances, predecessors, pathCounts };\n}\n\n/**\n * Generate a consistent edge key for undirected graphs\n * @param source - The source node ID\n * @param target - The target node ID\n * @returns A consistent string key for the edge (ordered alphabetically)\n */\nfunction getEdgeKey(source: NodeId, target: NodeId): string {\n // For undirected graphs, ensure consistent ordering\n const sourceStr = String(source);\n const targetStr = String(target);\n\n if (sourceStr <= targetStr) {\n return `${sourceStr}|${targetStr}`;\n }\n\n return `${targetStr}|${sourceStr}`;\n}\n\n/**\n * Calculate modularity for a given community structure - optimized version\n * @param graph - The original graph\n * @param communityMap - Map from node IDs to community indices\n * @returns The modularity score of the partition\n */\nfunction calculateModularity(graph: Graph, communityMap: Map<NodeId, number>): number {\n const totalEdgeWeight = getTotalEdgeWeight(graph);\n if (totalEdgeWeight === 0) {\n return 0;\n }\n\n let modularity = 0;\n const degrees = new Map<NodeId, number>();\n\n // Pre-calculate all degrees\n for (const node of graph.nodes()) {\n degrees.set(node.id, getNodeDegree(graph, node.id));\n }\n\n // Only iterate over existing edges\n for (const edge of graph.edges()) {\n const communityI = communityMap.get(edge.source);\n const communityJ = communityMap.get(edge.target);\n\n if (communityI === communityJ) {\n const edgeWeight = edge.weight ?? 1;\n const degreeI = degrees.get(edge.source);\n const degreeJ = degrees.get(edge.target);\n if (degreeI === undefined || degreeJ === undefined) {\n continue;\n }\n\n modularity += edgeWeight - (degreeI * degreeJ) / (2 * totalEdgeWeight);\n }\n }\n\n return modularity / (2 * totalEdgeWeight);\n}\n\n/**\n * Calculate total edge weight in the graph\n * @param graph - The input graph\n * @returns Total sum of all edge weights\n */\nfunction getTotalEdgeWeight(graph: Graph): number {\n let totalWeight = 0;\n\n for (const edge of graph.edges()) {\n totalWeight += edge.weight ?? 1;\n }\n\n return totalWeight;\n}\n\n/**\n * Get the total degree (sum of edge weights) for a node\n * @param graph - The input graph\n * @param nodeId - The node ID to compute degree for\n * @returns The weighted degree of the node\n */\nfunction getNodeDegree(graph: Graph, nodeId: NodeId): number {\n let degree = 0;\n\n for (const neighbor of graph.neighbors(nodeId)) {\n const edge = graph.getEdge(nodeId, neighbor);\n degree += edge?.weight ?? 1;\n }\n\n return degree;\n}\n\n/**\n * Convert connected components result to ComponentResult format\n * @param graph - The input graph\n * @returns Object containing components array and node-to-component map\n */\nfunction getConnectedComponentsResult(graph: Graph): ComponentResult {\n const components = connectedComponents(graph);\n const componentMap = new Map<NodeId, number>();\n\n components.forEach((component, index) => {\n component.forEach((nodeId) => {\n componentMap.set(nodeId, index);\n });\n });\n\n return { components, componentMap };\n}\n","import { Graph } from \"../core/graph.js\";\nimport type { NodeId } from \"../types/index.js\";\n\n/**\n * Convert Graph class to Map representation\n * Used by community detection and flow algorithms\n * @param graph - The Graph instance to convert\n * @returns A nested Map where outer keys are source nodes and inner maps contain target nodes with edge weights\n */\nexport function graphToMap(graph: Graph): Map<string, Map<string, number>> {\n const map = new Map<string, Map<string, number>>();\n\n // Initialize all nodes\n for (const node of graph.nodes()) {\n map.set(String(node.id), new Map());\n }\n\n // Add edges with weights\n for (const edge of graph.edges()) {\n const source = String(edge.source);\n const target = String(edge.target);\n const weight = edge.weight ?? 1;\n\n const sourceMap = map.get(source);\n if (sourceMap) {\n sourceMap.set(target, weight);\n }\n\n // For undirected graphs, add reverse edge\n if (!graph.isDirected) {\n const targetMap = map.get(target);\n if (targetMap) {\n targetMap.set(source, weight);\n }\n }\n }\n\n return map;\n}\n\n/**\n * Convert Map representation to Graph class\n * @param map - The nested Map representation of the graph\n * @param isDirected - Whether the resulting graph should be directed (defaults to true)\n * @returns A new Graph instance with nodes and edges from the map\n */\nexport function mapToGraph(map: Map<string, Map<string, number>>, isDirected = true): Graph {\n const graph = new Graph({ directed: isDirected });\n\n // Add all nodes first\n for (const node of map.keys()) {\n graph.addNode(node);\n }\n\n // Add edges\n const processedEdges = new Set<string>();\n\n for (const [source, neighbors] of map) {\n for (const [target, weight] of neighbors) {\n const edgeKey = isDirected ? `${source}->${target}` : [source, target].sort().join(\"-\");\n\n // Skip if we've already processed this edge (for undirected graphs)\n if (!isDirected && processedEdges.has(edgeKey)) {\n continue;\n }\n\n graph.addEdge(source, target, weight);\n processedEdges.add(edgeKey);\n }\n }\n\n return graph;\n}\n\n/**\n * Adapter for using Graph algorithms with Map representation\n * Implements a subset of Graph interface methods needed by algorithms\n */\nexport class GraphAdapter {\n private map: Map<string, Map<string, number>>;\n public readonly isDirected: boolean;\n\n /**\n * Creates a new GraphAdapter instance wrapping a Map representation.\n * @param map - The nested Map representation of the graph\n * @param isDirected - Whether the graph should be treated as directed (defaults to true)\n */\n constructor(map: Map<string, Map<string, number>>, isDirected = true) {\n this.map = map;\n this.isDirected = isDirected;\n }\n\n /**\n * Get all nodes\n * @returns Array of node objects with their ids\n */\n nodes(): { id: NodeId }[] {\n return Array.from(this.map.keys()).map((id) => ({ id }));\n }\n\n /**\n * Get node count\n * @returns The total number of nodes in the graph\n */\n get nodeCount(): number {\n return this.map.size;\n }\n\n /**\n * Check if node exists\n * @param nodeId - The id of the node to check\n * @returns True if the node exists, false otherwise\n */\n hasNode(nodeId: NodeId): boolean {\n return this.map.has(String(nodeId));\n }\n\n /**\n * Get neighbors of a node\n * @param nodeId - The id of the node to get neighbors for\n * @returns Array of neighbor node ids\n */\n neighbors(nodeId: NodeId): NodeId[] {\n const neighbors = this.map.get(String(nodeId));\n if (!neighbors) {\n return [];\n }\n\n return Array.from(neighbors.keys());\n }\n\n /**\n * Get edge between two nodes\n * @param source - The source node id\n * @param target - The target node id\n * @returns The edge object with source, target and weight, or null if no edge exists\n */\n getEdge(source: NodeId, target: NodeId): { source: NodeId; target: NodeId; weight?: number } | null {\n const sourceNeighbors = this.map.get(String(source));\n if (!sourceNeighbors) {\n return null;\n }\n\n const weight = sourceNeighbors.get(String(target));\n if (weight === undefined) {\n return null;\n }\n\n return { source, target, weight };\n }\n\n /**\n * Check if edge exists\n * @param source - The source node id\n * @param target - The target node id\n * @returns True if an edge exists between source and target, false otherwise\n */\n hasEdge(source: NodeId, target: NodeId): boolean {\n const sourceNeighbors = this.map.get(String(source));\n if (!sourceNeighbors) {\n return false;\n }\n\n return sourceNeighbors.has(String(target));\n }\n\n /**\n * Get all edges\n * @returns Array of edge objects with source, target and optional weight\n */\n edges(): { source: NodeId; target: NodeId; weight?: number }[] {\n const edges: { source: NodeId; target: NodeId; weight?: number }[] = [];\n const processedEdges = new Set<string>();\n\n for (const [source, neighbors] of this.map) {\n for (const [target, weight] of neighbors) {\n const edgeKey = this.isDirected ? `${source}->${target}` : [source, target].sort().join(\"-\");\n\n // Skip if we've already processed this edge (for undirected graphs)\n if (!this.isDirected && processedEdges.has(edgeKey)) {\n continue;\n }\n\n edges.push({ source, target, weight });\n processedEdges.add(edgeKey);\n }\n }\n\n return edges;\n }\n\n /**\n * Get edge count\n * @returns The total number of edges in the graph\n */\n get edgeCount(): number {\n if (this.isDirected) {\n let count = 0;\n for (const neighbors of this.map.values()) {\n count += neighbors.size;\n }\n return count;\n }\n\n // For undirected graphs, count each edge once\n let count = 0;\n const counted = new Set<string>();\n\n for (const [source, neighbors] of this.map) {\n for (const target of neighbors.keys()) {\n const edgeKey = [source, target].sort().join(\"-\");\n if (!counted.has(edgeKey)) {\n counted.add(edgeKey);\n count++;\n }\n }\n }\n return count;\n }\n\n /**\n * Get node degree\n * @param nodeId - The id of the node to get degree for\n * @returns The number of edges connected to the node\n */\n degree(nodeId: NodeId): number {\n const neighbors = this.map.get(String(nodeId));\n return neighbors ? neighbors.size : 0;\n }\n\n /**\n * Get in-degree (for directed graphs)\n * @param nodeId - The id of the node to get in-degree for\n * @returns The number of incoming edges to the node\n */\n inDegree(nodeId: NodeId): number {\n if (!this.isDirected) {\n return this.degree(nodeId);\n }\n\n let count = 0;\n const targetId = String(nodeId);\n\n for (const neighbors of this.map.values()) {\n if (neighbors.has(targetId)) {\n count++;\n }\n }\n\n return count;\n }\n\n /**\n * Get out-degree (for directed graphs)\n * @param nodeId - The id of the node to get out-degree for\n * @returns The number of outgoing edges from the node\n */\n outDegree(nodeId: NodeId): number {\n return this.degree(nodeId);\n }\n\n /**\n * Get underlying map representation\n * @returns The internal Map representation of the graph\n */\n getMap(): Map<string, Map<string, number>> {\n return this.map;\n }\n}\n","/**\n * Seeded random number generator for reproducible results\n */\nexport class SeededRandom {\n private seed: number;\n private readonly m = 0x80000000; // 2**31\n private readonly a = 1103515245;\n private readonly c = 12345;\n\n /**\n * Creates a new SeededRandom instance with the given seed.\n * @param seed - The seed value for reproducible random number generation\n */\n constructor(seed: number) {\n // Handle negative seeds correctly\n this.seed = ((seed % this.m) + this.m) % this.m;\n }\n\n /**\n * Generate next random number between 0 and 1\n * @returns A pseudo-random number in the range [0, 1]\n */\n next(): number {\n this.seed = (this.a * this.seed + this.c) % this.m;\n return this.seed / (this.m - 1);\n }\n\n /**\n * Create a generator function for backward compatibility\n * @param seed - The seed value for reproducible random number generation\n * @returns A function that returns the next random number when called\n */\n static createGenerator(seed: number): () => number {\n const rng = new SeededRandom(seed);\n return () => rng.next();\n }\n}\n\n/**\n * Fisher-Yates shuffle algorithm\n * @param array - Array to shuffle (will be modified in place)\n * @param rng - Optional random number generator (defaults to Math.random)\n * @returns The shuffled array (same reference as input)\n */\nexport function shuffle<T>(array: T[], rng: () => number = Math.random): T[] {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(rng() * (i + 1));\n const temp = array[i];\n const tempJ = array[j];\n if (temp !== undefined && tempJ !== undefined) {\n array[i] = tempJ;\n array[j] = temp;\n }\n }\n return array;\n}\n\n/**\n * Calculate Euclidean distance between two vectors\n * @param a - First vector\n * @param b - Second vector\n * @returns Euclidean distance\n * @throws Error if vectors have different lengths\n */\nexport function euclideanDistance(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error(\"Vectors must have same length\");\n }\n\n let sum = 0;\n for (let i = 0; i < a.length; i++) {\n const aVal = a[i];\n const bVal = b[i];\n if (aVal !== undefined && bVal !== undefined) {\n const diff = aVal - bVal;\n sum += diff * diff;\n }\n }\n return Math.sqrt(sum);\n}\n\nexport const normalize = {\n /**\n * Min-max normalization to [0, 1] range\n * @param values - Map of values to normalize in place\n */\n minMax(values: Map<string, number>): void {\n const vals = Array.from(values.values());\n const min = Math.min(...vals);\n const max = Math.max(...vals);\n const range = max - min;\n\n if (range === 0) {\n return;\n }\n\n for (const [key, value] of values) {\n values.set(key, (value - min) / range);\n }\n },\n\n /**\n * Normalize by maximum value\n * @param values - Map of values to normalize in place\n */\n byMax(values: Map<string, number>): void {\n const max = Math.max(...values.values());\n if (max === 0) {\n return;\n }\n\n for (const [key, value] of values) {\n values.set(key, value / max);\n }\n },\n\n /**\n * L2 (Euclidean) normalization\n * @param values - Map of values to normalize in place\n */\n l2Norm(values: Map<string, number>): void {\n const sumSquares = Array.from(values.values()).reduce((sum, val) => sum + val * val, 0);\n const norm = Math.sqrt(sumSquares);\n\n if (norm === 0) {\n return;\n }\n\n for (const [key, value] of values) {\n values.set(key, value / norm);\n }\n },\n\n /**\n * Normalize to sum to 1\n * @param values - Map of values to normalize in place\n */\n sumToOne(values: Map<string, number>): void {\n const sum = Array.from(values.values()).reduce((acc, val) => acc + val, 0);\n\n if (sum === 0) {\n return;\n }\n\n for (const [key, value] of values) {\n values.set(key, value / sum);\n }\n },\n};\n","/**\n * Label Propagation Algorithm for Community Detection\n *\n * A fast, near-linear time algorithm that detects communities by\n * propagating labels through the network. Each node adopts the label\n * that most of its neighbors have.\n *\n * Reference: Raghavan et al. (2007) \"Near linear time algorithm to\n * detect community structures in large-scale networks\"\n */\n\nimport type { Graph } from \"../../core/graph.js\";\nimport { graphToMap } from \"../../utils/graph-converters.js\";\nimport { SeededRandom, shuffle } from \"../../utils/math-utilities.js\";\n\nexport interface LabelPropagationOptions {\n maxIterations?: number;\n randomSeed?: number;\n}\n\nexport interface LabelPropagationResult {\n communities: Map<string, number>;\n iterations: number;\n converged: boolean;\n}\n\n/**\n * Internal implementation of Label Propagation Algorithm\n * @param graph - Map representation of the graph (node to neighbors with weights)\n * @param options - Algorithm configuration options\n * @returns Community assignments, iteration count, and convergence status\n */\nfunction labelPropagationImpl(\n graph: Map<string, Map<string, number>>,\n options: LabelPropagationOptions = {},\n): LabelPropagationResult {\n const { maxIterations = 100, randomSeed = 42 } = options;\n\n if (graph.size === 0) {\n return {\n communities: new Map(),\n iterations: 0,\n converged: true,\n };\n }\n\n // Initialize random number generator\n const random = SeededRandom.createGenerator(randomSeed);\n\n // Initialize labels - each node gets its own label\n const labels = new Map<string, number>();\n const nodes = Array.from(graph.keys());\n nodes.forEach((node, i) => labels.set(node, i));\n\n let iterations = 0;\n let converged = false;\n\n // Main loop\n while (iterations < maxIterations && !converged) {\n iterations++;\n converged = true;\n\n // Create random order for node updates\n const nodeOrder = [...nodes];\n shuffle(nodeOrder, random);\n\n // Update each node's label\n for (const node of nodeOrder) {\n const neighbors = graph.get(node);\n if (!neighbors || neighbors.size === 0) {\n continue;\n }\n\n // Count label frequencies among neighbors\n const labelCounts = new Map<number, number>();\n let maxCount = 0;\n const candidateLabels: number[] = [];\n\n for (const [neighbor, weight] of neighbors) {\n const neighborLabel = labels.get(neighbor);\n if (neighborLabel === undefined) {\n continue;\n }\n\n const count = (labelCounts.get(neighborLabel) ?? 0) + weight;\n labelCounts.set(neighborLabel, count);\n\n if (count > maxCount) {\n maxCount = count;\n candidateLabels.length = 0;\n candidateLabels.push(neighborLabel);\n } else if (count === maxCount) {\n candidateLabels.push(neighborLabel);\n }\n }\n\n // Choose label (break ties randomly)\n const currentLabel = labels.get(node);\n if (currentLabel === undefined) {\n continue;\n }\n\n let newLabel = currentLabel;\n\n if (candidateLabels.length > 0) {\n // Include current label if it has max count\n if (labelCounts.get(currentLabel) === maxCount) {\n candidateLabels.push(currentLabel);\n }\n\n // Random selection from candidates\n const index = Math.floor(random() * candidateLabels.length);\n const selectedLabel = candidateLabels[index];\n if (selectedLabel !== undefined) {\n newLabel = selectedLabel;\n }\n }\n\n // Update label if changed\n if (newLabel !== currentLabel) {\n labels.set(node, newLabel);\n converged = false;\n }\n }\n }\n\n // Renumber communities consecutively\n const uniqueLabels = new Set(labels.values());\n const labelMap = new Map<number, number>();\n let communityId = 0;\n\n for (const label of uniqueLabels) {\n labelMap.set(label, communityId++);\n }\n\n const communities = new Map<string, number>();\n for (const [node, label] of labels) {\n const mappedLabel = labelMap.get(label);\n if (mappedLabel !== undefined) {\n communities.set(node, mappedLabel);\n }\n }\n\n return {\n communities,\n iterations,\n converged,\n };\n}\n\n/**\n * Internal implementation of Asynchronous Label Propagation\n * Updates all nodes simultaneously (can lead to oscillations)\n * @param graph - Map representation of the graph (node to neighbors with weights)\n * @param options - Algorithm configuration options\n * @returns Community assignments, iteration count, and convergence status\n */\nfunction labelPropagationAsyncImpl(\n graph: Map<string, Map<string, number>>,\n options: LabelPropagationOptions = {},\n): LabelPropagationResult {\n const { maxIterations = 100 } = options;\n\n if (graph.size === 0) {\n return {\n communities: new Map(),\n iterations: 0,\n converged: true,\n };\n }\n\n // Initialize labels\n const labels = new Map<string, number>();\n const nodes = Array.from(graph.keys());\n nodes.forEach((node, i) => labels.set(node, i));\n\n let iterations = 0;\n let converged = false;\n\n // Main loop\n while (iterations < maxIterations && !converged) {\n iterations++;\n converged = true;\n\n // Store new labels\n const newLabels = new Map<string, number>();\n\n // Update all nodes simultaneously\n for (const node of nodes) {\n const neighbors = graph.get(node);\n if (!neighbors || neighbors.size === 0) {\n const nodeLabel = labels.get(node);\n if (nodeLabel !== undefined) {\n newLabels.set(node, nodeLabel);\n }\n\n continue;\n }\n\n // Count label frequencies\n const labelCounts = new Map<number, number>();\n let maxCount = 0;\n const nodeLabel = labels.get(node);\n if (nodeLabel === undefined) {\n continue;\n }\n\n let maxLabel = nodeLabel;\n\n for (const [neighbor, weight] of neighbors) {\n const neighborLabel = labels.get(neighbor);\n if (neighborLabel === undefined) {\n continue;\n }\n\n const count = (labelCounts.get(neighborLabel) ?? 0) + weight;\n labelCounts.set(neighborLabel, count);\n\n if (count > maxCount || (count === maxCount && neighborLabel < maxLabel)) {\n maxCount = count;\n maxLabel = neighborLabel;\n }\n }\n\n newLabels.set(node, maxLabel);\n\n if (maxLabel !== labels.get(node)) {\n converged = false;\n }\n }\n\n // Apply new labels\n for (const [node, label] of newLabels) {\n labels.set(node, label);\n }\n }\n\n // Renumber communities\n const uniqueLabels = new Set(labels.values());\n const labelMap = new Map<number, number>();\n let communityId = 0;\n\n for (const label of uniqueLabels) {\n labelMap.set(label, communityId++);\n }\n\n const communities = new Map<string, number>();\n for (const [node, label] of labels) {\n const mappedLabel = labelMap.get(label);\n if (mappedLabel !== undefined) {\n communities.set(node, mappedLabel);\n }\n }\n\n return {\n communities,\n iterations,\n converged,\n };\n}\n\n/**\n * Internal implementation of Semi-supervised Label Propagation\n * Some nodes have fixed labels that don't change\n * @param graph - Map representation of the graph (node to neighbors with weights)\n * @param seedLabels - Map of node IDs to their fixed community labels\n * @param options - Algorithm configuration options\n * @returns Community assignments, iteration count, and convergence status\n */\nfunction labelPropagationSemiSupervisedImpl(\n graph: Map<string, Map<string, number>>,\n seedLabels: Map<string, number>,\n options: LabelPropagationOptions = {},\n): LabelPropagationResult {\n const { maxIterations = 100, randomSeed = 42 } = options;\n\n // Initialize random number generator\n const random = SeededRandom.createGenerator(randomSeed);\n\n // Initialize labels\n const labels = new Map<string, number>();\n const nodes = Array.from(graph.keys());\n let labelCounter = Math.max(...Array.from(seedLabels.values())) + 1;\n\n for (const node of nodes) {\n if (seedLabels.has(node)) {\n const seedLabel = seedLabels.get(node);\n if (seedLabel !== undefined) {\n labels.set(node, seedLabel);\n }\n } else {\n labels.set(node, labelCounter++);\n }\n }\n\n let iterations = 0;\n let converged = false;\n\n // Main loop\n while (iterations < maxIterations && !converged) {\n iterations++;\n converged = true;\n\n // Create random order\n const nodeOrder = nodes.filter((n) => !seedLabels.has(n));\n shuffle(nodeOrder, random);\n\n // Update non-seed nodes\n for (const node of nodeOrder) {\n const neighbors = graph.get(node);\n if (!neighbors || neighbors.size === 0) {\n continue;\n }\n\n // Count label frequencies\n const labelCounts = new Map<number, number>();\n let maxCount = 0;\n const candidateLabels: number[] = [];\n\n for (const [neighbor, weight] of neighbors) {\n const neighborLabel = labels.get(neighbor);\n if (neighborLabel === undefined) {\n continue;\n }\n\n const count = (labelCounts.get(neighborLabel) ?? 0) + weight;\n labelCounts.set(neighborLabel, count);\n\n if (count > maxCount) {\n maxCount = count;\n candidateLabels.length = 0;\n candidateLabels.push(neighborLabel);\n } else if (count === maxCount) {\n candidateLabels.push(neighborLabel);\n }\n }\n\n // Choose label\n const currentLabel = labels.get(node);\n if (currentLabel === undefined) {\n continue;\n }\n\n let newLabel = currentLabel;\n\n if (candidateLabels.length > 0) {\n const index = Math.floor(random() * candidateLabels.length);\n const selectedLabel = candidateLabels[index];\n if (selectedLabel !== undefined) {\n newLabel = selectedLabel;\n }\n }\n\n if (newLabel !== currentLabel) {\n labels.set(node, newLabel);\n converged = false;\n }\n }\n }\n\n return {\n communities: labels,\n iterations,\n converged,\n };\n}\n\n/**\n * Label Propagation Algorithm\n * Each node adopts the most frequent label among its neighbors\n * @param graph - Undirected graph (can be weighted)\n * @param options - Algorithm options\n * @returns Community assignments\n *\n * Time Complexity: O(m) per iteration, typically O(km) for k iterations\n * Space Complexity: O(n)\n */\nexport function labelPropagation(graph: Graph, options: LabelPropagationOptions = {}): LabelPropagationResult {\n // Convert Graph to Map representation\n const graphMap = graphToMap(graph);\n return labelPropagationImpl(graphMap, options);\n}\n\n/**\n * Asynchronous Label Propagation\n * Updates all nodes simultaneously (can lead to oscillations)\n * @param graph - Undirected graph (can be weighted)\n * @param options - Algorithm options\n * @returns Community assignments\n */\nexport function labelPropagationAsync(graph: Graph, options: LabelPropagationOptions = {}): LabelPropagationResult {\n // Convert Graph to Map representation\n const graphMap = graphToMap(graph);\n return labelPropagationAsyncImpl(graphMap, options);\n}\n\n/**\n * Semi-supervised Label Propagation\n * Some nodes have fixed labels that don't change\n * @param graph - Undirected graph (can be weighted)\n * @param seedLabels - Initial fixed labels for some nodes\n * @param options - Algorithm options\n * @returns Community assignments\n */\nexport function labelPropagationSemiSupervised(\n graph: Graph,\n seedLabels: Map<string, number>,\n options: LabelPropagationOptions = {},\n): LabelPropagationResult {\n // Convert Graph to Map representation\n const graphMap = graphToMap(graph);\n return labelPropagationSemiSupervisedImpl(graphMap, seedLabels, options);\n}\n","/**\n * Leiden Algorithm for Community Detection\n *\n * An improved version of the Louvain algorithm that guarantees\n * well-connected communities and provides better quality partitions.\n *\n * Reference: Traag, V.A., Waltman, L. & van Eck, N.J. (2019)\n * \"From Louvain to Leiden: guaranteeing well-connected communities\"\n */\n\nimport type { Graph } from \"../../core/graph.js\";\nimport { graphToMap } from \"../../utils/graph-converters.js\";\nimport { SeededRandom, shuffle } from \"../../utils/math-utilities.js\";\n\nexport interface LeidenOptions {\n resolution?: number;\n randomSeed?: number;\n maxIterations?: number;\n threshold?: number;\n}\n\nexport interface LeidenResult {\n communities: Map<string, number>;\n modularity: number;\n iterations: number;\n}\n\n/**\n * Internal implementation of Leiden algorithm for community detection\n * Improves upon Louvain by ensuring well-connected communities\n * @param inputGraph - Map representation of the graph (node to neighbors with weights)\n * @param options - Algorithm configuration options\n * @returns Community assignments, modularity score, and iteration count\n */\nfunction leidenImpl(inputGraph: Map<string, Map<string, number>>, options: LeidenOptions = {}): LeidenResult {\n const { resolution = 1.0, randomSeed = 42, maxIterations = 100, threshold = 1e-7 } = options;\n\n // Handle empty graph\n if (inputGraph.size === 0) {\n return {\n communities: new Map(),\n modularity: 0,\n iterations: 0,\n };\n }\n\n // Use a mutable variable for the current graph state\n let currentGraph = inputGraph;\n\n // Initialize random number generator\n const random = SeededRandom.createGenerator(randomSeed);\n\n // Calculate total weight\n let totalWeight = 0;\n const degrees = new Map<string, number>();\n\n for (const [node, neighbors] of currentGraph) {\n let degree = 0;\n for (const weight of neighbors.values()) {\n degree += weight;\n totalWeight += weight;\n }\n degrees.set(node, degree);\n }\n totalWeight /= 2; // Each edge counted twice\n\n // Initialize communities - each node in its own community\n const communities = new Map<string, number>();\n const nodes = Array.from(currentGraph.keys());\n nodes.forEach((node, i) => communities.set(node, i));\n\n let modularity = calculateModularity(currentGraph, communities, degrees, totalWeight, resolution);\n let bestModularity = modularity;\n let bestCommunities = new Map(communities);\n let iterations = 0;\n\n // Main Leiden loop\n while (iterations < maxIterations) {\n iterations++;\n let improved = false;\n\n // Phase 1: Local moving of nodes (fast)\n const nodeOrder = [...nodes];\n shuffle(nodeOrder, random);\n\n for (const node of nodeOrder) {\n const currentCommunity = communities.get(node);\n if (currentCommunity === undefined) {\n continue;\n }\n\n const neighborCommunities = getNeighborCommunities(node, currentGraph, communities);\n\n let bestCommunity = currentCommunity;\n let bestGain = 0;\n\n // Try moving to each neighbor community\n for (const [community] of neighborCommunities) {\n if (community === currentCommunity) {\n continue;\n }\n\n const gain = calculateModularityGain(\n node,\n community,\n currentGraph,\n communities,\n degrees,\n totalWeight,\n resolution,\n );\n\n if (gain > bestGain) {\n bestGain = gain;\n bestCommunity = community;\n }\n }\n\n // Move node if beneficial\n if (bestCommunity !== currentCommunity) {\n communities.set(node, bestCommunity);\n modularity += bestGain;\n improved = true;\n }\n }\n\n // Phase 2: Refinement (Leiden improvement over Louvain)\n // Create aggregate network based on current partition\n createAggregateNetwork(currentGraph, communities);\n\n // Refine partition using aggregate network\n const subsetPartition = refinePartition(currentGraph, communities);\n\n // Apply refined partition\n for (const [node, newCommunity] of subsetPartition) {\n communities.set(node, newCommunity);\n }\n\n // Recalculate modularity\n modularity = calculateModularity(currentGraph, communities, degrees, totalWeight, resolution);\n\n // Check if we've improved\n if (modularity > bestModularity + threshold) {\n bestModularity = modularity;\n bestCommunities = new Map(communities);\n improved = true;\n }\n\n if (!improved) {\n break;\n }\n\n // Phase 3: Aggregate network (create super-nodes)\n const aggregated = aggregateCommunities(currentGraph, communities);\n if (aggregated.graph.size === currentGraph.size) {\n break;\n } // No aggregation possible\n\n // Continue with aggregated network\n const { graph: aggregatedGraph } = aggregated;\n currentGraph = aggregatedGraph;\n communities.clear();\n let communityId = 0;\n for (const node of currentGraph.keys()) {\n communities.set(node, communityId++);\n }\n }\n\n // Map back to original nodes\n const finalCommunities = new Map<string, number>();\n for (const [node, community] of bestCommunities) {\n finalCommunities.set(node, community);\n }\n\n // Renumber communities consecutively\n const communityRenumber = new Map<number, number>();\n let newId = 0;\n for (const community of new Set(finalCommunities.values())) {\n communityRenumber.set(community, newId++);\n }\n for (const [node, community] of finalCommunities) {\n const newCommunityId = communityRenumber.get(community);\n if (newCommunityId !== undefined) {\n finalCommunities.set(node, newCommunityId);\n }\n }\n\n return {\n communities: finalCommunities,\n modularity: bestModularity,\n iterations,\n };\n}\n\n/**\n * Calculate modularity of a partition\n * @param graph - Map representation of the graph\n * @param communities - Map of node IDs to community IDs\n * @param degrees - Map of node IDs to their weighted degrees\n * @param totalWeight - Total weight of all edges in the graph\n * @param resolution - Resolution parameter for modularity calculation\n * @returns The modularity score of the partition\n */\nfunction calculateModularity(\n graph: Map<string, Map<string, number>>,\n communities: Map<string, number>,\n degrees: Map<string, number>,\n totalWeight: number,\n resolution: number,\n): number {\n let modularity = 0;\n const communityWeights = new Map<number, number>();\n\n // Calculate internal weights for each community\n for (const [node, neighbors] of graph) {\n const nodeCommunity = communities.get(node);\n if (nodeCommunity === undefined) {\n continue;\n }\n\n for (const [neighbor, weight] of neighbors) {\n const neighborCommunity = communities.get(neighbor);\n if (neighborCommunity === undefined) {\n continue;\n }\n\n if (nodeCommunity === neighborCommunity) {\n modularity += weight;\n }\n }\n\n const degree = degrees.get(node);\n if (degree !== undefined) {\n communityWeights.set(nodeCommunity, (communityWeights.get(nodeCommunity) ?? 0) + degree);\n }\n }\n\n // Handle empty graph or zero weight\n if (totalWeight === 0) {\n return 0;\n }\n\n // Normalize and apply resolution\n modularity /= 2 * totalWeight;\n\n // Subtract expected edges\n for (const weight of communityWeights.values()) {\n modularity -= resolution * (weight / (2 * totalWeight)) ** 2;\n }\n\n return modularity;\n}\n\n/**\n * Get communities of neighbors\n * @param node - The node ID to get neighbor communities for\n * @param graph - Map representation of the graph\n * @param communities - Map of node IDs to community IDs\n * @returns Map of community IDs to total edge weight connecting to that community\n */\nfunction getNeighborCommunities(\n node: string,\n graph: Map<string, Map<string, number>>,\n communities: Map<string, number>,\n): Map<number, number> {\n const neighborCommunities = new Map<number, number>();\n const neighbors = graph.get(node);\n\n if (neighbors) {\n for (const [neighbor, weight] of neighbors) {\n const community = communities.get(neighbor);\n if (community !== undefined) {\n neighborCommunities.set(community, (neighborCommunities.get(community) ?? 0) + weight);\n }\n }\n }\n\n return neighborCommunities;\n}\n\n/**\n * Calculate modularity gain from moving a node to a community\n * @param node - The node ID to move\n * @param targetCommunity - The target community ID\n * @param graph - Map representation of the graph\n * @param communities - Map of node IDs to community IDs\n * @param degrees - Map of node IDs to their weighted degrees\n * @param totalWeight - Total weight of all edges in the graph\n * @param resolution - Resolution parameter for modularity calculation\n * @returns The modularity gain from moving the node to the target community\n */\nfunction calculateModularityGain(\n node: string,\n targetCommunity: number,\n graph: Map<string, Map<string, number>>,\n communities: Map<string, number>,\n degrees: Map<string, number>,\n totalWeight: number,\n resolution: number,\n): number {\n const currentCommunity = communities.get(node);\n const nodeDegree = degrees.get(node);\n if (currentCommunity === undefined || nodeDegree === undefined) {\n return 0;\n }\n\n // Weight of edges from node to target community\n let weightToTarget = 0;\n let weightToCurrent = 0;\n\n const neighbors = graph.get(node);\n if (neighbors) {\n for (const [neighbor, weight] of neighbors) {\n const neighborCommunity = communities.get(neighbor);\n if (neighborCommunity === undefined) {\n continue;\n }\n\n if (neighborCommunity === targetCommunity) {\n weightToTarget += weight;\n } else if (neighborCommunity === currentCommunity && neighbor !== node) {\n weightToCurrent += weight;\n }\n }\n }\n\n // Calculate community degrees\n let targetDegree = 0;\n let currentDegree = 0;\n\n for (const [n, c] of communities) {\n if (c === targetCommunity && n !== node) {\n const deg = degrees.get(n);\n if (deg !== undefined) {\n targetDegree += deg;\n }\n } else if (c === currentCommunity && n !== node) {\n const deg = degrees.get(n);\n if (deg !== undefined) {\n currentDegree += deg;\n }\n }\n }\n\n // Modularity gain calculation\n const m2 = 2 * totalWeight;\n const gain =\n (weightToTarget - weightToCurrent) / totalWeight -\n (resolution * nodeDegree * (targetDegree - currentDegree)) / (m2 * m2);\n\n return gain;\n}\n\n/**\n * Create aggregate network where each community becomes a super-node\n * @param graph - Map representation of the graph\n * @param communities - Map of node IDs to community IDs\n * @returns Object with aggregate graph and node-to-community mapping\n */\nfunction createAggregateNetwork(\n graph: Map<string, Map<string, number>>,\n communities: Map<string, number>,\n): {\n aggregateGraph: Map<number, Map<number, number>>;\n nodeMapping: Map<string, number>;\n} {\n const aggregateGraph = new Map<number, Map<number, number>>();\n const nodeMapping = new Map<string, number>();\n\n // Create mapping from nodes to communities\n for (const [node, community] of communities) {\n nodeMapping.set(node, community);\n if (!aggregateGraph.has(community)) {\n aggregateGraph.set(community, new Map());\n }\n }\n\n // Aggregate edges\n for (const [node, neighbors] of graph) {\n const sourceCommunity = communities.get(node);\n if (sourceCommunity === undefined) {\n continue;\n }\n\n for (const [neighbor, weight] of neighbors) {\n const targetCommunity = communities.get(neighbor);\n if (targetCommunity === undefined) {\n continue;\n }\n\n const sourceNeighbors = aggregateGraph.get(sourceCommunity);\n if (sourceNeighbors) {\n const current = sourceNeighbors.get(targetCommunity) ?? 0;\n sourceNeighbors.set(targetCommunity, current + weight);\n }\n }\n }\n\n return { aggregateGraph, nodeMapping };\n}\n\n/**\n * Refine partition (Leiden-specific improvement)\n * Ensures well-connected communities by considering subsets\n * @param originalGraph - Map representation of the original graph\n * @param communities - Map of node IDs to community IDs\n * @returns Refined community assignments with well-connected communities\n */\nfunction refinePartition(\n originalGraph: Map<string, Map<string, number>>,\n communities: Map<string, number>,\n): Map<string, number> {\n const refined = new Map<string, number>();\n\n // For each community, check if it should be split\n const communityNodes = new Map<number, string[]>();\n for (const [node, community] of communities) {\n if (!communityNodes.has(community)) {\n communityNodes.set(community, []);\n }\n\n const nodes = communityNodes.get(community);\n if (nodes) {\n nodes.push(node);\n }\n }\n\n let newCommunityId = 0;\n\n for (const [community, nodes] of communityNodes) {\n if (nodes.length === 1) {\n // Single node community\n const singleNode = nodes[0];\n if (singleNode) {\n refined.set(singleNode, newCommunityId++);\n }\n\n continue;\n }\n\n // Check connectivity within community\n const subgraph = new Map<string, Set<string>>();\n for (const node of nodes) {\n subgraph.set(node, new Set());\n const neighbors = originalGraph.get(node);\n if (neighbors) {\n for (const [neighbor] of neighbors) {\n if (communities.get(neighbor) === community) {\n const nodeSet = subgraph.get(node);\n if (nodeSet) {\n nodeSet.add(neighbor);\n }\n }\n }\n }\n }\n\n // Find connected components within community\n const components = findConnectedComponents(subgraph);\n\n // Assign new community IDs to components\n for (const component of components) {\n for (const node of component) {\n refined.set(node, newCommunityId);\n }\n newCommunityId++;\n }\n }\n\n return refined;\n}\n\n/**\n * Find connected components in undirected graph\n * @param graph - Map representation of the graph (node to set of neighbors)\n * @returns Array of connected components (each is a set of node IDs)\n */\nfunction findConnectedComponents(graph: Map<string, Set<string>>): Set<string>[] {\n const visited = new Set<string>();\n const components: Set<string>[] = [];\n\n for (const node of graph.keys()) {\n if (!visited.has(node)) {\n const component = new Set<string>();\n const queue = [node];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (current === undefined || visited.has(current)) {\n continue;\n }\n\n visited.add(current);\n component.add(current);\n\n const neighbors = graph.get(current);\n if (neighbors) {\n for (const neighbor of neighbors) {\n if (!visited.has(neighbor)) {\n queue.push(neighbor);\n }\n }\n }\n }\n\n components.push(component);\n }\n }\n\n return components;\n}\n\n/**\n * Aggregate communities into super-nodes\n * @param graph - Map representation of the graph\n * @param communities - Map of node IDs to community IDs\n * @returns Object with aggregated graph and node-to-supernode mapping\n */\nfunction aggregateCommunities(\n graph: Map<string, Map<string, number>>,\n communities: Map<string, number>,\n): {\n graph: Map<string, Map<string, number>>;\n mapping: Map<string, string>;\n} {\n const aggregated = new Map<string, Map<string, number>>();\n const mapping = new Map<string, string>();\n\n // Create super-nodes\n const communityNodes = new Map<number, string>();\n for (const community of new Set(communities.values())) {\n const superNode = `super_${String(community)}`;\n communityNodes.set(community, superNode);\n aggregated.set(superNode, new Map());\n }\n\n // Map original nodes to super-nodes\n for (const [node, community] of communities) {\n const superNode = communityNodes.get(community);\n if (superNode !== undefined) {\n mapping.set(node, superNode);\n }\n }\n\n // Aggregate edges\n for (const [node, neighbors] of graph) {\n const sourceCommunity = communities.get(node);\n if (sourceCommunity === undefined) {\n continue;\n }\n\n const sourceSuper = communityNodes.get(sourceCommunity);\n if (sourceSuper === undefined) {\n continue;\n }\n\n for (const [neighbor, weight] of neighbors) {\n const targetCommunity = communities.get(neighbor);\n if (targetCommunity === undefined) {\n continue;\n }\n\n const targetSuper = communityNodes.get(targetCommunity);\n if (targetSuper === undefined) {\n continue;\n }\n\n if (sourceSuper !== targetSuper) {\n const sourceNeighbors = aggregated.get(sourceSuper);\n if (sourceNeighbors) {\n const current = sourceNeighbors.get(targetSuper) ?? 0;\n sourceNeighbors.set(targetSuper, current + weight);\n }\n }\n }\n }\n\n return { graph: aggregated, mapping };\n}\n\n/**\n * Leiden algorithm for community detection\n * Improves upon Louvain by ensuring well-connected communities\n * @param graph - Undirected weighted graph - accepts Graph class or Map representation\n * @param options - Algorithm options\n * @returns Community assignments and modularity\n *\n * Time Complexity: O(m) per iteration, typically O(m log m) total\n * Space Complexity: O(n + m)\n */\nexport function leiden(graph: Graph, options: LeidenOptions = {}): LeidenResult {\n // Convert Graph to Map representation\n const graphMap = graphToMap(graph);\n return leidenImpl(graphMap, options);\n}\n","import type { Graph } from \"../../core/graph.js\";\nimport type { CommunityResult, NodeId } from \"../../types/index.js\";\n\n/**\n * Optimized Louvain community detection algorithm with early pruning and threshold cycling\n *\n * Key optimizations:\n * - Leaf node pruning: Skip nodes with degree 1\n * - Importance ordering: Process high-impact nodes first\n * - Threshold cycling: Adaptive convergence thresholds\n * - Early termination: Stop when changes become insignificant\n *\n * Expected speedup: 2-5x on large graphs with many leaf nodes\n */\n\ninterface OptimizedLouvainOptions {\n /**\n * Resolution parameter (default: 1.0)\n */\n resolution?: number;\n /**\n * Maximum iterations per level (default: 100)\n */\n maxIterations?: number;\n /**\n * Convergence tolerance (default: 1e-6)\n */\n tolerance?: number;\n /**\n * Enable leaf node pruning (default: true)\n */\n pruneLeaves?: boolean;\n /**\n * Enable importance-based node ordering (default: true)\n */\n importanceOrdering?: boolean;\n /**\n * Base pruning threshold (default: 0.01)\n */\n pruningThreshold?: number;\n /**\n * Enable adaptive threshold cycling (default: true)\n */\n thresholdCycling?: boolean;\n}\n\ninterface PruningStats {\n leafNodesPruned: number;\n lowDegreeNodesPruned: number;\n stableNodesPruned: number;\n}\n\n/**\n * Optimized Louvain implementation with early pruning and threshold cycling\n */\nexport class OptimizedLouvain {\n private graph: Graph;\n private communities: Map<NodeId, number>;\n private communityWeights: Map<number, number>;\n private nodeWeights: Map<NodeId, number>;\n private nodeDegrees: Map<NodeId, number>;\n private totalWeight: number;\n private pruningStats: PruningStats;\n\n /**\n * Create an optimized Louvain detector for the given graph\n * @param graph - The input graph to detect communities in\n */\n constructor(graph: Graph) {\n this.graph = graph;\n this.communities = new Map();\n this.communityWeights = new Map();\n this.nodeWeights = new Map();\n this.nodeDegrees = new Map();\n this.totalWeight = 0;\n this.pruningStats = {\n leafNodesPruned: 0,\n lowDegreeNodesPruned: 0,\n stableNodesPruned: 0,\n };\n }\n\n /**\n * Run optimized Louvain algorithm\n * @param options - Algorithm configuration options\n * @returns Community detection result with communities, modularity, and iterations\n */\n public detectCommunities(options: OptimizedLouvainOptions = {}): CommunityResult {\n const {\n resolution = 1.0,\n maxIterations = 100,\n tolerance = 1e-6,\n pruneLeaves = true,\n importanceOrdering = true,\n pruningThreshold = 0.01,\n thresholdCycling = true,\n } = options;\n\n // Initialize\n this.initialize();\n let modularity = this.calculateModularity(resolution);\n let iteration = 0;\n let improved = true;\n\n while (iteration < maxIterations && improved) {\n // Get nodes in optimal processing order\n const orderedNodes = importanceOrdering\n ? this.getNodesInImportanceOrder()\n : Array.from(this.graph.nodes()).map((n) => n.id);\n\n // Apply adaptive threshold\n const threshold = thresholdCycling ? this.getAdaptiveThreshold(iteration, pruningThreshold) : 0;\n\n // Perform local optimization\n improved = this.performLocalMoving(orderedNodes, {\n pruneLeaves,\n threshold,\n resolution,\n });\n\n if (improved) {\n const newModularity = this.calculateModularity(resolution);\n\n // Check convergence\n if (Math.abs(newModularity - modularity) < tolerance) {\n break;\n }\n\n modularity = newModularity;\n iteration++;\n }\n }\n\n // Convert community assignments to result format\n const communityGroups = new Map<number, NodeId[]>();\n\n for (const [nodeId, community] of this.communities) {\n if (!communityGroups.has(community)) {\n communityGroups.set(community, []);\n }\n\n const group = communityGroups.get(community);\n if (group) {\n group.push(nodeId);\n }\n }\n\n return {\n communities: Array.from(communityGroups.values()),\n modularity,\n iterations: iteration,\n };\n }\n\n /**\n * Initialize data structures\n */\n private initialize(): void {\n let communityId = 0;\n\n // Initialize each node in its own community\n for (const node of this.graph.nodes()) {\n this.communities.set(node.id, communityId);\n\n // Calculate node weight and degree\n let nodeWeight = 0;\n let degree = 0;\n\n for (const neighbor of Array.from(this.graph.neighbors(node.id))) {\n const edge = this.graph.getEdge(node.id, neighbor);\n const weight = edge?.weight ?? 1;\n nodeWeight += weight;\n degree++;\n }\n\n // For undirected graphs, also check incoming edges\n if (!this.graph.isDirected) {\n for (const neighbor of Array.from(this.graph.inNeighbors(node.id))) {\n if (!this.graph.hasEdge(node.id, neighbor)) {\n const edge = this.graph.getEdge(neighbor, node.id);\n const weight = edge?.weight ?? 1;\n nodeWeight += weight;\n degree++;\n }\n }\n }\n\n this.nodeWeights.set(node.id, nodeWeight);\n this.nodeDegrees.set(node.id, degree);\n this.communityWeights.set(communityId, nodeWeight);\n this.totalWeight += nodeWeight;\n\n communityId++;\n }\n\n // Total weight is sum of all edge weights\n // For undirected graphs, each edge is counted twice from both endpoints\n this.totalWeight = this.totalWeight / 2;\n }\n\n /**\n * Get nodes ordered by importance (degree * log(weight))\n * @returns Array of node IDs sorted by descending importance\n */\n private getNodesInImportanceOrder(): NodeId[] {\n const nodeImportance = new Map<NodeId, number>();\n\n for (const [nodeId, degree] of this.nodeDegrees) {\n const weight = this.nodeWeights.get(nodeId) ?? 0;\n // Importance score: combination of degree and weight\n // High-degree nodes and nodes with heavy edges are processed first\n const importance = degree * Math.log(1 + weight);\n nodeImportance.set(nodeId, importance);\n }\n\n // Sort by importance (descending)\n return Array.from(nodeImportance.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([nodeId]) => nodeId);\n }\n\n /**\n * Perform local moving phase with optimizations\n * @param nodes - Array of node IDs to process\n * @param options - Local moving options\n * @param options.pruneLeaves - Whether to skip leaf nodes\n * @param options.threshold - Minimum gain threshold for moves\n * @param options.resolution - Resolution parameter for modularity\n * @returns True if any improvement was made, false otherwise\n */\n private performLocalMoving(\n nodes: NodeId[],\n options: {\n pruneLeaves: boolean;\n threshold: number;\n resolution: number;\n },\n ): boolean {\n const { pruneLeaves, threshold, resolution } = options;\n let improvement = false;\n let hasChanged = true;\n\n while (hasChanged) {\n hasChanged = false;\n\n for (const nodeId of nodes) {\n // Early pruning: skip leaf nodes\n if (pruneLeaves && this.isLeafNode(nodeId)) {\n this.pruningStats.leafNodesPruned++;\n continue;\n }\n\n const currentCommunity = this.communities.get(nodeId) ?? 0;\n const neighborCommunities = this.getNeighborCommunities(nodeId);\n\n // Skip isolated nodes\n if (neighborCommunities.size === 0) {\n continue;\n }\n\n // Find best community to move to\n let bestCommunity = currentCommunity;\n let bestGain = 0;\n\n // Remove node from its current community to calculate gains\n this.removeNodeFromCommunity(nodeId, currentCommunity);\n\n for (const community of neighborCommunities) {\n const gain = this.calculateModularityGain(nodeId, community, resolution);\n\n // Apply threshold - only move if gain exceeds threshold\n if (gain > bestGain + threshold) {\n bestGain = gain;\n bestCommunity = community;\n }\n }\n\n // Try staying in current community\n const currentGain = this.calculateModularityGain(nodeId, currentCommunity, resolution);\n if (currentGain > bestGain + threshold) {\n bestGain = currentGain;\n bestCommunity = currentCommunity;\n }\n\n // Add node to best community\n this.addNodeToCommunity(nodeId, bestCommunity);\n\n // Track if node moved\n if (bestCommunity !== currentCommunity) {\n hasChanged = true;\n improvement = true;\n }\n }\n }\n\n return improvement;\n }\n\n /**\n * Check if node is a leaf (degree 1)\n * @param nodeId - The node ID to check\n * @returns True if the node has degree 1, false otherwise\n */\n private isLeafNode(nodeId: NodeId): boolean {\n const degree = this.nodeDegrees.get(nodeId) ?? 0;\n return degree === 1;\n }\n\n /**\n * Get adaptive threshold that decreases with iterations\n * @param iteration - Current iteration number\n * @param baseThreshold - Base threshold value to scale\n * @returns Adaptive threshold value that decays over iterations\n */\n private getAdaptiveThreshold(iteration: number, baseThreshold: number): number {\n // Exponentially decay threshold with iterations\n // This allows coarse movements early and fine-tuning later\n return baseThreshold * Math.pow(0.5, iteration / 10);\n }\n\n /**\n * Calculate modularity gain from moving a node to a community\n * @param nodeId - The node ID to move\n * @param targetCommunity - The target community ID\n * @param resolution - Resolution parameter for modularity calculation\n * @returns The modularity gain from moving the node\n */\n private calculateModularityGain(nodeId: NodeId, targetCommunity: number, resolution: number): number {\n const nodeWeight = this.nodeWeights.get(nodeId) ?? 0;\n\n // Sum of weights from node to target community\n let weightToTarget = 0;\n\n for (const neighbor of Array.from(this.graph.neighbors(nodeId))) {\n if (this.communities.get(neighbor) === targetCommunity) {\n const edge = this.graph.getEdge(nodeId, neighbor);\n weightToTarget += edge?.weight ?? 1;\n }\n }\n\n // For undirected graphs, also check incoming edges\n if (!this.graph.isDirected) {\n for (const neighbor of Array.from(this.graph.inNeighbors(nodeId))) {\n if (this.communities.get(neighbor) === targetCommunity && !this.graph.hasEdge(nodeId, neighbor)) {\n const edge = this.graph.getEdge(neighbor, nodeId);\n weightToTarget += edge?.weight ?? 1;\n }\n }\n }\n\n // Weight of target community\n const targetWeight = this.communityWeights.get(targetCommunity) ?? 0;\n\n // Modularity gain formula\n const gain =\n (weightToTarget - (resolution * nodeWeight * targetWeight) / (2 * this.totalWeight)) / this.totalWeight;\n\n return gain;\n }\n\n /**\n * Remove node from community (for gain calculation)\n * @param nodeId - The node ID to remove\n * @param community - The community ID to remove from\n */\n private removeNodeFromCommunity(nodeId: NodeId, community: number): void {\n const nodeWeight = this.nodeWeights.get(nodeId) ?? 0;\n this.communityWeights.set(community, (this.communityWeights.get(community) ?? 0) - nodeWeight);\n this.communities.delete(nodeId);\n }\n\n /**\n * Add node to community\n * @param nodeId - The node ID to add\n * @param community - The community ID to add to\n */\n private addNodeToCommunity(nodeId: NodeId, community: number): void {\n const nodeWeight = this.nodeWeights.get(nodeId) ?? 0;\n this.communityWeights.set(community, (this.communityWeights.get(community) ?? 0) + nodeWeight);\n this.communities.set(nodeId, community);\n }\n\n /**\n * Get neighboring communities of a node\n * @param nodeId - The node ID to find neighbor communities for\n * @returns Set of community IDs that neighbors belong to\n */\n private getNeighborCommunities(nodeId: NodeId): Set<number> {\n const communities = new Set<number>();\n\n for (const neighbor of Array.from(this.graph.neighbors(nodeId))) {\n const community = this.communities.get(neighbor);\n if (community !== undefined) {\n communities.add(community);\n }\n }\n\n // For undirected graphs, also check incoming edges\n if (!this.graph.isDirected) {\n for (const neighbor of Array.from(this.graph.inNeighbors(nodeId))) {\n const community = this.communities.get(neighbor);\n if (community !== undefined) {\n communities.add(community);\n }\n }\n }\n\n return communities;\n }\n\n /**\n * Calculate total modularity\n * @param resolution - Resolution parameter for modularity calculation\n * @returns The modularity score of the current partition\n */\n private calculateModularity(resolution: number): number {\n if (this.totalWeight === 0) {\n return 0;\n }\n\n let modularity = 0;\n\n // Sum over all communities\n const communityInternalWeights = new Map<number, number>();\n\n // Calculate internal weights for each community\n for (const node of this.graph.nodes()) {\n const nodeId = node.id;\n const community = this.communities.get(nodeId) ?? 0;\n\n for (const neighbor of Array.from(this.graph.neighbors(nodeId))) {\n if (this.communities.get(neighbor) === community) {\n const edge = this.graph.getEdge(nodeId, neighbor);\n const weight = edge?.weight ?? 1;\n communityInternalWeights.set(community, (communityInternalWeights.get(community) ?? 0) + weight);\n }\n }\n }\n\n // Calculate modularity\n for (const [community, internalWeight] of communityInternalWeights) {\n const communityWeight = this.communityWeights.get(community) ?? 0;\n // For undirected graphs, internal weights are counted twice\n const aIn = this.graph.isDirected ? internalWeight : internalWeight / 2;\n const aTotal = communityWeight;\n\n // Modularity formula: sum of (fraction of edges within community - expected fraction)\n const actualFraction = aIn / this.totalWeight;\n const expectedFraction = resolution * Math.pow(aTotal / (2 * this.totalWeight), 2);\n modularity += actualFraction - expectedFraction;\n }\n\n return modularity;\n }\n\n /**\n * Get pruning statistics\n * @returns Statistics about nodes pruned during optimization\n */\n public getPruningStats(): PruningStats {\n return { ...this.pruningStats };\n }\n}\n\n/**\n * Optimized Louvain algorithm with automatic optimization selection\n * @param graph - The input graph to detect communities in\n * @param options - Algorithm configuration options\n * @returns Community detection result with communities, modularity, and iterations\n */\nexport function louvainOptimized(graph: Graph, options: OptimizedLouvainOptions = {}): CommunityResult {\n const optimizer = new OptimizedLouvain(graph);\n return optimizer.detectCommunities(options);\n}\n","/**\n * Shared modularity calculation utilities for community detection algorithms\n *\n * Used by: Louvain, Leiden, Girvan-Newman\n */\nimport type { Graph } from \"../../core/graph.js\";\nimport type { NodeId } from \"../../types/index.js\";\n\n/**\n * Calculate total edge weight in the graph\n *\n * For undirected graphs, each edge is counted once.\n * For directed graphs, each directed edge is counted once.\n * @param graph - The input graph\n * @returns Total sum of edge weights (default weight is 1)\n */\nexport function getTotalEdgeWeight(graph: Graph): number {\n let totalWeight = 0;\n\n for (const edge of graph.edges()) {\n totalWeight += edge.weight ?? 1;\n }\n\n return totalWeight;\n}\n\n/**\n * Get the total degree (sum of edge weights) for a node\n *\n * Computes the weighted degree by summing all edge weights incident to the node.\n * @param graph - The input graph\n * @param nodeId - The node ID to compute degree for\n * @returns The weighted degree of the node\n */\nexport function getNodeDegree(graph: Graph, nodeId: NodeId): number {\n let degree = 0;\n\n for (const neighbor of graph.neighbors(nodeId)) {\n const edge = graph.getEdge(nodeId, neighbor);\n degree += edge?.weight ?? 1;\n }\n\n return degree;\n}\n\n/**\n * Get communities of neighboring nodes\n *\n * Returns the set of community IDs that neighbors of the given node belong to.\n * @param graph - The input graph\n * @param nodeId - The node to get neighbor communities for\n * @param communities - Map from node IDs to community IDs\n * @returns Set of community IDs that neighbors belong to\n */\nexport function getNeighborCommunities(graph: Graph, nodeId: NodeId, communities: Map<NodeId, number>): Set<number> {\n const neighborCommunities = new Set<number>();\n\n for (const neighbor of graph.neighbors(nodeId)) {\n const community = communities.get(neighbor);\n if (community !== undefined) {\n neighborCommunities.add(community);\n }\n }\n\n return neighborCommunities;\n}\n\n/**\n * Calculate modularity of a partition\n *\n * Modularity measures the quality of a community partition. It compares the\n * number of edges within communities to what would be expected in a random graph.\n *\n * Formula: Q = (1/2m) * Σ[A_ij - γ(k_i * k_j)/(2m)] * δ(c_i, c_j)\n * where:\n * - m = total edge weight\n * - A_ij = adjacency matrix entry (edge weight between i and j)\n * - k_i, k_j = degrees of nodes i and j\n * - γ = resolution parameter (higher values favor smaller communities)\n * - δ = Kronecker delta (1 if same community, 0 otherwise)\n * @param graph - The input graph\n * @param communities - Map from node IDs to community IDs\n * @param resolution - Resolution parameter (default: 1.0)\n * @returns Modularity score (range typically -0.5 to 1.0)\n */\nexport function calculateModularity(graph: Graph, communities: Map<NodeId, number>, resolution = 1.0): number {\n const totalEdgeWeight = getTotalEdgeWeight(graph);\n if (totalEdgeWeight === 0) {\n return 0;\n }\n\n let modularity = 0;\n\n // For undirected graphs, we need to be careful not to double-count edges\n const countedEdges = new Set<string>();\n\n // Calculate modularity: Q = (1/2m) * Σ[A_ij - γ(k_i * k_j)/(2m)] * δ(c_i, c_j)\n for (const nodeI of graph.nodes()) {\n for (const nodeJ of graph.nodes()) {\n // Skip if already counted this pair in undirected graph\n if (!graph.isDirected) {\n const nodeIStr = String(nodeI.id);\n const nodeJStr = String(nodeJ.id);\n const edgeKey = nodeIStr <= nodeJStr ? `${nodeIStr}-${nodeJStr}` : `${nodeJStr}-${nodeIStr}`;\n if (countedEdges.has(edgeKey)) {\n continue;\n }\n\n countedEdges.add(edgeKey);\n }\n\n if (communities.get(nodeI.id) === communities.get(nodeJ.id)) {\n const edge = graph.getEdge(nodeI.id, nodeJ.id);\n const reverseEdge = !graph.isDirected ? graph.getEdge(nodeJ.id, nodeI.id) : null;\n\n let edgeWeight = 0;\n if (edge) {\n edgeWeight += edge.weight ?? 1;\n }\n\n if (reverseEdge && nodeI.id !== nodeJ.id) {\n edgeWeight += reverseEdge.weight ?? 1;\n }\n\n const degreeI = getNodeDegree(graph, nodeI.id);\n const degreeJ = getNodeDegree(graph, nodeJ.id);\n\n modularity += edgeWeight - (resolution * degreeI * degreeJ) / (2 * totalEdgeWeight);\n }\n }\n }\n\n return modularity / (2 * totalEdgeWeight);\n}\n","import { Graph } from \"../../core/graph.js\";\nimport type { CommunityResult, LouvainOptions, NodeId } from \"../../types/index.js\";\nimport { louvainOptimized } from \"./louvain-optimized.js\";\nimport { calculateModularity, getNeighborCommunities, getNodeDegree, getTotalEdgeWeight } from \"./modularity-utils.js\";\n\n/**\n * Louvain community detection algorithm\n *\n * Implements the Louvain method for community detection in graphs.\n * Uses modularity optimization to find community structure.\n *\n * References:\n * - Blondel, V. D., Guillaume, J. L., Lambiotte, R., & Lefebvre, E. (2008).\n * Fast unfolding of communities in large networks.\n * Journal of statistical mechanics: theory and experiment, 2008(10), P10008.\n * @param graph - The input graph\n * @param options - Algorithm options\n * @returns Community detection result with communities, modularity, and iterations\n */\nexport function louvain(graph: Graph, options: LouvainOptions = {}): CommunityResult {\n const resolution = options.resolution ?? 1.0;\n const maxIterations = options.maxIterations ?? 100;\n const tolerance = options.tolerance ?? 1e-6;\n\n // Use optimized version by default for larger graphs\n // Only disable if explicitly requested or graph is very small\n const shouldUseOptimized = options.useOptimized !== false && graph.nodeCount > 50;\n\n if (shouldUseOptimized) {\n return louvainOptimized(graph, {\n resolution,\n maxIterations,\n tolerance,\n // Enable all optimizations by default\n pruneLeaves: true,\n importanceOrdering: true,\n thresholdCycling: true,\n pruningThreshold: 0.01,\n });\n }\n\n // Initialize: each node in its own community\n const communities = initializeCommunities(graph);\n let modularity = calculateModularity(graph, communities, resolution);\n let iteration = 0;\n let improved = true;\n\n while (iteration < maxIterations && improved) {\n // Phase 1: Local optimization\n improved = louvainPhase1(graph, communities, resolution);\n\n if (improved) {\n const newModularity = calculateModularity(graph, communities, resolution);\n\n // Check for convergence\n if (newModularity - modularity < tolerance) {\n break;\n }\n\n modularity = newModularity;\n iteration++;\n }\n }\n\n return {\n communities: extractCommunities(communities),\n modularity: calculateModularity(graph, communities, resolution),\n iterations: iteration,\n };\n}\n\n/**\n * Initialize communities: each node in its own community\n * @param graph - The input graph\n * @returns Map of node IDs to their initial community IDs\n */\nfunction initializeCommunities(graph: Graph): Map<NodeId, number> {\n const communities = new Map<NodeId, number>();\n let communityId = 0;\n\n for (const node of graph.nodes()) {\n communities.set(node.id, communityId++);\n }\n\n return communities;\n}\n\n/**\n * Phase 1 of Louvain algorithm: Local optimization\n * For each node, try moving to neighboring communities and keep the move\n * that provides the best modularity gain.\n * @param graph - The input graph\n * @param communities - Map of node IDs to community IDs\n * @param resolution - Resolution parameter for modularity calculation\n * @returns True if any improvement was made, false otherwise\n */\nfunction louvainPhase1(graph: Graph, communities: Map<NodeId, number>, resolution: number): boolean {\n let globalImprovement = false;\n let localImprovement = true;\n\n while (localImprovement) {\n localImprovement = false;\n\n for (const node of graph.nodes()) {\n const nodeId = node.id;\n const currentCommunity = communities.get(nodeId);\n\n if (currentCommunity === undefined) {\n continue;\n }\n\n // Calculate current modularity contribution\n const currentModularity = nodeModularityContribution(\n graph,\n nodeId,\n currentCommunity,\n communities,\n resolution,\n );\n\n let bestCommunity = currentCommunity;\n let bestModularity = currentModularity;\n\n // Try moving to neighboring communities\n const neighborCommunities = getNeighborCommunities(graph, nodeId, communities);\n\n for (const neighborCommunity of neighborCommunities) {\n if (neighborCommunity === currentCommunity) {\n continue;\n }\n\n const newModularity = nodeModularityContribution(\n graph,\n nodeId,\n neighborCommunity,\n communities,\n resolution,\n );\n\n if (newModularity > bestModularity) {\n bestModularity = newModularity;\n bestCommunity = neighborCommunity;\n }\n }\n\n // Move node if improvement found\n if (bestCommunity !== currentCommunity) {\n communities.set(nodeId, bestCommunity);\n localImprovement = true;\n globalImprovement = true;\n }\n }\n }\n\n return globalImprovement;\n}\n\n/**\n * Calculate modularity contribution of a node to a specific community\n * @param graph - The input graph\n * @param nodeId - The node ID to evaluate\n * @param community - The community to measure contribution to\n * @param communities - Map of all node IDs to community IDs\n * @param resolution - Resolution parameter for modularity calculation\n * @returns The modularity contribution of the node to the specified community\n */\nfunction nodeModularityContribution(\n graph: Graph,\n nodeId: NodeId,\n community: number,\n communities: Map<NodeId, number>,\n resolution: number,\n): number {\n const totalEdgeWeight = getTotalEdgeWeight(graph);\n if (totalEdgeWeight === 0) {\n return 0;\n }\n\n let internalLinks = 0;\n let nodeDegree = 0;\n let communityDegree = 0;\n\n // Calculate node's connections to the community\n for (const neighbor of graph.neighbors(nodeId)) {\n const edge = graph.getEdge(nodeId, neighbor);\n const weight = edge?.weight ?? 1;\n nodeDegree += weight;\n\n if (communities.get(neighbor) === community) {\n internalLinks += weight;\n }\n }\n\n // Calculate total degree of the community (excluding the node if it's currently in it)\n for (const [otherNodeId, otherCommunity] of communities) {\n if (otherCommunity === community && otherNodeId !== nodeId) {\n communityDegree += getNodeDegree(graph, otherNodeId);\n }\n }\n\n // Modularity formula: Q = (1/2m) * Σ[A_ij - (k_i * k_j)/(2m)] * δ(c_i, c_j)\n const modularityIncrease =\n (internalLinks - (resolution * nodeDegree * communityDegree) / (2 * totalEdgeWeight)) / totalEdgeWeight;\n\n return modularityIncrease;\n}\n\n/**\n * Extract final community structure\n * @param communities - Map of node IDs to community IDs\n * @returns Array of communities (each is an array of node IDs)\n */\nfunction extractCommunities(communities: Map<NodeId, number>): NodeId[][] {\n const communityMap = new Map<number, NodeId[]>();\n\n for (const [nodeId, community] of communities) {\n if (!communityMap.has(community)) {\n communityMap.set(community, []);\n }\n\n const communityNodes = communityMap.get(community);\n if (communityNodes) {\n communityNodes.push(nodeId);\n }\n }\n\n return Array.from(communityMap.values());\n}\n","/**\n * Min Priority Queue implementation for graph algorithms\n */\nexport class MinPriorityQueue<T> {\n private heap: T[] = [];\n private compare: (a: T, b: T) => number;\n\n /**\n * Creates a new MinPriorityQueue instance.\n * @param compareFunction - Custom comparison function. Returns negative if a has higher priority than b.\n */\n constructor(compareFunction?: (a: T, b: T) => number) {\n this.compare = compareFunction ?? ((a: T, b: T) => this.defaultCompare(a, b));\n }\n\n private defaultCompare(a: T, b: T): number {\n const aWithDistance = a as T & { distance?: number };\n const bWithDistance = b as T & { distance?: number };\n\n if (aWithDistance.distance !== undefined && bWithDistance.distance !== undefined) {\n return aWithDistance.distance - bWithDistance.distance;\n }\n\n return 0;\n }\n\n private parent(i: number): number {\n return Math.floor((i - 1) / 2);\n }\n\n private leftChild(i: number): number {\n return 2 * i + 1;\n }\n\n private rightChild(i: number): number {\n return 2 * i + 2;\n }\n\n private swap(i: number, j: number): void {\n const temp = this.heap[i];\n const temp2 = this.heap[j];\n if (temp !== undefined && temp2 !== undefined) {\n this.heap[i] = temp2;\n this.heap[j] = temp;\n }\n }\n\n private heapifyUp(index: number): void {\n while (index > 0) {\n const parentIndex = this.parent(index);\n const current = this.heap[index];\n const parent = this.heap[parentIndex];\n if (current !== undefined && parent !== undefined && this.compare(current, parent) < 0) {\n this.swap(index, parentIndex);\n index = parentIndex;\n } else {\n break;\n }\n }\n }\n\n private heapifyDown(index: number): void {\n while (index < this.heap.length) {\n let minIndex = index;\n const left = this.leftChild(index);\n const right = this.rightChild(index);\n\n const leftItem = this.heap[left];\n const minItem = this.heap[minIndex];\n if (\n left < this.heap.length &&\n leftItem !== undefined &&\n minItem !== undefined &&\n this.compare(leftItem, minItem) < 0\n ) {\n minIndex = left;\n }\n\n const rightItem = this.heap[right];\n const newMinItem = this.heap[minIndex];\n if (\n right < this.heap.length &&\n rightItem !== undefined &&\n newMinItem !== undefined &&\n this.compare(rightItem, newMinItem) < 0\n ) {\n minIndex = right;\n }\n\n if (minIndex !== index) {\n this.swap(index, minIndex);\n index = minIndex;\n } else {\n break;\n }\n }\n }\n\n /**\n * Insert a value into the priority queue.\n * @param value - The value to insert\n */\n insert(value: T): void {\n this.heap.push(value);\n this.heapifyUp(this.heap.length - 1);\n }\n\n /**\n * Remove and return the minimum value from the priority queue.\n * @returns The minimum value, or undefined if the queue is empty\n */\n extractMin(): T | undefined {\n if (this.heap.length === 0) {\n return undefined;\n }\n\n if (this.heap.length === 1) {\n return this.heap.pop();\n }\n\n const min = this.heap[0];\n const last = this.heap.pop();\n if (last !== undefined) {\n this.heap[0] = last;\n this.heapifyDown(0);\n }\n\n return min;\n }\n\n /**\n * View the minimum value without removing it.\n * @returns The minimum value, or undefined if the queue is empty\n */\n peek(): T | undefined {\n return this.heap[0];\n }\n\n /**\n * Check if the priority queue is empty.\n * @returns True if the queue has no items, false otherwise\n */\n isEmpty(): boolean {\n return this.heap.length === 0;\n }\n\n /**\n * Get the number of items in the priority queue.\n * @returns The number of items currently in the queue\n */\n size(): number {\n return this.heap.length;\n }\n}\n","/**\n * Utility functions for pathfinding algorithms\n */\n\nexport const pathfindingUtils = {\n /**\n * Reconstructs a path from start to goal using the cameFrom map\n * @param cameFrom - Map of each node to its predecessor on the path\n * @param goal - The goal node to reconstruct the path to\n * @returns An array of nodes representing the path from start to goal\n */\n reconstructPath<T>(cameFrom: Map<T, T>, goal: T): T[] {\n const path: T[] = [goal];\n let current = goal;\n\n while (cameFrom.has(current)) {\n const next = cameFrom.get(current);\n if (next === undefined) {\n break;\n }\n\n current = next;\n path.unshift(current);\n }\n\n return path;\n },\n\n /**\n * Creates a grid graph for testing pathfinding algorithms\n * @param width - The width of the grid\n * @param height - The height of the grid\n * @param obstacles - Set of obstacle coordinates as \"x,y\" strings\n * @returns A grid graph with 4-directional movement\n */\n createGridGraph(width: number, height: number, obstacles = new Set<string>()): Map<string, Map<string, number>> {\n const graph = new Map<string, Map<string, number>>();\n\n for (let x = 0; x < width; x++) {\n for (let y = 0; y < height; y++) {\n const node = `${String(x)},${String(y)}`;\n if (obstacles.has(node)) {\n continue;\n }\n\n const neighbors = new Map<string, number>();\n\n // Add 4-directional neighbors\n const directions = [\n [0, 1],\n [1, 0],\n [0, -1],\n [-1, 0],\n ];\n\n for (const dir of directions) {\n const dx = dir[0];\n const dy = dir[1];\n if (dx === undefined || dy === undefined) {\n continue;\n }\n\n const nx = x + dx;\n const ny = y + dy;\n const neighbor = `${String(nx)},${String(ny)}`;\n\n if (nx >= 0 && nx < width && ny >= 0 && ny < height && !obstacles.has(neighbor)) {\n neighbors.set(neighbor, 1); // Unit cost for grid movement\n }\n }\n\n graph.set(node, neighbors);\n }\n }\n\n return graph;\n },\n\n /**\n * Parses a grid coordinate string\n * @param coord - The coordinate string in \"x,y\" format\n * @returns A tuple of [x, y] coordinates\n */\n parseGridCoordinate(coord: string): [number, number] {\n const parts = coord.split(\",\").map(Number);\n const x = parts[0];\n const y = parts[1];\n if (x === undefined || y === undefined) {\n throw new Error(`Invalid coordinate: ${coord}`);\n }\n\n return [x, y];\n },\n};\n","import { graphNode } from \"../utils/graphNode.js\";\nimport { MinPriorityQueue } from \"../utils/priorityQueue.js\";\nimport { pathfindingUtils } from \"./utils.js\";\n\n/**\n * A* pathfinding algorithm\n * Finds the shortest path from start to goal using a heuristic function\n * @param graph - The graph represented as an adjacency list\n * @param start - The starting node\n * @param goal - The goal node\n * @param heuristic - Heuristic function that estimates distance from node to goal\n * @returns Object containing the shortest path and its cost, or null if no path exists\n *\n * Time Complexity: O(E) with good heuristic, O(b^d) worst case\n * Space Complexity: O(V)\n */\nexport function astar<T>(\n graph: Map<T, Map<T, number>>,\n start: T,\n goal: T,\n heuristic: (node: T, goal: T) => number,\n): { path: T[]; cost: number } | null {\n if (!graph.has(start) || !graph.has(goal)) {\n return null;\n }\n\n // Priority queue ordered by f(n) = g(n) + h(n)\n const openSet = new MinPriorityQueue<graphNode<T>>();\n const gScore = new Map<T, number>(); // Cost from start to node\n const fScore = new Map<T, number>(); // Estimated total cost\n const cameFrom = new Map<T, T>();\n const closedSet = new Set<T>();\n\n // Initialize start node\n gScore.set(start, 0);\n fScore.set(start, heuristic(start, goal));\n const startFScore = fScore.get(start);\n if (startFScore === undefined) {\n return null;\n }\n\n openSet.insert({ node: start, distance: startFScore });\n\n while (!openSet.isEmpty()) {\n const current = openSet.extractMin();\n if (!current) {\n break;\n }\n\n const currentNode = current.node;\n\n if (currentNode === goal) {\n // Reconstruct path\n const path = pathfindingUtils.reconstructPath(cameFrom, goal);\n const goalCost = gScore.get(goal);\n if (goalCost === undefined) {\n return null;\n }\n\n return { path, cost: goalCost };\n }\n\n closedSet.add(currentNode);\n\n const neighbors = graph.get(currentNode);\n if (!neighbors) {\n continue;\n }\n\n for (const [neighbor, weight] of neighbors) {\n if (closedSet.has(neighbor)) {\n continue;\n }\n\n const currentNodeGScore = gScore.get(currentNode);\n if (currentNodeGScore === undefined) {\n continue;\n }\n\n const tentativeGScore = currentNodeGScore + weight;\n const currentGScore = gScore.get(neighbor) ?? Infinity;\n\n if (tentativeGScore < currentGScore) {\n // This path to neighbor is better\n cameFrom.set(neighbor, currentNode);\n gScore.set(neighbor, tentativeGScore);\n fScore.set(neighbor, tentativeGScore + heuristic(neighbor, goal));\n\n // Add to open set if not already there\n const neighborFScore = fScore.get(neighbor);\n if (neighborFScore !== undefined) {\n openSet.insert({ node: neighbor, distance: neighborFScore });\n }\n }\n }\n }\n\n return null; // No path found\n}\n\n/**\n * A* pathfinding with path reconstruction details\n * Returns detailed information about the search process\n * @param graph - The graph represented as an adjacency list\n * @param start - The starting node\n * @param goal - The goal node\n * @param heuristic - Heuristic function that estimates distance from node to goal\n * @returns Detailed result including path, cost, visited nodes, and score maps\n */\nexport function astarWithDetails<T>(\n graph: Map<T, Map<T, number>>,\n start: T,\n goal: T,\n heuristic: (node: T, goal: T) => number,\n): {\n path: T[] | null;\n cost: number;\n visited: Set<T>;\n gScores: Map<T, number>;\n fScores: Map<T, number>;\n} {\n const openSet = new MinPriorityQueue<graphNode<T>>();\n const gScore = new Map<T, number>();\n const fScore = new Map<T, number>();\n const cameFrom = new Map<T, T>();\n const closedSet = new Set<T>();\n\n gScore.set(start, 0);\n fScore.set(start, heuristic(start, goal));\n const startFScore = fScore.get(start);\n if (startFScore === undefined) {\n return {\n path: null,\n cost: Infinity,\n visited: new Set(),\n gScores: new Map(),\n fScores: new Map(),\n };\n }\n\n openSet.insert({ node: start, distance: startFScore });\n\n while (!openSet.isEmpty()) {\n const current = openSet.extractMin();\n if (!current) {\n break;\n }\n\n const currentNode = current.node;\n\n if (currentNode === goal) {\n const path = pathfindingUtils.reconstructPath(cameFrom, goal);\n return {\n path,\n cost: gScore.get(goal) ?? Infinity,\n visited: closedSet,\n gScores: gScore,\n fScores: fScore,\n };\n }\n\n closedSet.add(currentNode);\n\n const neighbors = graph.get(currentNode);\n if (!neighbors) {\n continue;\n }\n\n for (const [neighbor, weight] of neighbors) {\n if (closedSet.has(neighbor)) {\n continue;\n }\n\n const currentNodeGScore = gScore.get(currentNode);\n if (currentNodeGScore === undefined) {\n continue;\n }\n\n const tentativeGScore = currentNodeGScore + weight;\n const currentGScore = gScore.get(neighbor) ?? Infinity;\n\n if (tentativeGScore < currentGScore) {\n cameFrom.set(neighbor, currentNode);\n gScore.set(neighbor, tentativeGScore);\n fScore.set(neighbor, tentativeGScore + heuristic(neighbor, goal));\n const neighborFScore = fScore.get(neighbor);\n if (neighborFScore !== undefined) {\n openSet.insert({ node: neighbor, distance: neighborFScore });\n }\n }\n }\n }\n\n return {\n path: null,\n cost: Infinity,\n visited: closedSet,\n gScores: gScore,\n fScores: fScore,\n };\n}\n\n/**\n * Common heuristic functions for A*\n */\nexport const heuristics = {\n /**\n * Manhattan distance heuristic for grid-based graphs\n * @param a - First coordinate as [x, y] tuple\n * @param b - Second coordinate as [x, y] tuple\n * @returns The Manhattan distance between the two points\n */\n manhattan: (a: [number, number], b: [number, number]): number => {\n return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);\n },\n\n /**\n * Euclidean distance heuristic\n * @param a - First coordinate as [x, y] tuple\n * @param b - Second coordinate as [x, y] tuple\n * @returns The Euclidean distance between the two points\n */\n euclidean: (a: [number, number], b: [number, number]): number => {\n return Math.sqrt(Math.pow(a[0] - b[0], 2) + Math.pow(a[1] - b[1], 2));\n },\n\n /**\n * Chebyshev distance heuristic (diagonal movement allowed)\n * @param a - First coordinate as [x, y] tuple\n * @param b - Second coordinate as [x, y] tuple\n * @returns The Chebyshev distance between the two points\n */\n chebyshev: (a: [number, number], b: [number, number]): number => {\n return Math.max(Math.abs(a[0] - b[0]), Math.abs(a[1] - b[1]));\n },\n\n /**\n * Zero heuristic (makes A* behave like Dijkstra)\n * @param _a - First node (unused)\n * @param _b - Second node (unused)\n * @returns Always returns 0\n */\n zero: <T>(_a: T, _b: T): number => 0,\n};\n","import { bfsAugmentingPath } from \"../algorithms/traversal/bfs-variants.js\";\nimport type { Graph } from \"../core/graph.js\";\nimport { graphToMap } from \"../utils/graph-converters.js\";\n\n/**\n * Ford-Fulkerson Algorithm for Maximum Flow\n *\n * Finds the maximum flow from source to sink in a flow network\n * using the method of augmenting paths.\n */\n\nexport interface FlowEdge {\n from: string;\n to: string;\n capacity: number;\n flow: number;\n}\n\nexport interface FlowNetwork {\n nodes: Set<string>;\n edges: Map<string, Map<string, FlowEdge>>;\n}\n\nexport interface MaxFlowResult {\n maxFlow: number;\n flowGraph: Map<string, Map<string, number>>;\n minCut?: { source: Set<string>; sink: Set<string>; edges: [string, string][] };\n}\n\n/**\n * Create residual graph from original graph\n * @param graph - The original graph with capacity values\n * @returns A residual graph initialized with the original capacities\n */\nfunction createResidualGraph(graph: Map<string, Map<string, number>>): Map<string, Map<string, number>> {\n const residual = new Map<string, Map<string, number>>();\n\n for (const [u, neighbors] of graph) {\n residual.set(u, new Map());\n for (const [v, capacity] of neighbors) {\n const uResidualNeighbors = residual.get(u);\n if (uResidualNeighbors) {\n uResidualNeighbors.set(v, capacity);\n }\n }\n }\n\n return residual;\n}\n\n/**\n * Find augmenting path using DFS\n * @param residualGraph - The residual graph with remaining capacities\n * @param source - The source node\n * @param sink - The sink node\n * @returns An array of nodes forming the path, or null if no path exists\n */\nfunction findAugmentingPathDFS(\n residualGraph: Map<string, Map<string, number>>,\n source: string,\n sink: string,\n): string[] | null {\n const visited = new Set<string>();\n const path: string[] = [];\n\n function dfs(node: string): boolean {\n if (node === sink) {\n path.push(node);\n return true;\n }\n\n visited.add(node);\n path.push(node);\n\n const neighbors = residualGraph.get(node);\n if (neighbors) {\n for (const [neighbor, capacity] of neighbors) {\n if (!visited.has(neighbor) && capacity > 0) {\n if (dfs(neighbor)) {\n return true;\n }\n }\n }\n }\n\n path.pop();\n return false;\n }\n\n if (dfs(source)) {\n return path;\n }\n\n return null;\n}\n\n/**\n * Update flow along an augmenting path\n * @param residualGraph - The residual graph to update\n * @param flowGraph - The flow graph to update with new flow values\n * @param originalGraph - The original graph for edge direction reference\n * @param path - The augmenting path to update flow along\n * @param pathFlow - The amount of flow to push through the path\n */\nfunction updateFlow(\n residualGraph: Map<string, Map<string, number>>,\n flowGraph: Map<string, Map<string, number>>,\n originalGraph: Map<string, Map<string, number>>,\n path: string[],\n pathFlow: number,\n): void {\n for (let i = 0; i < path.length - 1; i++) {\n const u = path[i];\n const v = path[i + 1];\n if (!u || !v) {\n continue;\n }\n\n // Update residual graph\n const uEdges = residualGraph.get(u);\n if (uEdges) {\n const currentCapacity = uEdges.get(v);\n if (currentCapacity !== undefined) {\n uEdges.set(v, currentCapacity - pathFlow);\n }\n }\n\n // Add reverse edge\n if (!residualGraph.has(v)) {\n residualGraph.set(v, new Map());\n }\n\n const vEdges = residualGraph.get(v);\n if (vEdges) {\n vEdges.set(u, (vEdges.get(u) ?? 0) + pathFlow);\n }\n\n // Update flow graph\n if (originalGraph.get(u)?.has(v)) {\n const uFlowEdges = flowGraph.get(u);\n if (uFlowEdges) {\n const currentFlow = uFlowEdges.get(v) ?? 0;\n uFlowEdges.set(v, currentFlow + pathFlow);\n }\n } else if (originalGraph.get(v)?.has(u)) {\n // This is a reverse flow\n const vFlowEdges = flowGraph.get(v);\n if (vFlowEdges) {\n const currentFlow = vFlowEdges.get(u) ?? 0;\n vFlowEdges.set(u, currentFlow - pathFlow);\n }\n }\n }\n}\n\n/**\n * Find minimum cut from source side\n * @param residualGraph - The residual graph after max flow computation\n * @param source - The source node\n * @returns The minimum cut partition with source and sink sets and cut edges\n */\nfunction findMinCut(\n residualGraph: Map<string, Map<string, number>>,\n source: string,\n): { source: Set<string>; sink: Set<string>; edges: [string, string][] } {\n // Find all reachable nodes from source in residual graph\n const sourceSet = new Set<string>();\n const queue = [source];\n sourceSet.add(source);\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n continue;\n }\n\n const neighbors = residualGraph.get(current);\n\n if (neighbors) {\n for (const [neighbor, capacity] of neighbors) {\n if (!sourceSet.has(neighbor) && capacity > 0) {\n sourceSet.add(neighbor);\n queue.push(neighbor);\n }\n }\n }\n }\n\n // All other nodes are in sink set\n const sinkSet = new Set<string>();\n for (const node of residualGraph.keys()) {\n if (!sourceSet.has(node)) {\n sinkSet.add(node);\n }\n }\n\n // Find cut edges\n const cutEdges: [string, string][] = [];\n for (const u of sourceSet) {\n const neighbors = residualGraph.get(u);\n if (neighbors) {\n for (const v of neighbors.keys()) {\n if (sinkSet.has(v)) {\n cutEdges.push([u, v]);\n }\n }\n }\n }\n\n return { source: sourceSet, sink: sinkSet, edges: cutEdges };\n}\n\n/**\n * Core max flow algorithm implementation\n * @param graph - The graph with capacity values\n * @param source - The source node\n * @param sink - The sink node\n * @param findPath - Function to find an augmenting path in the residual graph\n * @returns The maximum flow result including flow value, flow graph, and minimum cut\n */\nfunction maxFlowCore(\n graph: Map<string, Map<string, number>>,\n source: string,\n sink: string,\n findPath: (\n residual: Map<string, Map<string, number>>,\n src: string,\n snk: string,\n ) => { path: string[]; pathCapacity: number } | null,\n): MaxFlowResult {\n if (!graph.has(source) || !graph.has(sink)) {\n return { maxFlow: 0, flowGraph: new Map() };\n }\n\n // Create residual graph\n const residualGraph = createResidualGraph(graph);\n const flowGraph = new Map<string, Map<string, number>>();\n\n // Initialize flow graph\n for (const [u, neighbors] of graph) {\n flowGraph.set(u, new Map());\n for (const v of neighbors.keys()) {\n const uFlowNeighbors = flowGraph.get(u);\n if (uFlowNeighbors) {\n uFlowNeighbors.set(v, 0);\n }\n }\n }\n\n let maxFlow = 0;\n let pathResult = findPath(residualGraph, source, sink);\n\n while (pathResult !== null) {\n const { path, pathCapacity } = pathResult;\n\n // Update flow\n updateFlow(residualGraph, flowGraph, graph, path, pathCapacity);\n maxFlow += pathCapacity;\n\n // Find next path\n pathResult = findPath(residualGraph, source, sink);\n }\n\n // Find minimum cut\n const minCut = findMinCut(residualGraph, source);\n\n return { maxFlow, flowGraph, minCut };\n}\n\n/**\n * Internal implementation of Ford-Fulkerson algorithm using DFS\n * @param graph - The graph with capacity values\n * @param source - The source node\n * @param sink - The sink node\n * @returns The maximum flow result\n */\nfunction fordFulkersonImpl(graph: Map<string, Map<string, number>>, source: string, sink: string): MaxFlowResult {\n // Adapter function for DFS path finding\n const findPathDFS = (\n residual: Map<string, Map<string, number>>,\n src: string,\n snk: string,\n ): { path: string[]; pathCapacity: number } | null => {\n const path = findAugmentingPathDFS(residual, src, snk);\n if (!path) {\n return null;\n }\n\n // Calculate path capacity\n let pathCapacity = Infinity;\n for (let i = 0; i < path.length - 1; i++) {\n const u = path[i];\n const v = path[i + 1];\n if (u && v) {\n const capacity = residual.get(u)?.get(v);\n if (capacity !== undefined) {\n pathCapacity = Math.min(pathCapacity, capacity);\n }\n }\n }\n\n return { path, pathCapacity };\n };\n\n return maxFlowCore(graph, source, sink, findPathDFS);\n}\n\n/**\n * Internal implementation of Edmonds-Karp algorithm\n * @param graph - The graph with capacity values\n * @param source - The source node\n * @param sink - The sink node\n * @returns The maximum flow result\n */\nfunction edmondsKarpImpl(graph: Map<string, Map<string, number>>, source: string, sink: string): MaxFlowResult {\n // Use BFS variant for path finding\n const findPathBFS = (\n residual: Map<string, Map<string, number>>,\n src: string,\n snk: string,\n ): { path: string[]; pathCapacity: number } | null => {\n return bfsAugmentingPath(residual, src, snk);\n };\n\n return maxFlowCore(graph, source, sink, findPathBFS);\n}\n\n/**\n * Utility function to create a flow network for bipartite matching\n * @param leftNodes - Array of left partition node identifiers\n * @param rightNodes - Array of right partition node identifiers\n * @param edges - Array of edges connecting left nodes to right nodes\n * @returns The flow network graph with source and sink nodes\n */\nexport function createBipartiteFlowNetwork(\n leftNodes: string[],\n rightNodes: string[],\n edges: [string, string][],\n): { graph: Map<string, Map<string, number>>; source: string; sink: string } {\n const graph = new Map<string, Map<string, number>>();\n const source = \"__source__\";\n const sink = \"__sink__\";\n\n // Add source connections to left nodes\n graph.set(source, new Map());\n for (const left of leftNodes) {\n const sourceNeighbors = graph.get(source);\n if (sourceNeighbors) {\n sourceNeighbors.set(left, 1);\n }\n\n graph.set(left, new Map());\n }\n\n // Add edges between left and right\n for (const [left, right] of edges) {\n if (!graph.has(left)) {\n graph.set(left, new Map());\n }\n\n const leftNeighbors = graph.get(left);\n if (leftNeighbors) {\n leftNeighbors.set(right, 1);\n }\n }\n\n // Add right node connections to sink\n for (const right of rightNodes) {\n if (!graph.has(right)) {\n graph.set(right, new Map());\n }\n\n const rightNeighbors = graph.get(right);\n if (rightNeighbors) {\n rightNeighbors.set(sink, 1);\n }\n }\n\n graph.set(sink, new Map());\n\n return { graph, source, sink };\n}\n\n/**\n * Ford-Fulkerson algorithm using DFS for finding augmenting paths\n * @param graph - Adjacency list representation with capacities - accepts Graph class or Map\n * @param source - Source node\n * @param sink - Sink node\n * @returns Maximum flow value and flow graph\n *\n * Time Complexity: O(E * f) where f is the maximum flow\n * Space Complexity: O(V + E)\n */\nexport function fordFulkerson(graph: Graph, source: string, sink: string): MaxFlowResult {\n // Convert Graph to Map representation\n const graphMap = graphToMap(graph);\n return fordFulkersonImpl(graphMap, source, sink);\n}\n\n/**\n * Edmonds-Karp algorithm (Ford-Fulkerson with BFS)\n * More efficient implementation with better time complexity\n * @param graph - Adjacency list representation with capacities - accepts Graph class or Map\n * @param source - Source node\n * @param sink - Sink node\n * @returns Maximum flow value and flow graph\n *\n * Time Complexity: O(V * E²)\n */\nexport function edmondsKarp(\n graph: Graph | Map<string, Map<string, number>>,\n source: string,\n sink: string,\n): MaxFlowResult {\n // Convert Graph to Map representation if needed\n const graphMap = graph instanceof Map ? graph : graphToMap(graph);\n return edmondsKarpImpl(graphMap, source, sink);\n}\n","/**\n * Minimum Cut Algorithms\n *\n * Various algorithms for finding minimum cuts in graphs\n */\n\nimport type { Graph } from \"../core/graph.js\";\nimport { graphToMap } from \"../utils/graph-converters.js\";\nimport { fordFulkerson } from \"./ford-fulkerson.js\";\n\nexport interface MinCutResult {\n cutValue: number;\n partition1: Set<string>;\n partition2: Set<string>;\n cutEdges: { from: string; to: string; weight: number }[];\n}\n\n/**\n * Find minimum s-t cut using max flow\n * The minimum cut value equals the maximum flow value (max-flow min-cut theorem)\n * @param graph - Weighted graph\n * @param source - Source node\n * @param sink - Sink node\n * @returns Minimum cut information\n *\n * Time Complexity: Same as max flow algorithm used\n */\nexport function minSTCut(graph: Graph, source: string, sink: string): MinCutResult {\n const flowResult = fordFulkerson(graph, source, sink);\n\n if (!flowResult.minCut) {\n return {\n cutValue: 0,\n partition1: new Set(),\n partition2: new Set(),\n cutEdges: [],\n };\n }\n\n const cutEdges: { from: string; to: string; weight: number }[] = [];\n\n // Find actual cut edges and their weights\n for (const [u, v] of flowResult.minCut.edges) {\n const edge = graph.getEdge(u, v);\n const weight = edge?.weight ?? 0;\n if (weight > 0) {\n cutEdges.push({ from: u, to: v, weight });\n }\n }\n\n return {\n cutValue: flowResult.maxFlow,\n partition1: flowResult.minCut.source,\n partition2: flowResult.minCut.sink,\n cutEdges,\n };\n}\n\n/**\n * Stoer-Wagner algorithm for finding global minimum cut\n * Finds the minimum cut that separates the graph into two parts\n * @param graph - Undirected weighted graph - accepts Graph class or Map representation\n * @returns Global minimum cut\n *\n * Time Complexity: O(V³) or O(VE + V² log V) with heap\n */\nexport function stoerWagner(graph: Graph | Map<string, Map<string, number>>): MinCutResult {\n // Convert Graph to Map representation if needed\n const graphMap = graph instanceof Map ? graph : graphToMap(graph);\n // Convert to undirected if necessary\n const undirectedGraph = makeUndirected(graphMap);\n // Keep a copy for finding cut edges later\n const originalGraph = makeUndirected(graphMap);\n\n if (undirectedGraph.size < 2) {\n return {\n cutValue: 0,\n partition1: new Set(undirectedGraph.keys()),\n partition2: new Set(),\n cutEdges: [],\n };\n }\n\n // Initialize\n const nodes = Array.from(undirectedGraph.keys());\n const originalNodes = new Set(nodes); // Keep track of original nodes\n let minCutValue = Infinity;\n let bestPartition = new Set<string>();\n const contractionMap = new Map<string, Set<string>>();\n\n // Initialize contraction map\n for (const node of nodes) {\n contractionMap.set(node, new Set([node]));\n }\n\n // Contract graph V-1 times\n while (nodes.length > 1) {\n const cut = minimumCutPhase(undirectedGraph, nodes);\n\n if (cut.value < minCutValue) {\n minCutValue = cut.value;\n // Store the actual nodes that would be in partition with t\n const cutTNodes = contractionMap.get(cut.t);\n if (cutTNodes) {\n bestPartition = new Set(cutTNodes);\n }\n }\n\n // Contract the last two nodes\n const tNodes = contractionMap.get(cut.t);\n const sNodes = contractionMap.get(cut.s);\n if (!tNodes || !sNodes) {\n continue;\n }\n\n for (const node of tNodes) {\n sNodes.add(node);\n }\n contractionMap.delete(cut.t);\n\n contractNodes(undirectedGraph, nodes, cut.s, cut.t);\n }\n\n // Build result\n const partition1 = bestPartition;\n const partition2 = new Set<string>();\n\n for (const node of originalNodes) {\n if (!partition1.has(node)) {\n partition2.add(node);\n }\n }\n\n // Find cut edges\n const cutEdges: { from: string; to: string; weight: number }[] = [];\n for (const u of partition1) {\n const neighbors = originalGraph.get(u);\n if (neighbors) {\n for (const [v, weight] of neighbors) {\n if (partition2.has(v)) {\n cutEdges.push({ from: u, to: v, weight });\n }\n }\n }\n }\n\n return {\n cutValue: minCutValue,\n partition1,\n partition2,\n cutEdges,\n };\n}\n\n/**\n * Minimum cut phase of Stoer-Wagner algorithm\n * @param graph - The undirected weighted graph\n * @param nodes - Array of remaining nodes in the graph\n * @returns The cut result with last two nodes, cut value, and partition\n */\nfunction minimumCutPhase(\n graph: Map<string, Map<string, number>>,\n nodes: string[],\n): { s: string; t: string; value: number; partition: string[] } {\n const n = nodes.length;\n const weight = new Map<string, number>();\n const added = new Set<string>();\n const order: string[] = [];\n\n // Initialize weights to 0\n for (const node of nodes) {\n weight.set(node, 0);\n }\n\n // Start with arbitrary node\n let lastAdded = nodes[0];\n if (!lastAdded) {\n return { s: \"\", t: \"\", value: 0, partition: [] };\n }\n\n added.add(lastAdded);\n order.push(lastAdded);\n\n // Add remaining nodes\n for (let i = 1; i < n; i++) {\n // Update weights\n if (!lastAdded) {\n continue;\n }\n\n const neighbors = graph.get(lastAdded);\n if (neighbors) {\n for (const [neighbor, w] of neighbors) {\n if (!added.has(neighbor) && nodes.includes(neighbor)) {\n const currentWeight = weight.get(neighbor);\n if (currentWeight !== undefined) {\n weight.set(neighbor, currentWeight + w);\n }\n }\n }\n }\n\n // Find maximum weight node not yet added\n let maxWeight = -1;\n let maxNode = \"\";\n\n for (const node of nodes) {\n const nodeWeight = weight.get(node);\n if (!added.has(node) && nodeWeight !== undefined && nodeWeight > maxWeight) {\n maxWeight = nodeWeight;\n maxNode = node;\n }\n }\n\n added.add(maxNode);\n order.push(maxNode);\n lastAdded = maxNode;\n }\n\n const s = order[order.length - 2];\n const t = order[order.length - 1];\n if (!s || !t) {\n return { s: \"\", t: \"\", value: 0, partition: [] };\n }\n\n const cutValue = weight.get(t) ?? 0;\n\n // Partition is all nodes except t\n const partition = order.slice(0, -1);\n\n return { s, t, value: cutValue, partition };\n}\n\n/**\n * Contract two nodes in the graph\n * @param graph - The graph to modify by contracting nodes\n * @param nodes - Array of nodes to update after contraction\n * @param s - The node to keep after contraction\n * @param t - The node to merge into s\n */\nfunction contractNodes(graph: Map<string, Map<string, number>>, nodes: string[], s: string, t: string): void {\n // Merge t into s\n const sNeighbors = graph.get(s);\n const tNeighbors = graph.get(t);\n if (!sNeighbors || !tNeighbors) {\n return;\n }\n\n // Add t's edges to s\n for (const [neighbor, weight] of tNeighbors) {\n if (neighbor !== s) {\n sNeighbors.set(neighbor, (sNeighbors.get(neighbor) ?? 0) + weight);\n\n // Update neighbor's edge to point to s instead of t\n const neighborEdges = graph.get(neighbor);\n if (neighborEdges?.has(t)) {\n neighborEdges.delete(t);\n neighborEdges.set(s, (neighborEdges.get(s) ?? 0) + weight);\n }\n }\n }\n\n // Remove t from graph\n graph.delete(t);\n sNeighbors.delete(t);\n\n // Remove t from nodes array\n const index = nodes.indexOf(t);\n if (index > -1) {\n nodes.splice(index, 1);\n }\n}\n\n/**\n * Convert directed graph to undirected\n * @param graph - The directed graph to convert\n * @returns An undirected graph with edges in both directions\n */\nfunction makeUndirected(graph: Map<string, Map<string, number>>): Map<string, Map<string, number>> {\n const undirected = new Map<string, Map<string, number>>();\n\n // Initialize all nodes\n for (const node of graph.keys()) {\n undirected.set(node, new Map());\n }\n\n // Add edges in both directions\n for (const [u, neighbors] of graph) {\n for (const [v, weight] of neighbors) {\n const uNeighbors = undirected.get(u);\n if (uNeighbors) {\n uNeighbors.set(v, weight);\n }\n\n if (!undirected.has(v)) {\n undirected.set(v, new Map());\n }\n\n const vNeighbors = undirected.get(v);\n if (vNeighbors) {\n vNeighbors.set(u, weight);\n }\n }\n }\n\n return undirected;\n}\n\n/**\n * Karger's randomized min-cut algorithm\n * Probabilistic algorithm that finds min cut with high probability\n * @param graph - Undirected graph - accepts Graph class or Map representation\n * @param iterations - Number of iterations (higher = better accuracy)\n * @returns Minimum cut found\n *\n * Time Complexity: O(V² * iterations)\n */\nexport function kargerMinCut(graph: Graph | Map<string, Map<string, number>>, iterations = 100): MinCutResult {\n // Convert Graph to Map representation if needed\n const graphMap = graph instanceof Map ? graph : graphToMap(graph);\n let minCutValue = Infinity;\n let bestPartition1 = new Set<string>();\n let bestPartition2 = new Set<string>();\n\n for (let i = 0; i < iterations; i++) {\n const result = kargerSingleRun(graphMap);\n\n if (result.cutValue < minCutValue) {\n minCutValue = result.cutValue;\n bestPartition1 = result.partition1;\n bestPartition2 = result.partition2;\n }\n }\n\n // Find cut edges\n const cutEdges: { from: string; to: string; weight: number }[] = [];\n for (const u of bestPartition1) {\n const neighbors = graphMap.get(u);\n if (neighbors) {\n for (const [v, weight] of neighbors) {\n if (bestPartition2.has(v)) {\n cutEdges.push({ from: u, to: v, weight });\n }\n }\n }\n }\n\n return {\n cutValue: minCutValue,\n partition1: bestPartition1,\n partition2: bestPartition2,\n cutEdges,\n };\n}\n\n/**\n * Single run of Karger's algorithm\n * @param graph - The undirected weighted graph\n * @returns The cut result with cut value and two partitions\n */\nfunction kargerSingleRun(graph: Map<string, Map<string, number>>): {\n cutValue: number;\n partition1: Set<string>;\n partition2: Set<string>;\n} {\n // Create a copy of the graph\n const workGraph = new Map<string, Map<string, number>>();\n const superNodes = new Map<string, Set<string>>();\n\n // Initialize\n for (const [node, neighbors] of graph) {\n workGraph.set(node, new Map(neighbors));\n superNodes.set(node, new Set([node]));\n }\n\n // Contract until 2 nodes remain\n while (workGraph.size > 2) {\n // Pick random edge\n const edges: [string, string, number][] = [];\n for (const [u, neighbors] of workGraph) {\n for (const [v, weight] of neighbors) {\n if (u < v) {\n // Avoid duplicates\n edges.push([u, v, weight]);\n }\n }\n }\n\n if (edges.length === 0) {\n break;\n }\n\n const randomIndex = Math.floor(Math.random() * edges.length);\n const edge = edges[randomIndex];\n if (!edge) {\n continue;\n }\n\n const [u, v] = edge;\n\n // Contract edge\n if (u && v) {\n contractKarger(workGraph, superNodes, u, v);\n }\n }\n\n // Calculate cut value\n const nodes = Array.from(workGraph.keys());\n if (nodes.length < 2) {\n return {\n cutValue: 0,\n partition1: new Set(),\n partition2: new Set(),\n };\n }\n\n const node1 = nodes[0];\n const node2 = nodes[1];\n if (!node1 || !node2) {\n return {\n cutValue: 0,\n partition1: new Set(),\n partition2: new Set(),\n };\n }\n\n const cutValue = workGraph.get(node1)?.get(node2) ?? 0;\n\n return {\n cutValue,\n partition1: superNodes.get(node1) ?? new Set(),\n partition2: superNodes.get(node2) ?? new Set(),\n };\n}\n\n/**\n * Contract edge in Karger's algorithm\n * @param graph - The working graph to modify\n * @param superNodes - Map tracking which original nodes are in each super node\n * @param u - First endpoint of the edge to contract\n * @param v - Second endpoint of the edge to contract (merged into u)\n */\nfunction contractKarger(\n graph: Map<string, Map<string, number>>,\n superNodes: Map<string, Set<string>>,\n u: string,\n v: string,\n): void {\n // Merge v into u\n const uNeighbors = graph.get(u);\n const vNeighbors = graph.get(v);\n if (!uNeighbors || !vNeighbors) {\n return;\n }\n\n // Merge supernodes\n const uSuper = superNodes.get(u);\n const vSuper = superNodes.get(v);\n if (!uSuper || !vSuper) {\n return;\n }\n\n for (const node of vSuper) {\n uSuper.add(node);\n }\n\n // Merge edges\n for (const [neighbor, weight] of vNeighbors) {\n if (neighbor !== u) {\n uNeighbors.set(neighbor, (uNeighbors.get(neighbor) ?? 0) + weight);\n\n // Update neighbor's edges\n const neighborEdges = graph.get(neighbor);\n if (neighborEdges) {\n neighborEdges.delete(v);\n if (neighbor !== u) {\n neighborEdges.set(u, (neighborEdges.get(u) ?? 0) + weight);\n }\n }\n }\n }\n\n // Remove self-loops\n uNeighbors.delete(u);\n uNeighbors.delete(v);\n\n // Remove v\n graph.delete(v);\n superNodes.delete(v);\n}\n","/**\n * Hierarchical Clustering Algorithm\n *\n * Builds a hierarchy of clusters through agglomeration (bottom-up)\n * or division (top-down). Useful for understanding multi-scale\n * structure in graphs.\n */\n\nimport type { Graph } from \"../core/graph.js\";\n\n/**\n * Convert Graph to adjacency set representation for clustering\n * @param graph - The input graph to convert\n * @returns Map of node IDs to sets of neighbor node IDs\n */\nfunction graphToAdjacencySet(graph: Graph): Map<string, Set<string>> {\n const adjacency = new Map<string, Set<string>>();\n\n // Initialize all nodes\n for (const node of graph.nodes()) {\n adjacency.set(String(node.id), new Set());\n }\n\n // Add edges\n for (const edge of graph.edges()) {\n const source = String(edge.source);\n const target = String(edge.target);\n\n const sourceSet = adjacency.get(source);\n if (sourceSet) {\n sourceSet.add(target);\n }\n\n // For undirected graphs, add reverse edge\n if (!graph.isDirected) {\n const targetSet = adjacency.get(target);\n if (targetSet) {\n targetSet.add(source);\n }\n }\n }\n\n return adjacency;\n}\n\nexport interface ClusterNode<T> {\n id: string;\n members: Set<T>;\n left?: ClusterNode<T> | undefined;\n right?: ClusterNode<T> | undefined;\n distance: number;\n height: number;\n // For forest roots, store the individual trees\n trees?: ClusterNode<T>[] | undefined;\n}\n\nexport interface HierarchicalClusteringResult<T> {\n root: ClusterNode<T>;\n dendrogram: ClusterNode<T>[];\n clusters: Map<number, Set<T>[]>;\n}\n\nexport type LinkageMethod = \"single\" | \"complete\" | \"average\" | \"ward\";\n\n/**\n * Compute distance between two nodes based on graph structure\n * @param graph - Adjacency map representation of the graph\n * @param distances - Map to store computed distances between nodes\n */\nfunction computeGraphDistance<T>(graph: Map<T, Set<T>>, distances: Map<T, Map<T, number>>): void {\n // Use BFS to compute shortest path distances\n for (const start of graph.keys()) {\n const dist = new Map<T, number>();\n const queue: T[] = [start];\n dist.set(start, 0);\n\n while (queue.length > 0) {\n const node = queue.shift();\n if (!node) {\n continue;\n }\n\n const neighbors = graph.get(node);\n\n if (neighbors) {\n for (const neighbor of neighbors) {\n if (!dist.has(neighbor)) {\n dist.set(neighbor, (dist.get(node) ?? 0) + 1);\n queue.push(neighbor);\n }\n }\n }\n }\n\n distances.set(start, dist);\n }\n}\n\n/**\n * Compute distance between two clusters based on linkage method\n * @param cluster1 - First cluster node\n * @param cluster2 - Second cluster node\n * @param distances - Precomputed distance matrix between nodes\n * @param linkage - Linkage method to use for computing cluster distance\n * @returns The distance between the two clusters\n */\nfunction clusterDistance<T>(\n cluster1: ClusterNode<T>,\n cluster2: ClusterNode<T>,\n distances: Map<T, Map<T, number>>,\n linkage: LinkageMethod,\n): number {\n const allDistances: number[] = [];\n\n for (const node1 of cluster1.members) {\n const node1Distances = distances.get(node1);\n if (!node1Distances) {\n continue;\n }\n\n for (const node2 of cluster2.members) {\n const dist = node1Distances.get(node2);\n if (dist !== undefined) {\n allDistances.push(dist);\n }\n }\n }\n\n if (allDistances.length === 0) {\n return Infinity;\n }\n\n switch (linkage) {\n case \"single\":\n return Math.min(...allDistances);\n case \"complete\":\n return Math.max(...allDistances);\n case \"average\":\n return allDistances.reduce((a, b) => a + b, 0) / allDistances.length;\n case \"ward\": {\n // Simplified Ward's method - minimize within-cluster variance\n const size1 = cluster1.members.size;\n const size2 = cluster2.members.size;\n const avgDist = allDistances.reduce((a, b) => a + b, 0) / allDistances.length;\n return avgDist * ((size1 * size2) / (size1 + size2));\n }\n default:\n return Math.min(...allDistances);\n }\n}\n\n/**\n * Internal implementation of agglomerative hierarchical clustering\n * @param graph - Adjacency map representation of the graph\n * @param linkage - Linkage method for cluster distance computation\n * @returns Hierarchical clustering result with dendrogram and cluster assignments\n */\nfunction hierarchicalClusteringImpl<T>(\n graph: Map<T, Set<T>>,\n linkage: LinkageMethod = \"single\",\n): HierarchicalClusteringResult<T> {\n const nodes = Array.from(graph.keys());\n const n = nodes.length;\n\n if (n === 0) {\n return {\n root: { id: \"empty\", members: new Set(), distance: 0, height: 0 },\n dendrogram: [],\n clusters: new Map(),\n };\n }\n\n // Compute pairwise distances\n const distances = new Map<T, Map<T, number>>();\n computeGraphDistance(graph, distances);\n\n // Initialize clusters - each node is its own cluster\n const clusters: ClusterNode<T>[] = nodes.map((node, i) => ({\n id: `leaf-${String(i)}`,\n members: new Set([node]),\n distance: 0,\n height: 0,\n }));\n\n const dendrogram: ClusterNode<T>[] = [...clusters];\n let clusterCount = n;\n\n // Distance matrix between clusters\n const clusterDistances = new Map<string, Map<string, number>>();\n\n // Initialize cluster distances\n for (let i = 0; i < clusters.length; i++) {\n const cluster1 = clusters[i];\n if (!cluster1) {\n continue;\n }\n\n const distMap = new Map<string, number>();\n for (let j = i + 1; j < clusters.length; j++) {\n const cluster2 = clusters[j];\n if (!cluster2) {\n continue;\n }\n\n const dist = clusterDistance(cluster1, cluster2, distances, linkage);\n distMap.set(cluster2.id, dist);\n }\n clusterDistances.set(cluster1.id, distMap);\n }\n\n // Active clusters\n const activeClusters = new Set(clusters);\n\n // Merge clusters until only one remains\n while (activeClusters.size > 1) {\n // Find closest pair of clusters\n let minDist = Infinity;\n let mergeCluster1: ClusterNode<T> | null = null;\n let mergeCluster2: ClusterNode<T> | null = null;\n\n for (const cluster1 of activeClusters) {\n const distMap = clusterDistances.get(cluster1.id);\n if (!distMap) {\n continue;\n }\n\n for (const cluster2 of activeClusters) {\n if (cluster1.id >= cluster2.id) {\n continue;\n }\n\n const dist =\n distMap.get(cluster2.id) ?? clusterDistances.get(cluster2.id)?.get(cluster1.id) ?? Infinity;\n\n if (dist < minDist) {\n minDist = dist;\n mergeCluster1 = cluster1;\n mergeCluster2 = cluster2;\n }\n }\n }\n\n if (!mergeCluster1 || !mergeCluster2 || minDist === Infinity) {\n // No valid merge found - create forest\n const trees = Array.from(activeClusters);\n const forestRoot: ClusterNode<T> = {\n id: `forest-${String(clusterCount++)}`,\n members: new Set(nodes),\n distance: Infinity,\n height: Math.max(...trees.map((t) => t.height)) + 1,\n trees,\n };\n dendrogram.push(forestRoot);\n activeClusters.clear();\n activeClusters.add(forestRoot);\n break;\n }\n\n // Create new cluster\n const newCluster: ClusterNode<T> = {\n id: `cluster-${String(clusterCount++)}`,\n members: new Set([...mergeCluster1.members, ...mergeCluster2.members]),\n left: mergeCluster1,\n right: mergeCluster2,\n distance: minDist,\n height: Math.max(mergeCluster1.height, mergeCluster2.height) + 1,\n };\n\n dendrogram.push(newCluster);\n\n // Update distances to new cluster\n const newDistMap = new Map<string, number>();\n for (const cluster of activeClusters) {\n if (cluster.id === mergeCluster1.id || cluster.id === mergeCluster2.id) {\n continue;\n }\n\n const dist = clusterDistance(newCluster, cluster, distances, linkage);\n newDistMap.set(cluster.id, dist);\n\n // Update reverse direction\n const clusterDistMap = clusterDistances.get(cluster.id);\n if (clusterDistMap) {\n clusterDistMap.set(newCluster.id, dist);\n }\n }\n clusterDistances.set(newCluster.id, newDistMap);\n\n // Remove merged clusters\n activeClusters.delete(mergeCluster1);\n activeClusters.delete(mergeCluster2);\n clusterDistances.delete(mergeCluster1.id);\n clusterDistances.delete(mergeCluster2.id);\n\n // Clean up references\n for (const distMap of clusterDistances.values()) {\n distMap.delete(mergeCluster1.id);\n distMap.delete(mergeCluster2.id);\n }\n\n activeClusters.add(newCluster);\n }\n\n // Root is the last remaining cluster\n const root = activeClusters.size > 0 ? Array.from(activeClusters)[0] : dendrogram[dendrogram.length - 1];\n\n // Generate clusters at different heights\n const clustersByLevel = new Map<number, Set<T>[]>();\n\n if (!root) {\n return {\n root: { id: \"empty\", members: new Set(), distance: 0, height: 0 },\n dendrogram: [],\n clusters: new Map(),\n };\n }\n\n for (let h = 0; h <= root.height; h++) {\n clustersByLevel.set(h, cutDendrogram(root, h));\n }\n\n return {\n root,\n dendrogram,\n clusters: clustersByLevel,\n };\n}\n\n/**\n * Cut dendrogram at specific height to get clusters\n * @param root - Root node of the dendrogram\n * @param height - Height at which to cut the dendrogram\n * @returns Array of sets representing clusters at the specified height\n */\nexport function cutDendrogram<T>(root: ClusterNode<T>, height: number): Set<T>[] {\n const clusters: Set<T>[] = [];\n\n function traverse(node: ClusterNode<T>): void {\n if (node.height <= height || (!node.left && !node.right)) {\n clusters.push(node.members);\n } else {\n if (node.trees) {\n // Handle forest nodes\n for (const tree of node.trees) {\n traverse(tree);\n }\n } else {\n if (node.left) {\n traverse(node.left);\n }\n\n if (node.right) {\n traverse(node.right);\n }\n }\n }\n }\n\n traverse(root);\n return clusters;\n}\n\n/**\n * Cut dendrogram to get exactly k clusters\n * @param root - Root node of the dendrogram\n * @param k - Target number of clusters\n * @returns Array of sets representing exactly k clusters\n */\nexport function cutDendrogramKClusters<T>(root: ClusterNode<T>, k: number): Set<T>[] {\n if (k <= 0) {\n return [];\n }\n\n if (k === 1) {\n return [root.members];\n }\n\n // Binary search for the right height\n let low = 0;\n let high = root.height;\n\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n const clusters = cutDendrogram(root, mid);\n\n if (clusters.length === k) {\n return clusters;\n } else if (clusters.length < k) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return cutDendrogram(root, low);\n}\n\n/**\n * Compute modularity-based hierarchical clustering\n * Uses modularity gain to decide merges\n * @param graph - The input graph to cluster\n * @returns Hierarchical clustering result with dendrogram and cluster assignments\n */\nexport function modularityHierarchicalClustering(graph: Graph): HierarchicalClusteringResult<string> {\n const adjacencySet = graphToAdjacencySet(graph);\n const nodes = Array.from(adjacencySet.keys());\n const n = nodes.length;\n\n if (n === 0) {\n return {\n root: { id: \"empty\", members: new Set(), distance: 0, height: 0 },\n dendrogram: [],\n clusters: new Map(),\n };\n }\n\n // Compute degrees\n const degrees = new Map<string, number>();\n let totalEdges = 0;\n\n for (const [node, neighbors] of adjacencySet) {\n degrees.set(node, neighbors.size);\n totalEdges += neighbors.size;\n }\n\n // For undirected graphs\n totalEdges = totalEdges / 2;\n\n // Initialize clusters\n const clusters: ClusterNode<string>[] = nodes.map((node, i) => ({\n id: `leaf-${String(i)}`,\n members: new Set([node]),\n distance: 0,\n height: 0,\n }));\n\n const dendrogram: ClusterNode<string>[] = [...clusters];\n let clusterCount = n;\n\n // Active clusters\n const activeClusters = new Set(clusters);\n\n // Community assignments\n const communities = new Map<string, number>();\n nodes.forEach((node, i) => communities.set(node, i));\n\n // Merge clusters based on modularity gain\n while (activeClusters.size > 1) {\n let maxGain = -Infinity;\n let mergeCluster1: ClusterNode<string> | null = null;\n let mergeCluster2: ClusterNode<string> | null = null;\n\n for (const cluster1 of activeClusters) {\n for (const cluster2 of activeClusters) {\n if (cluster1.id >= cluster2.id) {\n continue;\n }\n\n // Calculate modularity gain\n let edgesBetween = 0;\n let degreeProduct = 0;\n\n for (const node1 of cluster1.members) {\n const neighbors = adjacencySet.get(node1);\n const degree1 = degrees.get(node1) ?? 0;\n\n for (const node2 of cluster2.members) {\n if (neighbors?.has(node2)) {\n edgesBetween++;\n }\n\n const degree2 = degrees.get(node2) ?? 0;\n degreeProduct += degree1 * degree2;\n }\n }\n\n const gain = edgesBetween / totalEdges - degreeProduct / (4 * totalEdges * totalEdges);\n\n if (gain > maxGain) {\n maxGain = gain;\n mergeCluster1 = cluster1;\n mergeCluster2 = cluster2;\n }\n }\n }\n\n if (!mergeCluster1 || !mergeCluster2) {\n break;\n }\n\n // Create new cluster\n const newCluster: ClusterNode<string> = {\n id: `cluster-${String(clusterCount++)}`,\n members: new Set([...mergeCluster1.members, ...mergeCluster2.members]),\n left: mergeCluster1,\n right: mergeCluster2,\n distance: -maxGain, // Use negative gain as distance\n height: Math.max(mergeCluster1.height, mergeCluster2.height) + 1,\n };\n\n dendrogram.push(newCluster);\n\n // Remove old and add new\n activeClusters.delete(mergeCluster1);\n activeClusters.delete(mergeCluster2);\n activeClusters.add(newCluster);\n }\n\n // Root is the last remaining cluster\n const root = Array.from(activeClusters)[0] ?? dendrogram[dendrogram.length - 1];\n\n // Generate clusters at different heights\n const clustersByLevel = new Map<number, Set<string>[]>();\n\n if (!root) {\n return {\n root: { id: \"empty\", members: new Set(), distance: 0, height: 0 },\n dendrogram: [],\n clusters: new Map(),\n };\n }\n\n for (let h = 0; h <= root.height; h++) {\n clustersByLevel.set(h, cutDendrogram(root, h));\n }\n\n return {\n root,\n dendrogram,\n clusters: clustersByLevel,\n };\n}\n\n/**\n * Agglomerative hierarchical clustering\n * Builds clusters bottom-up by merging closest pairs\n * @param graph - Undirected graph - accepts Graph class or Map<T, Set<T>>\n * @param linkage - Linkage method for cluster distance\n * @returns Hierarchical clustering result\n *\n * Time Complexity: O(n³) naive, O(n² log n) with heap\n * Space Complexity: O(n²)\n */\nexport function hierarchicalClustering(\n graph: Graph,\n linkage: LinkageMethod = \"single\",\n): HierarchicalClusteringResult<string> {\n // Convert Graph to adjacency set representation\n const adjacencySet = graphToAdjacencySet(graph);\n return hierarchicalClusteringImpl(adjacencySet, linkage);\n}\n","/**\n * K-Core Decomposition Algorithm\n *\n * Finds the k-core subgraph where each node has at least k neighbors\n * within the subgraph. Used for identifying cohesive groups and\n * understanding graph structure.\n */\n\nimport type { Graph } from \"../core/graph.js\";\n\n/**\n * Convert Graph to adjacency set representation\n * @param graph - The input graph to convert\n * @returns Map of node IDs to sets of neighbor node IDs\n */\nfunction graphToAdjacencySet(graph: Graph): Map<string, Set<string>> {\n const adjacency = new Map<string, Set<string>>();\n\n // Initialize all nodes\n for (const node of graph.nodes()) {\n adjacency.set(String(node.id), new Set());\n }\n\n // Add edges\n for (const edge of graph.edges()) {\n const source = String(edge.source);\n const target = String(edge.target);\n\n const sourceSet = adjacency.get(source);\n if (sourceSet) {\n sourceSet.add(target);\n }\n\n // For undirected graphs, add reverse edge\n if (!graph.isDirected) {\n const targetSet = adjacency.get(target);\n if (targetSet) {\n targetSet.add(source);\n }\n }\n }\n\n return adjacency;\n}\n\nexport interface KCoreResult<T> {\n cores: Map<number, Set<T>>;\n coreness: Map<T, number>;\n maxCore: number;\n}\n\n/**\n * Internal implementation of K-Core decomposition algorithm\n * @param graph - Adjacency map representation of the graph\n * @returns K-core decomposition result with cores, coreness values, and maximum core number\n */\nfunction kCoreDecompositionImpl<T>(graph: Map<T, Set<T>>): KCoreResult<T> {\n if (graph.size === 0) {\n return { cores: new Map(), coreness: new Map(), maxCore: 0 };\n }\n\n const n = graph.size;\n const nodes = Array.from(graph.keys());\n const nodeToIndex = new Map<T, number>();\n nodes.forEach((node, i) => nodeToIndex.set(node, i));\n\n // Initialize data structures\n const degree = new Array<number>(n).fill(0);\n const pos = new Array<number>(n).fill(0);\n const vert = new Array<number>(n).fill(0);\n const coreness = new Map<T, number>();\n\n // Initialize coreness for all nodes to 0\n for (let i = 0; i < n; i++) {\n const node = nodes[i];\n if (node !== undefined) {\n coreness.set(node, 0);\n }\n }\n\n // Compute initial degrees\n let maxDegree = 0;\n for (let i = 0; i < n; i++) {\n const node = nodes[i];\n if (!node) {\n continue;\n }\n\n const neighbors = graph.get(node);\n const nodeSize = neighbors ? neighbors.size : 0;\n\n degree[i] = nodeSize;\n maxDegree = Math.max(maxDegree, nodeSize);\n }\n\n // Count nodes of each degree\n const bin = new Array<number>(maxDegree + 1).fill(0);\n for (let i = 0; i < n; i++) {\n const deg = degree[i];\n if (deg !== undefined && deg >= 0 && deg < bin.length) {\n const currentCount = bin[deg];\n if (currentCount !== undefined) {\n bin[deg] = currentCount + 1;\n }\n }\n }\n\n // Starting position of each degree in sorted array\n let start = 0;\n for (let d = 0; d <= maxDegree; d++) {\n const temp = bin[d] ?? 0;\n bin[d] = start;\n start += temp;\n }\n\n // Sort nodes by degree\n for (let i = 0; i < n; i++) {\n const deg = degree[i];\n if (deg !== undefined && deg >= 0 && deg < bin.length) {\n const posIndex = bin[deg] ?? 0;\n pos[i] = posIndex;\n vert[posIndex] = i;\n const currentBin = bin[deg];\n if (currentBin !== undefined) {\n bin[deg] = currentBin + 1;\n }\n } else {\n // If we can't properly place the node in vert, set its position to -1\n // This shouldn't happen with our fixes, but just in case\n pos[i] = -1;\n }\n }\n\n // Recover starting positions\n for (let d = maxDegree; d > 0; d--) {\n bin[d] = bin[d - 1] ?? 0;\n }\n bin[0] = 0;\n\n // Main algorithm\n for (let i = 0; i < n; i++) {\n const v = vert[i];\n if (v === undefined) {\n continue;\n }\n\n const node = nodes[v];\n if (node === undefined) {\n continue;\n }\n\n const degreeV = degree[v];\n if (degreeV !== undefined) {\n coreness.set(node, degreeV);\n }\n\n // Process neighbors\n const neighbors = graph.get(node);\n if (!neighbors) {\n // Node has no neighbors, skip neighbor processing but coreness is already set\n continue;\n }\n\n for (const neighbor of neighbors) {\n const u = nodeToIndex.get(neighbor);\n if (u === undefined) {\n continue;\n }\n\n const degreeU = degree[u];\n const degreeV = degree[v];\n if (degreeU !== undefined && degreeV !== undefined && degreeU > degreeV) {\n const du = degreeU;\n const pu = pos[u];\n const pw = bin[du] ?? 0;\n const w = vert[pw];\n\n if (u !== w && w !== undefined && pw < n && pu !== undefined) {\n // Swap u and w in the sorted order\n vert[pu] = w;\n vert[pw] = u;\n pos[u] = pw;\n pos[w] = pu;\n }\n\n const currentBin = bin[du];\n if (currentBin !== undefined) {\n bin[du] = currentBin + 1;\n }\n\n degree[u] = degreeU - 1;\n }\n }\n }\n\n // Build cores map\n const cores = new Map<number, Set<T>>();\n let maxCore = 0;\n\n for (const [node, core] of coreness) {\n if (!cores.has(core)) {\n cores.set(core, new Set());\n }\n\n const coreSet = cores.get(core);\n if (coreSet) {\n coreSet.add(node);\n }\n\n maxCore = Math.max(maxCore, core);\n }\n\n return { cores, coreness, maxCore };\n}\n\n/**\n * Extract the k-core subgraph\n * Returns nodes that belong to k-core or higher\n * @param graph - Undirected graph\n * @param k - Core number\n * @returns Set of nodes in k-core or higher\n */\nexport function getKCore(graph: Graph, k: number): Set<string> {\n const { coreness } = kCoreDecomposition(graph);\n const kCore = new Set<string>();\n\n for (const [node, core] of coreness) {\n if (core >= k) {\n kCore.add(node);\n }\n }\n\n return kCore;\n}\n\n/**\n * Get the induced subgraph for k-core\n * Returns the actual subgraph containing only k-core nodes\n * @param graph - Original graph\n * @param k - Core number\n * @returns K-core subgraph\n */\nexport function getKCoreSubgraph(graph: Graph, k: number): Map<string, Set<string>> {\n const kCoreNodes = getKCore(graph, k);\n const adjacencySet = graphToAdjacencySet(graph);\n const subgraph = new Map<string, Set<string>>();\n\n for (const node of kCoreNodes) {\n const neighbors = adjacencySet.get(node);\n if (neighbors) {\n const coreNeighbors = new Set<string>();\n for (const neighbor of neighbors) {\n if (kCoreNodes.has(neighbor)) {\n coreNeighbors.add(neighbor);\n }\n }\n subgraph.set(node, coreNeighbors);\n }\n }\n\n return subgraph;\n}\n\n/**\n * Degeneracy ordering of the graph\n * Orders nodes by their coreness values\n * @param graph - Undirected graph\n * @returns Array of nodes ordered by degeneracy\n */\nexport function degeneracyOrdering(graph: Graph): string[] {\n const adjacencySet = graphToAdjacencySet(graph);\n const degree = new Map<string, number>();\n const remaining = new Map<string, Set<string>>();\n const ordering: string[] = [];\n\n // Initialize\n for (const [node, neighbors] of adjacencySet) {\n degree.set(node, neighbors.size);\n remaining.set(node, new Set(neighbors));\n }\n\n // Build ordering\n while (ordering.length < adjacencySet.size) {\n // Find minimum degree node\n let minDegree = Infinity;\n let minNode: string | undefined;\n\n for (const [node, deg] of degree) {\n if (!ordering.includes(node) && deg < minDegree) {\n minDegree = deg;\n minNode = node;\n }\n }\n\n if (minNode === undefined) {\n break;\n }\n\n ordering.push(minNode);\n\n // Update neighbors\n const neighbors = remaining.get(minNode);\n if (neighbors) {\n for (const neighbor of neighbors) {\n const neighborDegree = degree.get(neighbor);\n if (neighborDegree !== undefined) {\n degree.set(neighbor, neighborDegree - 1);\n }\n\n remaining.get(neighbor)?.delete(minNode);\n }\n }\n }\n\n return ordering;\n}\n\n/**\n * Find k-truss subgraph (triangular k-cores)\n * Each edge must be part of at least k-2 triangles\n * @param graph - Undirected graph\n * @param k - Truss number (k >= 2)\n * @returns Edges in k-truss\n */\nexport function kTruss(graph: Graph, k: number): Set<string> {\n if (k < 2) {\n throw new Error(\"k must be at least 2 for k-truss\");\n }\n\n const adjacencySet = graphToAdjacencySet(graph);\n\n // Count triangles for each edge\n const edgeTriangles = new Map<string, number>();\n const edges = new Set<string>();\n\n // Initialize edges\n for (const [u, neighbors] of adjacencySet) {\n for (const v of neighbors) {\n if (u < v) {\n // Avoid duplicates\n const edge = `${u},${v}`;\n edges.add(edge);\n edgeTriangles.set(edge, 0);\n }\n }\n }\n\n // Count triangles\n for (const [u, uNeighbors] of adjacencySet) {\n for (const v of uNeighbors) {\n if (u < v) {\n const vNeighbors = adjacencySet.get(v);\n if (vNeighbors) {\n // Find common neighbors (triangles)\n for (const w of uNeighbors) {\n if (v < w && vNeighbors.has(w)) {\n // Triangle found: u-v-w\n const edge1 = `${u},${v}`;\n const edge2 = `${u},${w}`;\n const edge3 = `${v},${w}`;\n\n const edge1Count = edgeTriangles.get(edge1);\n const edge2Count = edgeTriangles.get(edge2);\n const edge3Count = edgeTriangles.get(edge3);\n if (edge1Count !== undefined) {\n edgeTriangles.set(edge1, edge1Count + 1);\n }\n\n if (edge2Count !== undefined) {\n edgeTriangles.set(edge2, edge2Count + 1);\n }\n\n if (edge3Count !== undefined) {\n edgeTriangles.set(edge3, edge3Count + 1);\n }\n }\n }\n }\n }\n }\n }\n\n // Remove edges with insufficient triangles\n const kTrussEdges = new Set<string>(edges);\n let changed = true;\n\n while (changed) {\n changed = false;\n const toRemove = new Set<string>();\n\n for (const edge of kTrussEdges) {\n const triangleCount = edgeTriangles.get(edge);\n if (triangleCount !== undefined && triangleCount < k - 2) {\n toRemove.add(edge);\n changed = true;\n }\n }\n\n // Remove edges and update triangle counts\n for (const edge of toRemove) {\n kTrussEdges.delete(edge);\n const parts = edge.split(\",\");\n if (parts.length < 2) {\n continue;\n }\n\n const [u, v] = parts;\n if (!u || !v) {\n continue;\n }\n\n // Update triangle counts for affected edges\n const uNeighbors = adjacencySet.get(u);\n const vNeighbors = adjacencySet.get(v);\n\n if (uNeighbors && vNeighbors) {\n for (const w of uNeighbors) {\n if (vNeighbors.has(w)) {\n const edge1 = u < w ? `${u},${w}` : `${w},${u}`;\n const edge2 = v < w ? `${v},${w}` : `${w},${v}`;\n\n if (kTrussEdges.has(edge1)) {\n const edge1Count = edgeTriangles.get(edge1);\n if (edge1Count !== undefined) {\n edgeTriangles.set(edge1, edge1Count - 1);\n }\n }\n\n if (kTrussEdges.has(edge2)) {\n const edge2Count = edgeTriangles.get(edge2);\n if (edge2Count !== undefined) {\n edgeTriangles.set(edge2, edge2Count - 1);\n }\n }\n }\n }\n }\n }\n }\n\n return kTrussEdges;\n}\n\n/**\n * Convert directed graph to undirected for k-core analysis\n * @param directedGraph - Directed graph represented as adjacency map with edge weights\n * @returns Undirected graph represented as adjacency map with neighbor sets\n */\nexport function toUndirected<T>(directedGraph: Map<T, Map<T, number>>): Map<T, Set<T>> {\n const undirected = new Map<T, Set<T>>();\n\n // Initialize all nodes\n for (const node of directedGraph.keys()) {\n undirected.set(node, new Set());\n }\n\n // Add edges in both directions\n for (const [u, neighbors] of directedGraph) {\n for (const v of neighbors.keys()) {\n const uNeighbors = undirected.get(u);\n if (uNeighbors) {\n uNeighbors.add(v);\n }\n\n if (!undirected.has(v)) {\n undirected.set(v, new Set());\n }\n\n const vNeighbors = undirected.get(v);\n if (vNeighbors) {\n vNeighbors.add(u);\n }\n }\n }\n\n return undirected;\n}\n\n/**\n * K-Core decomposition algorithm\n * Finds all k-cores in the graph and assigns coreness values to nodes\n * @param graph - Undirected graph - accepts Graph class or Map<T, Set<T>>\n * @returns K-core decomposition results\n *\n * Time Complexity: O(V + E)\n * Space Complexity: O(V)\n */\nexport function kCoreDecomposition(graph: Graph): KCoreResult<string> {\n // Convert Graph to adjacency set representation\n const adjacencySet = graphToAdjacencySet(graph);\n return kCoreDecompositionImpl(adjacencySet);\n}\n","import type { Graph } from \"../core/graph.js\";\nimport type { NodeId } from \"../types/index.js\";\n\n/**\n * Markov Clustering (MCL) algorithm implementation\n *\n * MCL simulates flow in graphs and finds clusters based on the notion that\n * random walks stay within clusters and rarely move between clusters.\n * The algorithm alternates between expansion (matrix squaring) and\n * inflation (element-wise powering and normalization).\n *\n * Time complexity: O(V³) per iteration\n * Space complexity: O(V²)\n */\n\nexport interface MCLOptions {\n expansion?: number; // Expansion parameter (default: 2)\n inflation?: number; // Inflation parameter (default: 2)\n maxIterations?: number; // Maximum iterations (default: 100)\n tolerance?: number; // Convergence tolerance (default: 1e-6)\n pruningThreshold?: number; // Pruning threshold (default: 1e-5)\n selfLoops?: boolean; // Add self-loops (default: true)\n}\n\nexport interface MCLResult {\n communities: NodeId[][];\n attractors: Set<NodeId>; // Attractor nodes (cluster representatives)\n iterations: number;\n converged: boolean;\n}\n\n/**\n * Perform Markov Clustering on a graph\n * @param graph - The input graph to cluster\n * @param options - MCL algorithm options (expansion, inflation, iterations, etc.)\n * @returns MCL clustering result with communities, attractors, and convergence info\n */\nexport function markovClustering(graph: Graph, options: MCLOptions = {}): MCLResult {\n const {\n expansion = 2,\n inflation = 2,\n maxIterations = 100,\n tolerance = 1e-6,\n pruningThreshold = 1e-5,\n selfLoops = true,\n } = options;\n\n const nodes = Array.from(graph.nodes());\n const nodeIds = nodes.map((node) => node.id);\n const n = nodeIds.length;\n\n if (n === 0) {\n return {\n communities: [],\n attractors: new Set(),\n iterations: 0,\n converged: true,\n };\n }\n\n // Build initial transition matrix\n let matrix = buildTransitionMatrix(graph, nodeIds, selfLoops);\n\n let converged = false;\n let iteration = 0;\n\n for (iteration = 0; iteration < maxIterations; iteration++) {\n const oldMatrix = matrix.map((row) => [...row]);\n\n // Expansion step (matrix multiplication)\n matrix = matrixPower(matrix, expansion);\n\n // Inflation step (element-wise powering and column normalization)\n matrix = inflate(matrix, inflation);\n\n // Pruning step (remove small values)\n matrix = prune(matrix, pruningThreshold);\n\n // Check for convergence\n if (hasConverged(oldMatrix, matrix, tolerance)) {\n converged = true;\n break;\n }\n }\n\n // Extract clusters from final matrix\n const { communities, attractors } = extractClusters(matrix, nodeIds);\n\n return {\n communities,\n attractors,\n iterations: iteration + 1,\n converged,\n };\n}\n\n/**\n * Build initial transition matrix from graph\n * @param graph - The input graph\n * @param nodeIds - Array of node IDs in the graph\n * @param selfLoops - Whether to add self-loops to the matrix\n * @returns Column-normalized transition matrix\n */\nfunction buildTransitionMatrix(graph: Graph, nodeIds: NodeId[], selfLoops: boolean): number[][] {\n const n = nodeIds.length;\n const matrix = Array.from({ length: n }, (): number[] => Array(n).fill(0) as number[]);\n const nodeToIndex = new Map<NodeId, number>();\n\n nodeIds.forEach((id, index) => nodeToIndex.set(id, index));\n\n // Fill adjacency values\n for (let i = 0; i < n; i++) {\n const nodeId = nodeIds[i];\n if (nodeId === undefined) {\n continue;\n }\n\n const neighbors = graph.neighbors(nodeId);\n\n for (const neighbor of neighbors) {\n const j = nodeToIndex.get(neighbor);\n if (j !== undefined) {\n const edge = graph.getEdge(nodeId, neighbor);\n const weight = edge?.weight ?? 1;\n const row = matrix[i];\n if (!row) {\n continue;\n }\n\n row[j] = weight;\n }\n }\n\n // Add self-loops\n if (selfLoops) {\n const row = matrix[i];\n if (!row) {\n continue;\n }\n\n row[i] = 1;\n }\n }\n\n // Column-normalize the matrix\n for (let j = 0; j < n; j++) {\n let colSum = 0;\n for (let i = 0; i < n; i++) {\n const val = matrix[i]?.[j];\n if (val !== undefined) {\n colSum += val;\n }\n }\n\n if (colSum > 0) {\n for (let i = 0; i < n; i++) {\n const row = matrix[i];\n if (!row) {\n continue;\n }\n\n const val = row[j];\n if (val !== undefined) {\n row[j] = val / colSum;\n }\n }\n }\n }\n\n return matrix;\n}\n\n/**\n * Raise matrix to a power (for expansion step)\n * @param matrix - Input square matrix\n * @param power - Power to raise the matrix to\n * @returns Matrix raised to the specified power\n */\nfunction matrixPower(matrix: number[][], power: number): number[][] {\n if (power === 1) {\n return matrix;\n }\n\n if (power === 2) {\n return matrixMultiply(matrix, matrix);\n }\n\n let result = matrix;\n for (let i = 1; i < power; i++) {\n result = matrixMultiply(result, matrix);\n }\n return result;\n}\n\n/**\n * Multiply two matrices\n * @param a - First matrix\n * @param b - Second matrix\n * @returns Product matrix a * b\n */\nfunction matrixMultiply(a: number[][], b: number[][]): number[][] {\n const n = a.length;\n const m = b[0]?.length ?? 0;\n const p = b.length;\n\n const result: number[][] = Array.from({ length: n }, () => Array(m).fill(0) as number[]);\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < m; j++) {\n for (let k = 0; k < p; k++) {\n const aVal = a[i]?.[k] ?? 0;\n const bVal = b[k]?.[j] ?? 0;\n const resultRow = result[i];\n if (!resultRow) {\n continue;\n }\n\n const prevVal = resultRow[j];\n if (prevVal !== undefined) {\n resultRow[j] = prevVal + aVal * bVal;\n }\n }\n }\n }\n\n return result;\n}\n\n/**\n * Inflation step: element-wise powering and column normalization\n * @param matrix - Input matrix to inflate\n * @param inflation - Inflation parameter for element-wise powering\n * @returns Inflated and column-normalized matrix\n */\nfunction inflate(matrix: number[][], inflation: number): number[][] {\n const n = matrix.length;\n const result: number[][] = Array.from({ length: n }, () => Array(n).fill(0) as number[]);\n\n // Element-wise powering\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n const val = matrix[i]?.[j];\n if (val !== undefined) {\n const resultRow = result[i];\n if (resultRow) {\n resultRow[j] = Math.pow(val, inflation);\n }\n }\n }\n }\n\n // Column normalization\n for (let j = 0; j < n; j++) {\n let colSum = 0;\n for (let i = 0; i < n; i++) {\n const val = result[i]?.[j];\n if (val !== undefined) {\n colSum += val;\n }\n }\n\n if (colSum > 0) {\n for (let i = 0; i < n; i++) {\n const row = result[i];\n if (!row) {\n continue;\n }\n\n const val = row[j];\n if (val !== undefined) {\n row[j] = val / colSum;\n }\n }\n }\n }\n\n return result;\n}\n\n/**\n * Pruning step: remove small values\n * @param matrix - Input matrix to prune\n * @param threshold - Values below this threshold are set to zero\n * @returns Pruned and re-normalized matrix\n */\nfunction prune(matrix: number[][], threshold: number): number[][] {\n const n = matrix.length;\n const result: number[][] = Array.from({ length: n }, () => Array(n).fill(0) as number[]);\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n const matrixRow = matrix[i];\n if (!matrixRow) {\n continue;\n }\n\n const matrixVal = matrixRow[j];\n if (matrixVal !== undefined && matrixVal >= threshold) {\n const resultRow = result[i];\n if (resultRow) {\n resultRow[j] = matrixVal;\n }\n }\n }\n }\n\n // Re-normalize columns after pruning\n for (let j = 0; j < n; j++) {\n let colSum = 0;\n for (let i = 0; i < n; i++) {\n const resultRow = result[i];\n if (!resultRow) {\n continue;\n }\n\n const val = resultRow[j];\n if (val !== undefined) {\n colSum += val;\n }\n }\n\n if (colSum > 0) {\n for (let i = 0; i < n; i++) {\n const resultRow = result[i];\n if (!resultRow) {\n continue;\n }\n\n const val = resultRow[j];\n if (val !== undefined) {\n resultRow[j] = val / colSum;\n }\n }\n }\n }\n\n return result;\n}\n\n/**\n * Check if the algorithm has converged\n * @param oldMatrix - Matrix from previous iteration\n * @param newMatrix - Matrix from current iteration\n * @param tolerance - Convergence tolerance threshold\n * @returns True if the maximum difference between matrices is below tolerance\n */\nfunction hasConverged(oldMatrix: number[][], newMatrix: number[][], tolerance: number): boolean {\n const n = oldMatrix.length;\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n const oldRow = oldMatrix[i];\n const newRow = newMatrix[i];\n if (!oldRow || !newRow) {\n continue;\n }\n\n const oldVal = oldRow[j];\n const newVal = newRow[j];\n if (oldVal !== undefined && newVal !== undefined && Math.abs(oldVal - newVal) > tolerance) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Extract clusters from the final matrix\n * @param matrix - Final converged MCL matrix\n * @param nodeIds - Array of node IDs corresponding to matrix indices\n * @returns Object containing communities and attractor nodes\n */\nfunction extractClusters(\n matrix: number[][],\n nodeIds: NodeId[],\n): {\n communities: NodeId[][];\n attractors: Set<NodeId>;\n} {\n const n = matrix.length;\n const attractors = new Set<NodeId>();\n const communities: NodeId[][] = [];\n const nodeToCluster = new Map<number, number>();\n\n // Find attractors (columns with non-zero diagonal elements)\n for (let i = 0; i < n; i++) {\n const matrixRow = matrix[i];\n if (!matrixRow) {\n continue;\n }\n\n const diagonalVal = matrixRow[i];\n const nodeId = nodeIds[i];\n if (diagonalVal !== undefined && diagonalVal > 0 && nodeId !== undefined) {\n attractors.add(nodeId);\n }\n }\n\n // Assign nodes (columns) to clusters based on which attractor (row) they flow to\n // After MCL convergence, matrix[i][j] > 0 means node j belongs to attractor i's cluster\n const attractorToCommunity = new Map<number, number[]>();\n\n for (let j = 0; j < n; j++) {\n // Find the attractor for this column (node j)\n // Look for the row with the highest non-zero value in column j\n let maxVal = 0;\n let attractorRow = -1;\n\n for (let i = 0; i < n; i++) {\n const matrixRow = matrix[i];\n if (!matrixRow) {\n continue;\n }\n\n const val = matrixRow[j];\n if (val !== undefined && val > maxVal) {\n maxVal = val;\n attractorRow = i;\n }\n }\n\n if (attractorRow >= 0) {\n // Node j belongs to the cluster of attractor at row attractorRow\n let community = attractorToCommunity.get(attractorRow);\n if (!community) {\n community = [];\n attractorToCommunity.set(attractorRow, community);\n }\n community.push(j);\n nodeToCluster.set(j, attractorRow);\n }\n }\n\n // Convert attractor communities to node ID arrays\n for (const [, memberIndices] of attractorToCommunity) {\n communities.push(\n memberIndices\n .map((idx) => {\n const nodeId = nodeIds[idx];\n return nodeId;\n })\n .filter((node): node is NodeId => node !== undefined),\n );\n }\n\n // Handle isolated nodes (nodes with all-zero columns)\n for (let j = 0; j < n; j++) {\n if (!nodeToCluster.has(j)) {\n const nodeId = nodeIds[j];\n if (nodeId !== undefined) {\n communities.push([nodeId]);\n }\n }\n }\n\n return { communities, attractors };\n}\n\n/**\n * Calculate modularity of MCL clustering result\n * @param graph - The original graph that was clustered\n * @param communities - Array of communities (each community is an array of node IDs)\n * @returns Modularity score between -0.5 and 1.0\n */\nexport function calculateMCLModularity(graph: Graph, communities: NodeId[][]): number {\n const m = graph.totalEdgeCount;\n if (m === 0) {\n return 0;\n }\n\n let modularity = 0;\n const communityMap = new Map<NodeId, number>();\n\n // Build community map\n communities.forEach((community, index) => {\n community.forEach((nodeId) => {\n communityMap.set(nodeId, index);\n });\n });\n\n // Calculate modularity\n for (const edge of graph.edges()) {\n const sourceCommunity = communityMap.get(edge.source);\n const targetCommunity = communityMap.get(edge.target);\n\n if (sourceCommunity !== undefined && targetCommunity !== undefined && sourceCommunity === targetCommunity) {\n modularity += 1;\n }\n\n const sourceDegree = graph.degree(edge.source);\n const targetDegree = graph.degree(edge.target);\n modularity -= (sourceDegree * targetDegree) / (2 * m);\n }\n\n return modularity / (2 * m);\n}\n","import type { Graph } from \"../core/graph.js\";\nimport type { NodeId } from \"../types/index.js\";\nimport { euclideanDistance, SeededRandom } from \"../utils/math-utilities.js\";\n\n/**\n * Spectral Clustering implementation\n *\n * Uses eigenvalues and eigenvectors of the graph Laplacian matrix to perform clustering.\n * Particularly effective for finding non-convex clusters and communities in graphs.\n *\n * Time complexity: O(V³) for eigendecomposition\n * Space complexity: O(V²)\n */\n\nexport interface SpectralClusteringOptions {\n k: number; // Number of clusters to find\n laplacianType?: \"unnormalized\" | \"normalized\" | \"randomWalk\"; // Type of Laplacian\n maxIterations?: number; // Max iterations for k-means (default: 100)\n tolerance?: number; // Convergence tolerance (default: 1e-4)\n seed?: number; // Random seed for reproducible results\n}\n\nexport interface SpectralClusteringResult {\n communities: NodeId[][];\n clusterAssignments: Map<NodeId, number>;\n eigenvalues?: number[];\n eigenvectors?: number[][];\n}\n\n/**\n * Perform spectral clustering on a graph\n *\n * Note: This implementation uses simplified power iteration for eigenvector\n * computation with approximate eigenvalues. For production use cases requiring\n * precise clustering, consider using a proper linear algebra library like ml-matrix.\n *\n * The approximate eigenvalues (0.1, 0.2 for second and third eigenvectors) work\n * well for most graph structures but may produce suboptimal results for graphs\n * with unusual spectral properties.\n * @param graph - The input graph to cluster\n * @param options - Spectral clustering options (k, laplacianType, etc.)\n * @returns Spectral clustering result with communities and cluster assignments\n */\nexport function spectralClustering(graph: Graph, options: SpectralClusteringOptions): SpectralClusteringResult {\n const { k, laplacianType = \"normalized\", maxIterations = 100, tolerance = 1e-4, seed } = options;\n\n // Create random function - use seeded PRNG if seed provided, otherwise Math.random\n const random = seed !== undefined ? SeededRandom.createGenerator(seed) : Math.random;\n\n // Input validation\n if (k < 1 || !Number.isInteger(k)) {\n throw new Error(\"k must be a positive integer\");\n }\n\n const nodes = Array.from(graph.nodes());\n const nodeIds = nodes.map((node) => node.id);\n const n = nodeIds.length;\n\n if (k >= n) {\n // Return each node as its own cluster\n const communities: NodeId[][] = nodeIds.map((id) => [id]);\n const clusterAssignments = new Map<NodeId, number>();\n nodeIds.forEach((id, index) => clusterAssignments.set(id, index));\n return { communities, clusterAssignments };\n }\n\n // Build adjacency matrix\n const adjacencyMatrix = buildAdjacencyMatrix(graph, nodeIds);\n\n // Build Laplacian matrix\n const laplacianMatrix = buildLaplacianMatrix(adjacencyMatrix, laplacianType);\n\n // Find k smallest eigenvectors\n const eigenResult = findSmallestEigenvectors(laplacianMatrix, k, random);\n\n // Perform k-means clustering on the eigenvectors\n // For spectral clustering, we need to transpose the eigenvector matrix\n // Each row should be a data point (node) with features from the eigenvectors\n const dataPoints: number[][] = [];\n for (let i = 0; i < nodeIds.length; i++) {\n const point: number[] = [];\n for (let j = 0; j < k; j++) {\n const eigenvector = eigenResult.eigenvectors[j];\n if (eigenvector) {\n point.push(eigenvector[i] ?? 0);\n }\n }\n dataPoints.push(point);\n }\n\n // Normalize the data points row-wise (for normalized spectral clustering)\n if (laplacianType === \"normalized\") {\n normalizeRows(dataPoints);\n }\n\n const kmeans = kMeansClustering(dataPoints, k, maxIterations, tolerance, random);\n\n // Build communities\n const communities: NodeId[][] = Array.from({ length: k }, () => []);\n const clusterAssignments = new Map<NodeId, number>();\n\n for (let i = 0; i < nodeIds.length; i++) {\n const clusterId = kmeans.assignments[i] ?? 0;\n const nodeId = nodeIds[i];\n if (!nodeId) {\n continue;\n }\n\n // Ensure clusterId is valid\n if (clusterId >= 0 && clusterId < k) {\n const community = communities[clusterId];\n if (community) {\n community.push(nodeId);\n }\n\n clusterAssignments.set(nodeId, clusterId);\n } else {\n // Assign to first cluster if invalid\n const firstCommunity = communities[0];\n if (firstCommunity) {\n firstCommunity.push(nodeId);\n }\n\n clusterAssignments.set(nodeId, 0);\n }\n }\n\n // Filter out empty communities\n const nonEmptyCommunities = communities.filter((community) => community.length > 0);\n\n return {\n communities: nonEmptyCommunities,\n clusterAssignments,\n eigenvalues: eigenResult.eigenvalues,\n eigenvectors: eigenResult.eigenvectors,\n };\n}\n\n/**\n * Build adjacency matrix from graph\n * @param graph - The input graph\n * @param nodeIds - Array of node IDs defining matrix index order\n * @returns Square adjacency matrix with edge weights\n */\nfunction buildAdjacencyMatrix(graph: Graph, nodeIds: NodeId[]): number[][] {\n const n = nodeIds.length;\n const matrix: number[][] = Array.from({ length: n }, () => Array(n).fill(0) as number[]);\n const nodeToIndex = new Map<NodeId, number>();\n\n nodeIds.forEach((id, index) => nodeToIndex.set(id, index));\n\n for (let i = 0; i < n; i++) {\n const nodeId = nodeIds[i];\n if (!nodeId) {\n continue;\n }\n\n const neighbors = graph.neighbors(nodeId);\n\n for (const neighbor of neighbors) {\n const j = nodeToIndex.get(neighbor);\n if (j !== undefined) {\n const edge = graph.getEdge(nodeId, neighbor);\n const weight = edge?.weight ?? 1;\n const matrixRow = matrix[i];\n if (matrixRow) {\n matrixRow[j] = weight;\n }\n\n if (!graph.isDirected) {\n const matrixRowJ = matrix[j];\n if (matrixRowJ) {\n matrixRowJ[i] = weight;\n }\n }\n }\n }\n }\n\n return matrix;\n}\n\n/**\n * Build Laplacian matrix from adjacency matrix\n * @param adjacency - Square adjacency matrix\n * @param type - Type of Laplacian (unnormalized, normalized, or randomWalk)\n * @returns The computed Laplacian matrix\n */\nfunction buildLaplacianMatrix(adjacency: number[][], type: string): number[][] {\n const n = adjacency.length;\n const laplacian: number[][] = Array.from({ length: n }, () => Array(n).fill(0) as number[]);\n\n // Calculate degree matrix\n const degrees = Array(n).fill(0) as number[];\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n const adjacencyRow = adjacency[i];\n const adjacencyVal = adjacencyRow ? adjacencyRow[j] : 0;\n if (adjacencyVal !== undefined) {\n const degreeVal = degrees[i];\n if (degreeVal !== undefined) {\n degrees[i] = degreeVal + adjacencyVal;\n }\n }\n }\n }\n\n if (type === \"unnormalized\") {\n // L = D - A\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (i === j) {\n const laplacianRow = laplacian[i];\n const degreeVal = degrees[i];\n if (laplacianRow && degreeVal !== undefined) {\n laplacianRow[j] = degreeVal;\n }\n } else {\n const adjacencyRow = adjacency[i];\n const laplacianRow = laplacian[i];\n if (adjacencyRow && laplacianRow) {\n const adjacencyVal = adjacencyRow[j];\n laplacianRow[j] = adjacencyVal !== undefined ? -adjacencyVal : 0;\n }\n }\n }\n }\n } else if (type === \"normalized\") {\n // L_sym = D^(-1/2) * L * D^(-1/2)\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (i === j) {\n const di = degrees[i];\n const laplacianRow = laplacian[i];\n if (laplacianRow) {\n laplacianRow[j] = di !== undefined && di > 0 ? 1 : 0;\n }\n } else {\n const adjacencyRow = adjacency[i];\n if (!adjacencyRow) {\n continue;\n }\n\n const adjacencyVal = adjacencyRow[j];\n const di = degrees[i];\n const dj = degrees[j];\n if (\n adjacencyVal !== undefined &&\n adjacencyVal > 0 &&\n di !== undefined &&\n dj !== undefined &&\n di > 0 &&\n dj > 0\n ) {\n const laplacianRow = laplacian[i];\n if (laplacianRow) {\n laplacianRow[j] = -adjacencyVal / Math.sqrt(di * dj);\n }\n }\n }\n }\n }\n } else if (type === \"randomWalk\") {\n // L_rw = D^(-1) * L\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (i === j) {\n const di = degrees[i];\n const laplacianRow = laplacian[i];\n if (laplacianRow) {\n laplacianRow[j] = di !== undefined && di > 0 ? 1 : 0;\n }\n } else {\n const adjacencyRow = adjacency[i];\n if (!adjacencyRow) {\n continue;\n }\n\n const adjacencyVal = adjacencyRow[j];\n const di = degrees[i];\n if (adjacencyVal !== undefined && adjacencyVal > 0 && di !== undefined && di > 0) {\n const laplacianRow = laplacian[i];\n if (laplacianRow) {\n laplacianRow[j] = -adjacencyVal / di;\n }\n }\n }\n }\n }\n }\n\n return laplacian;\n}\n\n/**\n * Find k smallest eigenvectors using simplified eigendecomposition\n * This is a simplified implementation - in practice, you'd use LAPACK or similar\n * @param matrix - The Laplacian matrix for eigendecomposition\n * @param k - Number of smallest eigenvectors to find\n * @param random - Random number generator function\n * @returns Object containing eigenvalues and corresponding eigenvectors\n */\nfunction findSmallestEigenvectors(\n matrix: number[][],\n k: number,\n random: () => number,\n): {\n eigenvalues: number[];\n eigenvectors: number[][];\n} {\n const n = matrix.length;\n\n if (n === 0 || k === 0) {\n return { eigenvalues: [], eigenvectors: [] };\n }\n\n // For very small matrices, use the full power iteration approach\n // Remove the simplified approach that was causing issues\n if (k >= n) {\n // If k >= n, we still need proper eigenvectors, not identity\n // Fall through to the power iteration below\n }\n\n // For spectral clustering, we need proper eigenvectors\n // Special handling for small k values which are common in clustering\n if (k <= 3 && n > k) {\n return computeSmallestEigenvectorsSimple(matrix, k, n, random);\n }\n\n // For larger k, use power iteration\n const eigenvectors: number[][] = [];\n const eigenvalues: number[] = [];\n const maxIterations = 100;\n\n for (let eigIdx = 0; eigIdx < k; eigIdx++) {\n // Initialize random vector\n let vector = Array(n)\n .fill(0)\n .map(() => random() - 0.5);\n\n // Normalize initial vector\n const initNorm = Math.sqrt(vector.reduce((sum, val) => sum + val * val, 0));\n if (initNorm > 0) {\n vector = vector.map((val) => val / initNorm);\n }\n\n // Orthogonalize against previous eigenvectors\n for (let j = 0; j < eigIdx; j++) {\n const ejVector = eigenvectors[j];\n if (!ejVector) {\n continue;\n }\n\n const dot = vector.reduce((sum, val, idx) => sum + val * (ejVector[idx] ?? 0), 0);\n vector = vector.map((val, idx) => val - dot * (ejVector[idx] ?? 0));\n }\n\n // Power iteration\n for (let iter = 0; iter < maxIterations; iter++) {\n // Multiply by matrix\n const newVector = Array(n).fill(0) as number[];\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n const matrixRow = matrix[i];\n const vecVal = vector[j];\n const matrixVal = matrixRow?.[j];\n if (matrixVal !== undefined && vecVal !== undefined) {\n const nvVal = newVector[i];\n if (nvVal !== undefined) {\n newVector[i] = nvVal + matrixVal * vecVal;\n }\n }\n }\n }\n\n // Orthogonalize against previous eigenvectors\n for (let j = 0; j < eigIdx; j++) {\n const ejVector = eigenvectors[j];\n if (!ejVector) {\n continue;\n }\n\n const dot = newVector.reduce((sum, val, idx) => sum + val * (ejVector[idx] ?? 0), 0);\n for (let i = 0; i < n; i++) {\n const ejVal = ejVector[i];\n if (ejVal !== undefined) {\n const nvVal = newVector[i];\n if (nvVal !== undefined) {\n newVector[i] = nvVal - dot * ejVal;\n }\n }\n }\n }\n\n // Normalize\n const norm = Math.sqrt(newVector.reduce((sum, val) => sum + val * val, 0));\n if (norm > 1e-10) {\n vector = newVector.map((val) => val / norm);\n } else {\n break;\n }\n }\n\n // Calculate eigenvalue (Rayleigh quotient)\n let eigenvalue = 0;\n const Av = Array(n).fill(0) as number[];\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n const matrixRow = matrix[i];\n const vecVal = vector[j];\n const matrixVal = matrixRow?.[j];\n if (matrixVal !== undefined && vecVal !== undefined) {\n const avVal = Av[i];\n if (avVal !== undefined) {\n Av[i] = avVal + matrixVal * vecVal;\n }\n }\n }\n }\n eigenvalue = vector.reduce((sum, val, idx) => {\n const avVal = Av[idx];\n return sum + val * (avVal ?? 0);\n }, 0);\n\n eigenvectors.push(vector);\n eigenvalues.push(eigenvalue);\n }\n\n return { eigenvalues, eigenvectors };\n}\n\n/**\n * Normalize matrix rows to unit length\n * @param matrix - Matrix to normalize in place\n */\nfunction normalizeRows(matrix: number[][]): void {\n for (const row of matrix) {\n const norm = Math.sqrt(row.reduce((sum, val) => sum + val * val, 0));\n if (norm > 0) {\n for (let j = 0; j < row.length; j++) {\n const val = row[j];\n if (val !== undefined) {\n row[j] = val / norm;\n }\n }\n }\n }\n}\n\n/**\n * K-means clustering algorithm\n * @param data - Array of data points, each point is an array of coordinates\n * @param k - Number of clusters to form\n * @param maxIterations - Maximum number of iterations\n * @param tolerance - Convergence tolerance for centroid movement\n * @param random - Random number generator function\n * @returns Object containing cluster assignments and final centroids\n */\nfunction kMeansClustering(\n data: number[][],\n k: number,\n maxIterations: number,\n tolerance = 1e-4,\n random: () => number = Math.random,\n): { assignments: number[]; centroids: number[][] } {\n const n = data.length;\n const d = data[0]?.length ?? 0;\n\n // Handle edge cases\n if (n === 0 || k === 0) {\n return { assignments: [], centroids: [] };\n }\n\n if (k >= n) {\n // Each point is its own cluster\n return {\n assignments: Array.from({ length: n }, (_, i) => i),\n centroids: data.slice(0, n),\n };\n }\n\n // Initialize centroids by selecting random data points\n const centroids: number[][] = [];\n const selectedIndices = new Set<number>();\n\n while (centroids.length < k && selectedIndices.size < n) {\n const idx = Math.floor(random() * n);\n if (!selectedIndices.has(idx) && data[idx]) {\n selectedIndices.add(idx);\n centroids.push([...data[idx]]);\n }\n }\n\n // Fill remaining centroids with random values if needed\n while (centroids.length < k) {\n const centroid = Array(d).fill(0) as number[];\n for (let j = 0; j < d; j++) {\n centroid[j] = random() - 0.5;\n }\n centroids.push(centroid);\n }\n\n const assignments = Array(n).fill(0) as number[];\n let oldAssignments = Array(n).fill(-1) as number[];\n\n for (let iteration = 0; iteration < maxIterations; iteration++) {\n // Assign points to closest centroids\n for (let i = 0; i < n; i++) {\n let minDistance = Number.POSITIVE_INFINITY;\n let bestCluster = 0;\n\n for (let j = 0; j < k; j++) {\n const dataPoint = data[i];\n const centroid = centroids[j];\n if (!dataPoint || !centroid) {\n continue;\n }\n\n const distance = euclideanDistance(dataPoint, centroid);\n if (distance < minDistance) {\n minDistance = distance;\n bestCluster = j;\n }\n }\n\n assignments[i] = bestCluster;\n }\n\n // Check for convergence based on assignment changes\n let assignmentsChanged = false;\n for (let i = 0; i < n; i++) {\n if (assignments[i] !== oldAssignments[i]) {\n assignmentsChanged = true;\n break;\n }\n }\n\n if (!assignmentsChanged) {\n break;\n }\n\n oldAssignments = [...assignments];\n\n // Store old centroids for tolerance-based convergence check\n const oldCentroids = centroids.map((c) => [...c]);\n\n // Update centroids\n const counts = Array(k).fill(0) as number[];\n const sums: number[][] = Array.from({ length: k }, () => Array(d).fill(0) as number[]);\n\n for (let i = 0; i < n; i++) {\n const cluster = assignments[i] ?? 0;\n const dataPoint = data[i];\n if (!dataPoint) {\n continue;\n }\n\n const sumsCluster = sums[cluster];\n if (sumsCluster !== undefined) {\n const countVal = counts[cluster];\n if (countVal !== undefined) {\n counts[cluster] = countVal + 1;\n }\n\n for (let j = 0; j < d; j++) {\n const dpVal = dataPoint[j];\n if (dpVal !== undefined) {\n const sumVal = sumsCluster[j];\n if (sumVal !== undefined) {\n sumsCluster[j] = sumVal + dpVal;\n }\n }\n }\n }\n }\n\n for (let i = 0; i < k; i++) {\n const countVal = counts[i];\n if (countVal !== undefined && countVal > 0) {\n const sumsRow = sums[i];\n const centroidsRow = centroids[i];\n if (sumsRow !== undefined && centroidsRow !== undefined) {\n for (let j = 0; j < d; j++) {\n const sumVal = sumsRow[j];\n if (sumVal !== undefined) {\n const countValInner = counts[i];\n if (countValInner !== undefined) {\n centroidsRow[j] = sumVal / countValInner;\n }\n }\n }\n }\n }\n }\n\n // Check for tolerance-based convergence (centroid movement)\n let maxCentroidShift = 0;\n for (let i = 0; i < k; i++) {\n const oldCentroid = oldCentroids[i];\n const newCentroid = centroids[i];\n if (oldCentroid && newCentroid) {\n const shift = euclideanDistance(oldCentroid, newCentroid);\n if (shift > maxCentroidShift) {\n maxCentroidShift = shift;\n }\n }\n }\n\n if (maxCentroidShift < tolerance) {\n break;\n }\n }\n\n return { assignments, centroids };\n}\n\n/**\n * Compute smallest eigenvectors for small k (optimized for k=2, k=3)\n * @param matrix - The Laplacian matrix\n * @param k - Number of eigenvectors to compute (1-3)\n * @param n - Size of the matrix\n * @param random - Random number generator function\n * @returns Object containing eigenvalues and eigenvectors\n */\nfunction computeSmallestEigenvectorsSimple(\n matrix: number[][],\n k: number,\n n: number,\n random: () => number,\n): {\n eigenvalues: number[];\n eigenvectors: number[][];\n} {\n const eigenvectors: number[][] = [];\n const eigenvalues: number[] = [];\n\n // First eigenvector is constant (corresponds to eigenvalue 0 for connected graph)\n const firstVector = Array(n).fill(1 / Math.sqrt(n)) as number[];\n eigenvectors.push(firstVector);\n eigenvalues.push(0);\n\n // For k >= 2, compute the Fiedler vector (second smallest eigenvector)\n if (k >= 2) {\n // Use power iteration on I - L/lambda_max to find second smallest\n const maxEig = 2; // For normalized Laplacian, max eigenvalue <= 2\n let vector = Array(n)\n .fill(0)\n .map(() => random() - 0.5);\n\n // Make orthogonal to first eigenvector\n const dot1 = vector.reduce((sum, val) => sum + val / Math.sqrt(n), 0);\n vector = vector.map((val) => val - dot1 / Math.sqrt(n));\n\n // Power iteration on shifted matrix\n for (let iter = 0; iter < 100; iter++) {\n // Compute (I - L/maxEig) * v\n const newVector = Array(n).fill(0) as number[];\n\n // Identity part\n for (let i = 0; i < n; i++) {\n newVector[i] = vector[i] ?? 0;\n }\n\n // Subtract L * v / maxEig\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n const matrixVal = matrix[i]?.[j] ?? 0;\n const vecVal = vector[j] ?? 0;\n newVector[i] = (newVector[i] ?? 0) - (matrixVal * vecVal) / maxEig;\n }\n }\n\n // Orthogonalize against first eigenvector\n const dot = newVector.reduce((sum, val) => sum + val / Math.sqrt(n), 0);\n for (let i = 0; i < n; i++) {\n newVector[i] = (newVector[i] ?? 0) - dot / Math.sqrt(n);\n }\n\n // Normalize\n const norm = Math.sqrt(newVector.reduce((sum, val) => sum + val * val, 0));\n if (norm > 1e-10) {\n vector = newVector.map((val) => val / norm);\n }\n }\n\n eigenvectors.push(vector);\n eigenvalues.push(0.1); // Approximate\n }\n\n // For k = 3, add another eigenvector\n if (k >= 3) {\n let vector = Array(n)\n .fill(0)\n .map(() => random() - 0.5);\n\n // Orthogonalize against previous eigenvectors\n for (const prev of eigenvectors) {\n const dot = vector.reduce((sum, val, idx) => sum + val * (prev[idx] ?? 0), 0);\n vector = vector.map((val, idx) => val - dot * (prev[idx] ?? 0));\n }\n\n // Similar power iteration\n for (let iter = 0; iter < 50; iter++) {\n const newVector = Array(n).fill(0) as number[];\n\n // Identity part\n for (let i = 0; i < n; i++) {\n newVector[i] = vector[i] ?? 0;\n }\n\n // Subtract L * v / 2\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n const matrixVal = matrix[i]?.[j] ?? 0;\n const vecVal = vector[j] ?? 0;\n newVector[i] = (newVector[i] ?? 0) - (matrixVal * vecVal) / 2;\n }\n }\n\n // Orthogonalize\n for (const prev of eigenvectors) {\n const dot = newVector.reduce((sum, val, idx) => sum + val * (prev[idx] ?? 0), 0);\n for (let i = 0; i < n; i++) {\n newVector[i] = (newVector[i] ?? 0) - dot * (prev[i] ?? 0);\n }\n }\n\n // Normalize\n const norm = Math.sqrt(newVector.reduce((sum, val) => sum + val * val, 0));\n if (norm > 1e-10) {\n vector = newVector.map((val) => val / norm);\n }\n }\n\n eigenvectors.push(vector);\n eigenvalues.push(0.2); // Approximate\n }\n\n return { eigenvalues: eigenvalues.slice(0, k), eigenvectors: eigenvectors.slice(0, k) };\n}\n","import type { Graph } from \"../../core/graph.js\";\nimport type { NodeId } from \"../../types/index.js\";\nimport { bfsColoringWithPartitions } from \"../traversal/bfs-variants.js\";\n\n/**\n * Maximum Bipartite Matching implementation using Hopcroft-Karp algorithm\n *\n * Finds the maximum matching in a bipartite graph. A matching is a set of edges\n * without common vertices. Maximum matching has the largest possible number of edges.\n *\n * Time complexity: O(√V × E)\n * Space complexity: O(V)\n */\n\nexport interface BipartiteMatchingResult {\n matching: Map<NodeId, NodeId>; // Maps left nodes to right nodes\n size: number; // Number of matched pairs\n}\n\nexport interface BipartiteMatchingOptions {\n leftNodes?: Set<NodeId>; // Optional: specify left partition\n rightNodes?: Set<NodeId>; // Optional: specify right partition\n}\n\n/**\n * Find maximum matching in a bipartite graph using augmenting path algorithm\n * (simplified implementation that's more reliable than Hopcroft-Karp for this context)\n * @param graph - The bipartite graph to find maximum matching for\n * @param options - Optional configuration including left and right node partitions\n * @returns The maximum matching as a map from left nodes to right nodes and the matching size\n * @throws Error if the graph is not bipartite\n */\nexport function maximumBipartiteMatching(\n graph: Graph,\n options: BipartiteMatchingOptions = {},\n): BipartiteMatchingResult {\n // If partitions not provided, try to infer them\n let { leftNodes, rightNodes } = options;\n\n if (!leftNodes || !rightNodes) {\n const partition = bipartitePartition(graph);\n if (!partition) {\n throw new Error(\"Graph is not bipartite\");\n }\n\n leftNodes = partition.left;\n rightNodes = partition.right;\n }\n\n const matching = new Map<NodeId, NodeId>();\n const matchRight = new Map<NodeId, NodeId>(); // Right to left matching\n\n // Find augmenting paths using DFS\n const visited = new Set<NodeId>();\n\n const dfs = (u: NodeId): boolean => {\n const neighbors = Array.from(graph.neighbors(u));\n\n for (const v of neighbors) {\n if (!rightNodes.has(v) || visited.has(v)) {\n continue;\n }\n\n visited.add(v);\n\n // If v is unmatched or we can find augmenting path from match of v\n const matchedNode = matchRight.get(v);\n if (!matchRight.has(v) || (matchedNode !== undefined && dfs(matchedNode))) {\n matching.set(u, v);\n matchRight.set(v, u);\n return true;\n }\n }\n return false;\n };\n\n // Try to find augmenting path for each left node\n let matchingSize = 0;\n for (const u of leftNodes) {\n visited.clear();\n if (dfs(u)) {\n matchingSize++;\n }\n }\n\n return {\n matching,\n size: matchingSize,\n };\n}\n\n/**\n * Check if graph is bipartite and return the partition\n * @param graph - The graph to check for bipartiteness\n * @returns An object with left and right node sets if bipartite, or null if not bipartite\n */\nexport function bipartitePartition(graph: Graph): { left: Set<NodeId>; right: Set<NodeId> } | null {\n const result = bfsColoringWithPartitions(graph);\n\n if (!result.isBipartite || !result.partitions) {\n return null;\n }\n\n return {\n left: result.partitions[0],\n right: result.partitions[1],\n };\n}\n\n/**\n * Simple greedy bipartite matching algorithm\n * Useful for comparison or when Hopcroft-Karp is overkill\n * @param graph - The bipartite graph to find matching for\n * @param options - Optional configuration including left and right node partitions\n * @returns The matching as a map from left nodes to right nodes and the matching size\n * @throws Error if the graph is not bipartite\n */\nexport function greedyBipartiteMatching(graph: Graph, options: BipartiteMatchingOptions = {}): BipartiteMatchingResult {\n let { leftNodes, rightNodes } = options;\n\n if (!leftNodes || !rightNodes) {\n const partition = bipartitePartition(graph);\n if (!partition) {\n throw new Error(\"Graph is not bipartite\");\n }\n\n leftNodes = partition.left;\n rightNodes = partition.right;\n }\n\n const matching = new Map<NodeId, NodeId>();\n const matched = new Set<NodeId>();\n\n for (const u of leftNodes) {\n const neighbors = Array.from(graph.neighbors(u));\n\n for (const v of neighbors) {\n if (rightNodes.has(v) && !matched.has(v)) {\n matching.set(u, v);\n matched.add(v);\n break;\n }\n }\n }\n\n return {\n matching,\n size: matching.size,\n };\n}\n","import type { Graph } from \"../../core/graph.js\";\nimport type { NodeId } from \"../../types/index.js\";\n\n/**\n * Graph Isomorphism (VF2) algorithm implementation\n *\n * Determines if two graphs are isomorphic (structurally identical).\n * Two graphs are isomorphic if there exists a bijection between their vertices\n * that preserves adjacency.\n *\n * Based on the VF2 algorithm by Cordella et al. (2004)\n *\n * Time complexity: O(n! × n) worst case, but typically much faster\n * Space complexity: O(n)\n */\n\nexport interface IsomorphismResult {\n isIsomorphic: boolean;\n mapping?: Map<NodeId, NodeId>; // Maps nodes from graph1 to graph2\n}\n\nexport interface IsomorphismOptions {\n nodeMatch?: (node1: NodeId, node2: NodeId, g1: Graph, g2: Graph) => boolean;\n edgeMatch?: (edge1: [NodeId, NodeId], edge2: [NodeId, NodeId], g1: Graph, g2: Graph) => boolean;\n findAllMappings?: boolean; // Find all possible isomorphisms\n}\n\ninterface VF2State {\n core1: Map<NodeId, NodeId>; // Mapping from G1 to G2\n core2: Map<NodeId, NodeId>; // Mapping from G2 to G1\n in1: Map<NodeId, number>; // Terminal set in G1\n in2: Map<NodeId, number>; // Terminal set in G2\n out1: Map<NodeId, number>; // Terminal set out G1\n out2: Map<NodeId, number>; // Terminal set out G2\n depth: number; // Current depth of search\n}\n\n/**\n * Check if two graphs are isomorphic using VF2 algorithm\n * @param graph1 - The first graph to compare\n * @param graph2 - The second graph to compare\n * @param options - Optional configuration for node and edge matching predicates\n * @returns An object indicating if the graphs are isomorphic and an optional mapping between nodes\n */\nexport function isGraphIsomorphic(graph1: Graph, graph2: Graph, options: IsomorphismOptions = {}): IsomorphismResult {\n // Quick checks\n if (graph1.nodeCount !== graph2.nodeCount || graph1.totalEdgeCount !== graph2.totalEdgeCount) {\n return { isIsomorphic: false };\n }\n\n if (graph1.isDirected !== graph2.isDirected) {\n return { isIsomorphic: false };\n }\n\n const nodes1 = Array.from(graph1.nodes()).map((n) => n.id);\n const nodes2 = Array.from(graph2.nodes()).map((n) => n.id);\n\n // Check degree sequences\n const degrees1 = nodes1.map((n) => graph1.degree(n)).sort((a, b) => a - b);\n const degrees2 = nodes2.map((n) => graph2.degree(n)).sort((a, b) => a - b);\n\n for (let i = 0; i < degrees1.length; i++) {\n if (degrees1[i] !== degrees2[i]) {\n return { isIsomorphic: false };\n }\n }\n\n // Initialize VF2 state\n const state: VF2State = {\n core1: new Map(),\n core2: new Map(),\n in1: new Map(),\n in2: new Map(),\n out1: new Map(),\n out2: new Map(),\n depth: 0,\n };\n\n // Find isomorphism\n const mappings: Map<NodeId, NodeId>[] = [];\n const found = vf2Recurse(graph1, graph2, state, nodes1, nodes2, options, mappings);\n\n if (found && mappings.length > 0) {\n return {\n isIsomorphic: true,\n mapping: mappings[0] ?? new Map<NodeId, NodeId>(),\n };\n }\n\n return { isIsomorphic: false };\n}\n\n/**\n * VF2 recursive search\n * @param g1 - The first graph being compared\n * @param g2 - The second graph being compared\n * @param state - The current VF2 algorithm state containing mappings and terminal sets\n * @param nodes1 - Array of node IDs from the first graph\n * @param nodes2 - Array of node IDs from the second graph\n * @param options - Configuration options for matching predicates\n * @param mappings - Array to collect found isomorphism mappings\n * @returns True if an isomorphism was found and search should stop, false otherwise\n */\nfunction vf2Recurse(\n g1: Graph,\n g2: Graph,\n state: VF2State,\n nodes1: NodeId[],\n nodes2: NodeId[],\n options: IsomorphismOptions,\n mappings: Map<NodeId, NodeId>[],\n): boolean {\n // Check if we've found a complete mapping\n if (state.core1.size === nodes1.length) {\n mappings.push(new Map(state.core1));\n return !options.findAllMappings; // Continue if we want all mappings\n }\n\n // Get candidate pairs\n const candidates = getCandidatePairs(g1, g2, state, nodes1, nodes2);\n\n for (const [node1, node2] of candidates) {\n if (isFeasible(g1, g2, state, node1, node2, options)) {\n // Add pair to mapping\n const newState = addPair(g1, g2, state, node1, node2);\n\n if (vf2Recurse(g1, g2, newState, nodes1, nodes2, options, mappings)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Get candidate pairs for the next mapping\n * @param g1 - The first graph being compared\n * @param g2 - The second graph being compared\n * @param state - The current VF2 algorithm state containing mappings and terminal sets\n * @param nodes1 - Array of node IDs from the first graph\n * @param nodes2 - Array of node IDs from the second graph\n * @returns Array of candidate node pairs to try matching\n */\nfunction getCandidatePairs(\n g1: Graph,\n g2: Graph,\n state: VF2State,\n nodes1: NodeId[],\n nodes2: NodeId[],\n): [NodeId, NodeId][] {\n const pairs: [NodeId, NodeId][] = [];\n\n // Try to pick from terminal sets first\n let node1: NodeId | null = null;\n\n // Pick from out1\n for (const [n] of state.out1) {\n if (!state.core1.has(n)) {\n node1 = n;\n break;\n }\n }\n\n // If not found, pick from in1\n if (!node1) {\n for (const [n] of state.in1) {\n if (!state.core1.has(n)) {\n node1 = n;\n break;\n }\n }\n }\n\n // If still not found, pick any unmapped node\n if (!node1) {\n for (const n of nodes1) {\n if (!state.core1.has(n)) {\n node1 = n;\n break;\n }\n }\n }\n\n if (!node1) {\n return pairs;\n }\n\n // Find compatible nodes in G2\n for (const node2 of nodes2) {\n if (!state.core2.has(node2)) {\n // Basic compatibility check\n if (g1.degree(node1) === g2.degree(node2)) {\n pairs.push([node1, node2]);\n }\n }\n }\n\n return pairs;\n}\n\n/**\n * Check if a pair is feasible\n * @param g1 - The first graph being compared\n * @param g2 - The second graph being compared\n * @param state - The current VF2 algorithm state containing mappings and terminal sets\n * @param node1 - The candidate node from the first graph\n * @param node2 - The candidate node from the second graph\n * @param options - Configuration options for matching predicates\n * @returns True if the node pair can be feasibly matched, false otherwise\n */\nfunction isFeasible(\n g1: Graph,\n g2: Graph,\n state: VF2State,\n node1: NodeId,\n node2: NodeId,\n options: IsomorphismOptions,\n): boolean {\n // Node match predicate\n if (options.nodeMatch && !options.nodeMatch(node1, node2, g1, g2)) {\n return false;\n }\n\n // Check syntactic feasibility\n const neighbors1 = new Set(g1.neighbors(node1));\n const neighbors2 = new Set(g2.neighbors(node2));\n\n // Check that mapped neighbors correspond\n for (const [n1, n2] of state.core1) {\n if (neighbors1.has(n1)) {\n if (!neighbors2.has(n2)) {\n return false;\n }\n\n // Edge match predicate\n if (options.edgeMatch && !options.edgeMatch([node1, n1], [node2, n2], g1, g2)) {\n return false;\n }\n } else if (neighbors2.has(n2)) {\n return false;\n }\n }\n\n // Check terminal set sizes\n let new1In = 0;\n let new1Out = 0;\n let term1In = 0;\n let term1Out = 0;\n let new2In = 0;\n let new2Out = 0;\n let term2In = 0;\n let term2Out = 0;\n\n for (const neighbor of neighbors1) {\n if (state.core1.has(neighbor)) {\n // Already mapped\n } else if (state.in1.has(neighbor)) {\n term1In++;\n } else if (state.out1.has(neighbor)) {\n term1Out++;\n } else {\n if (g1.isDirected) {\n if (g1.hasEdge(neighbor, node1)) {\n new1In++;\n }\n\n if (g1.hasEdge(node1, neighbor)) {\n new1Out++;\n }\n } else {\n new1In++;\n new1Out++;\n }\n }\n }\n\n for (const neighbor of neighbors2) {\n if (state.core2.has(neighbor)) {\n // Already mapped\n } else if (state.in2.has(neighbor)) {\n term2In++;\n } else if (state.out2.has(neighbor)) {\n term2Out++;\n } else {\n if (g2.isDirected) {\n if (g2.hasEdge(neighbor, node2)) {\n new2In++;\n }\n\n if (g2.hasEdge(node2, neighbor)) {\n new2Out++;\n }\n } else {\n new2In++;\n new2Out++;\n }\n }\n }\n\n return term1In === term2In && term1Out === term2Out && new1In === new2In && new1Out === new2Out;\n}\n\n/**\n * Add a pair to the mapping and update terminal sets\n * @param g1 - The first graph being compared\n * @param g2 - The second graph being compared\n * @param state - The current VF2 algorithm state containing mappings and terminal sets\n * @param node1 - The node from the first graph to add to the mapping\n * @param node2 - The node from the second graph to add to the mapping\n * @returns A new VF2 state with the pair added and terminal sets updated\n */\nfunction addPair(g1: Graph, g2: Graph, state: VF2State, node1: NodeId, node2: NodeId): VF2State {\n const newState: VF2State = {\n core1: new Map(state.core1),\n core2: new Map(state.core2),\n in1: new Map(state.in1),\n in2: new Map(state.in2),\n out1: new Map(state.out1),\n out2: new Map(state.out2),\n depth: state.depth + 1,\n };\n\n newState.core1.set(node1, node2);\n newState.core2.set(node2, node1);\n\n // Update terminal sets\n const neighbors1 = g1.neighbors(node1);\n for (const neighbor of neighbors1) {\n if (!newState.core1.has(neighbor) && !newState.in1.has(neighbor) && !newState.out1.has(neighbor)) {\n if (g1.isDirected) {\n if (g1.hasEdge(neighbor, node1)) {\n newState.in1.set(neighbor, newState.depth);\n }\n\n if (g1.hasEdge(node1, neighbor)) {\n newState.out1.set(neighbor, newState.depth);\n }\n } else {\n newState.in1.set(neighbor, newState.depth);\n newState.out1.set(neighbor, newState.depth);\n }\n }\n }\n\n const neighbors2 = g2.neighbors(node2);\n for (const neighbor of neighbors2) {\n if (!newState.core2.has(neighbor) && !newState.in2.has(neighbor) && !newState.out2.has(neighbor)) {\n if (g2.isDirected) {\n if (g2.hasEdge(neighbor, node2)) {\n newState.in2.set(neighbor, newState.depth);\n }\n\n if (g2.hasEdge(node2, neighbor)) {\n newState.out2.set(neighbor, newState.depth);\n }\n } else {\n newState.in2.set(neighbor, newState.depth);\n newState.out2.set(neighbor, newState.depth);\n }\n }\n }\n\n return newState;\n}\n\n/**\n * Find all isomorphisms between two graphs\n * @param graph1 - The first graph to compare\n * @param graph2 - The second graph to compare\n * @param options - Optional configuration for node and edge matching predicates\n * @returns An array of all possible node mappings between the graphs\n */\nexport function findAllIsomorphisms(\n graph1: Graph,\n graph2: Graph,\n options: IsomorphismOptions = {},\n): Map<NodeId, NodeId>[] {\n // Quick checks\n if (graph1.nodeCount !== graph2.nodeCount || graph1.totalEdgeCount !== graph2.totalEdgeCount) {\n return [];\n }\n\n if (graph1.isDirected !== graph2.isDirected) {\n return [];\n }\n\n const nodes1 = Array.from(graph1.nodes()).map((n) => n.id);\n const nodes2 = Array.from(graph2.nodes()).map((n) => n.id);\n\n // Check degree sequences\n const degrees1 = nodes1.map((n) => graph1.degree(n)).sort((a, b) => a - b);\n const degrees2 = nodes2.map((n) => graph2.degree(n)).sort((a, b) => a - b);\n\n for (let i = 0; i < degrees1.length; i++) {\n if (degrees1[i] !== degrees2[i]) {\n return [];\n }\n }\n\n // Handle empty graphs\n if (nodes1.length === 0) {\n return [new Map<NodeId, NodeId>()];\n }\n\n // Initialize VF2 state\n const state: VF2State = {\n core1: new Map(),\n core2: new Map(),\n in1: new Map(),\n in2: new Map(),\n out1: new Map(),\n out2: new Map(),\n depth: 0,\n };\n\n // Find all isomorphisms\n const mappings: Map<NodeId, NodeId>[] = [];\n vf2Recurse(graph1, graph2, state, nodes1, nodes2, { ...options, findAllMappings: true }, mappings);\n\n return mappings;\n}\n","import type { Graph } from \"../core/graph.js\";\nimport type { NodeId } from \"../types/index.js\";\nimport { getCommonNeighbors, getIntermediateNodes } from \"../utils/graph-utilities.js\";\nimport type { LinkPredictionOptions, LinkPredictionScore } from \"./common-neighbors.js\";\n\n/**\n * Adamic-Adar Index link prediction implementation\n *\n * Predicts the likelihood of a link between two nodes based on their common\n * neighbors, weighted by the inverse logarithm of the neighbors' degrees.\n * This gives higher weight to rare common neighbors.\n *\n * Formula: AA(x,y) = Σ (1 / log(|Γ(z)|)) for all z ∈ Γ(x) ∩ Γ(y)\n * where Γ(z) is the set of neighbors of node z\n *\n * Time complexity: O(k²) where k is the average degree\n * Space complexity: O(k)\n */\n\n/**\n * Calculate Adamic-Adar index for a pair of nodes\n * @param graph - The input graph\n * @param source - The source node ID\n * @param target - The target node ID\n * @param options - Link prediction options\n * @returns The Adamic-Adar score for the node pair\n */\nexport function adamicAdarScore(\n graph: Graph,\n source: NodeId,\n target: NodeId,\n options: LinkPredictionOptions = {},\n): number {\n if (!graph.hasNode(source) || !graph.hasNode(target)) {\n return 0;\n }\n\n const { directed = false } = options;\n\n // Use utility function to get common neighbors\n // For directed graphs, we want intermediate nodes that form paths source->X->target\n const commonNeighborsSet = directed\n ? getIntermediateNodes(graph, source, target)\n : getCommonNeighbors(graph, source, target, false);\n\n // Calculate Adamic-Adar score\n let score = 0;\n for (const neighbor of commonNeighborsSet) {\n const degree = directed\n ? graph.outDegree(neighbor) // Use out-degree for directed graphs\n : graph.degree(neighbor); // Use total degree for undirected graphs\n\n if (degree > 1) {\n score += 1 / Math.log(degree);\n } else if (degree === 1) {\n // For degree 1, we can't use log(1) = 0, so use a small constant\n score += 1; // or some other reasonable value\n }\n }\n\n return score;\n}\n\n/**\n * Calculate Adamic-Adar scores for all possible node pairs\n * @param graph - The input graph\n * @param options - Link prediction options\n * @returns Array of link prediction scores sorted by score descending\n */\nexport function adamicAdarPrediction(graph: Graph, options: LinkPredictionOptions = {}): LinkPredictionScore[] {\n const { directed = false, includeExisting = false, topK } = options;\n\n const scores: LinkPredictionScore[] = [];\n const nodes = Array.from(graph.nodes()).map((n) => n.id);\n\n for (let i = 0; i < nodes.length; i++) {\n for (let j = i + 1; j < nodes.length; j++) {\n const source = nodes[i];\n const target = nodes[j];\n\n if (!source || !target) {\n continue;\n }\n\n // Skip existing edges unless requested\n if (!includeExisting && graph.hasEdge(source, target)) {\n continue;\n }\n\n const score = adamicAdarScore(graph, source, target, { directed });\n\n if (score > 0) {\n scores.push({ source, target, score });\n\n // For undirected graphs, also add the reverse pair\n if (!directed && source !== target) {\n scores.push({ source: target, target: source, score });\n }\n }\n }\n }\n\n // Sort by score in descending order\n scores.sort((a, b) => b.score - a.score);\n\n // Return top K if specified\n if (topK && topK > 0) {\n return scores.slice(0, topK);\n }\n\n return scores;\n}\n\n/**\n * Calculate Adamic-Adar scores for specific node pairs\n * @param graph - The input graph\n * @param pairs - Array of node ID pairs to calculate scores for\n * @param options - Link prediction options\n * @returns Array of link prediction scores for the specified pairs\n */\nexport function adamicAdarForPairs(\n graph: Graph,\n pairs: [NodeId, NodeId][],\n options: LinkPredictionOptions = {},\n): LinkPredictionScore[] {\n return pairs.map(([source, target]) => ({\n source,\n target,\n score: adamicAdarScore(graph, source, target, options),\n }));\n}\n\n/**\n * Get top Adamic-Adar candidates for link prediction for a specific node\n * @param graph - The input graph\n * @param node - The node ID to get candidates for\n * @param options - Link prediction options with optional candidate list\n * @returns Array of top link prediction candidates sorted by score descending\n */\nexport function getTopAdamicAdarCandidatesForNode(\n graph: Graph,\n node: NodeId,\n options: LinkPredictionOptions & { candidates?: NodeId[] } = {},\n): LinkPredictionScore[] {\n if (!graph.hasNode(node)) {\n return [];\n }\n\n const { directed = false, includeExisting = false, topK = 10, candidates } = options;\n\n const scores: LinkPredictionScore[] = [];\n const targetNodes = candidates ?? Array.from(graph.nodes()).map((n) => n.id);\n\n for (const target of targetNodes) {\n if (target === node) {\n continue;\n }\n\n // Skip existing edges unless requested\n if (!includeExisting && graph.hasEdge(node, target)) {\n continue;\n }\n\n const score = adamicAdarScore(graph, node, target, { directed });\n\n if (score > 0) {\n scores.push({ source: node, target, score });\n }\n }\n\n // Sort by score in descending order\n scores.sort((a, b) => b.score - a.score);\n\n return scores.slice(0, topK);\n}\n\n/**\n * Calculate precision and recall for Adamic-Adar link prediction evaluation\n * @param trainingGraph - The training graph without test edges\n * @param testEdges - Array of node pairs that are actual edges\n * @param nonEdges - Array of node pairs that are not edges\n * @param options - Link prediction options\n * @returns Evaluation metrics including precision, recall, F1 score, and AUC\n */\nexport function evaluateAdamicAdar(\n trainingGraph: Graph,\n testEdges: [NodeId, NodeId][],\n nonEdges: [NodeId, NodeId][],\n options: LinkPredictionOptions = {},\n): {\n precision: number;\n recall: number;\n f1Score: number;\n auc: number;\n} {\n // Get scores for test edges and non-edges\n const testScores = adamicAdarForPairs(trainingGraph, testEdges, options);\n const nonEdgeScores = adamicAdarForPairs(trainingGraph, nonEdges, options);\n\n // Combine and sort all scores\n const allScores = [\n ...testScores.map((s) => ({ ...s, isActualEdge: true })),\n ...nonEdgeScores.map((s) => ({ ...s, isActualEdge: false })),\n ].sort((a, b) => b.score - a.score);\n\n // Calculate precision and recall at different thresholds\n let truePositives = 0;\n let falsePositives = 0;\n let bestF1 = 0;\n let bestPrecision = 0;\n let bestRecall = 0;\n\n const totalPositives = testEdges.length;\n\n for (const scoreItem of allScores) {\n if (scoreItem.isActualEdge) {\n truePositives++;\n } else {\n falsePositives++;\n }\n\n const precision = truePositives / (truePositives + falsePositives);\n const recall = truePositives / totalPositives;\n const f1 = precision + recall > 0 ? (2 * (precision * recall)) / (precision + recall) : 0;\n\n if (f1 > bestF1) {\n bestF1 = f1;\n bestPrecision = precision;\n bestRecall = recall;\n }\n }\n\n // Calculate AUC (Area Under Curve)\n let auc = 0;\n let tpCount = 0;\n let fpCount = 0;\n\n for (const item of allScores) {\n if (item.isActualEdge) {\n tpCount++;\n } else {\n auc += tpCount;\n fpCount++;\n }\n }\n\n if (tpCount > 0 && fpCount > 0) {\n auc = auc / (tpCount * fpCount);\n } else {\n auc = 0.5; // Random performance\n }\n\n return {\n precision: bestPrecision,\n recall: bestRecall,\n f1Score: bestF1,\n auc,\n };\n}\n\n/**\n * Compare Adamic-Adar with Common Neighbors for the same dataset\n * @param graph - The input graph\n * @param testEdges - Array of node pairs that are actual edges\n * @param nonEdges - Array of node pairs that are not edges\n * @param options - Link prediction options\n * @returns Comparison of evaluation metrics for both algorithms\n */\nexport function compareAdamicAdarWithCommonNeighbors(\n graph: Graph,\n testEdges: [NodeId, NodeId][],\n nonEdges: [NodeId, NodeId][],\n options: LinkPredictionOptions = {},\n): {\n adamicAdar: ReturnType<typeof evaluateAdamicAdar>;\n commonNeighbors: {\n precision: number;\n recall: number;\n f1Score: number;\n auc: number;\n };\n} {\n // Import common neighbors evaluation function\n // Since we're using ES modules, we can't use require. Instead, we'll implement a simple version here\n const commonNeighborsPairs = (pairs: [NodeId, NodeId][]): LinkPredictionScore[] =>\n pairs.map(([source, target]) => ({\n source,\n target,\n score: getCommonNeighbors(graph, source, target, options.directed).size,\n }));\n\n const testScores = commonNeighborsPairs(testEdges);\n const nonEdgeScores = commonNeighborsPairs(nonEdges);\n\n const allScores = [\n ...testScores.map((s) => ({ ...s, isActualEdge: true })),\n ...nonEdgeScores.map((s) => ({ ...s, isActualEdge: false })),\n ].sort((a, b) => b.score - a.score);\n\n let truePositives = 0;\n let falsePositives = 0;\n let bestF1 = 0;\n let bestPrecision = 0;\n let bestRecall = 0;\n const totalPositives = testEdges.length;\n\n for (const scoreItem of allScores) {\n if (scoreItem.isActualEdge) {\n truePositives++;\n } else {\n falsePositives++;\n }\n\n const precision = truePositives / (truePositives + falsePositives);\n const recall = truePositives / totalPositives;\n const f1 = precision + recall > 0 ? (2 * (precision * recall)) / (precision + recall) : 0;\n if (f1 > bestF1) {\n bestF1 = f1;\n bestPrecision = precision;\n bestRecall = recall;\n }\n }\n\n let auc = 0;\n let tpCount = 0;\n let fpCount = 0;\n for (const item of allScores) {\n if (item.isActualEdge) {\n tpCount++;\n } else {\n auc += tpCount;\n fpCount++;\n }\n }\n if (tpCount > 0 && fpCount > 0) {\n auc = auc / (tpCount * fpCount);\n } else {\n auc = 0.5;\n }\n\n const commonNeighborsResults = {\n precision: bestPrecision,\n recall: bestRecall,\n f1Score: bestF1,\n auc,\n };\n\n const adamicAdarResults = evaluateAdamicAdar(graph, testEdges, nonEdges, options);\n\n return {\n adamicAdar: adamicAdarResults,\n commonNeighbors: commonNeighborsResults,\n };\n}\n","import type { Graph } from \"../core/graph.js\";\nimport type { NodeId } from \"../types/index.js\";\nimport { getCommonNeighbors, getIntermediateNodes } from \"../utils/graph-utilities.js\";\n\n/**\n * Common Neighbors link prediction implementation\n *\n * Predicts the likelihood of a link between two nodes based on the number\n * of common neighbors they share. The intuition is that nodes with many\n * common neighbors are more likely to be connected.\n *\n * Time complexity: O(k²) where k is the average degree\n * Space complexity: O(k)\n */\n\nexport interface LinkPredictionScore {\n source: NodeId;\n target: NodeId;\n score: number;\n}\n\nexport interface LinkPredictionOptions {\n directed?: boolean; // Consider direction (default: false)\n includeExisting?: boolean; // Include existing edges (default: false)\n topK?: number; // Return only top K predictions\n}\n\n/**\n * Calculate common neighbors score for a pair of nodes\n * @param graph - The input graph\n * @param source - The source node ID\n * @param target - The target node ID\n * @param options - Link prediction options\n * @returns The number of common neighbors\n */\nexport function commonNeighborsScore(\n graph: Graph,\n source: NodeId,\n target: NodeId,\n options: LinkPredictionOptions = {},\n): number {\n if (!graph.hasNode(source) || !graph.hasNode(target)) {\n return 0;\n }\n\n const { directed = false } = options;\n\n // Use utility function to get common neighbors\n // For directed graphs, we want intermediate nodes that form paths source->X->target\n const commonNeighborsSet = directed\n ? getIntermediateNodes(graph, source, target)\n : getCommonNeighbors(graph, source, target, false);\n\n return commonNeighborsSet.size;\n}\n\n/**\n * Calculate common neighbors scores for all possible node pairs\n * @param graph - The input graph\n * @param options - Link prediction options\n * @returns Array of link prediction scores sorted by score descending\n */\nexport function commonNeighborsPrediction(graph: Graph, options: LinkPredictionOptions = {}): LinkPredictionScore[] {\n const { directed = false, includeExisting = false, topK } = options;\n\n const scores: LinkPredictionScore[] = [];\n const nodes = Array.from(graph.nodes()).map((n) => n.id);\n\n for (let i = 0; i < nodes.length; i++) {\n for (let j = i + 1; j < nodes.length; j++) {\n const source = nodes[i];\n const target = nodes[j];\n\n if (!source || !target) {\n continue;\n }\n\n // Skip existing edges unless requested\n if (!includeExisting && graph.hasEdge(source, target)) {\n continue;\n }\n\n const score = commonNeighborsScore(graph, source, target, { directed });\n\n if (score > 0) {\n scores.push({ source, target, score });\n\n // For undirected graphs, also add the reverse pair\n if (!directed && source !== target) {\n scores.push({ source: target, target: source, score });\n }\n }\n }\n }\n\n // Sort by score in descending order\n scores.sort((a, b) => b.score - a.score);\n\n // Return top K if specified\n if (topK && topK > 0) {\n return scores.slice(0, topK);\n }\n\n return scores;\n}\n\n/**\n * Calculate common neighbors scores for specific node pairs\n * @param graph - The input graph\n * @param pairs - Array of node ID pairs to calculate scores for\n * @param options - Link prediction options\n * @returns Array of link prediction scores for the specified pairs\n */\nexport function commonNeighborsForPairs(\n graph: Graph,\n pairs: [NodeId, NodeId][],\n options: LinkPredictionOptions = {},\n): LinkPredictionScore[] {\n return pairs.map(([source, target]) => ({\n source,\n target,\n score: commonNeighborsScore(graph, source, target, options),\n }));\n}\n\n/**\n * Get top candidates for link prediction for a specific node\n * @param graph - The input graph\n * @param node - The node ID to get candidates for\n * @param options - Link prediction options with optional candidate list\n * @returns Array of top link prediction candidates sorted by score descending\n */\nexport function getTopCandidatesForNode(\n graph: Graph,\n node: NodeId,\n options: LinkPredictionOptions & { candidates?: NodeId[] } = {},\n): LinkPredictionScore[] {\n if (!graph.hasNode(node)) {\n return [];\n }\n\n const { directed = false, includeExisting = false, topK = 10, candidates } = options;\n\n const scores: LinkPredictionScore[] = [];\n const targetNodes = candidates ?? Array.from(graph.nodes()).map((n) => n.id);\n\n for (const target of targetNodes) {\n if (target === node) {\n continue;\n }\n\n // Skip existing edges unless requested\n if (!includeExisting && graph.hasEdge(node, target)) {\n continue;\n }\n\n const score = commonNeighborsScore(graph, node, target, { directed });\n\n if (score > 0) {\n scores.push({ source: node, target, score });\n }\n }\n\n // Sort by score in descending order\n scores.sort((a, b) => b.score - a.score);\n\n return scores.slice(0, topK);\n}\n\n/**\n * Calculate precision and recall for link prediction evaluation\n * @param trainingGraph - The training graph without test edges\n * @param testEdges - Array of node pairs that are actual edges\n * @param nonEdges - Array of node pairs that are not edges\n * @param options - Link prediction options\n * @returns Evaluation metrics including precision, recall, F1 score, and AUC\n */\nexport function evaluateCommonNeighbors(\n trainingGraph: Graph,\n testEdges: [NodeId, NodeId][],\n nonEdges: [NodeId, NodeId][],\n options: LinkPredictionOptions = {},\n): {\n precision: number;\n recall: number;\n f1Score: number;\n auc: number;\n} {\n // Get scores for test edges and non-edges\n const testScores = commonNeighborsForPairs(trainingGraph, testEdges, options);\n const nonEdgeScores = commonNeighborsForPairs(trainingGraph, nonEdges, options);\n\n // Combine and sort all scores\n const allScores = [\n ...testScores.map((s) => ({ ...s, isActualEdge: true })),\n ...nonEdgeScores.map((s) => ({ ...s, isActualEdge: false })),\n ].sort((a, b) => b.score - a.score);\n\n // Calculate precision and recall at different thresholds\n let truePositives = 0;\n let falsePositives = 0;\n let bestF1 = 0;\n let bestPrecision = 0;\n let bestRecall = 0;\n\n const totalPositives = testEdges.length;\n\n for (const scoreItem of allScores) {\n if (scoreItem.isActualEdge) {\n truePositives++;\n } else {\n falsePositives++;\n }\n\n const precision = truePositives / (truePositives + falsePositives);\n const recall = truePositives / totalPositives;\n const f1 = precision + recall > 0 ? (2 * (precision * recall)) / (precision + recall) : 0;\n\n if (f1 > bestF1) {\n bestF1 = f1;\n bestPrecision = precision;\n bestRecall = recall;\n }\n }\n\n // Calculate AUC (Area Under Curve)\n let auc = 0;\n let tpCount = 0;\n let fpCount = 0;\n\n for (const item of allScores) {\n if (item.isActualEdge) {\n tpCount++;\n } else {\n auc += tpCount;\n fpCount++;\n }\n }\n\n if (tpCount > 0 && fpCount > 0) {\n auc = auc / (tpCount * fpCount);\n } else {\n auc = 0.5; // Random performance\n }\n\n return {\n precision: bestPrecision,\n recall: bestRecall,\n f1Score: bestF1,\n auc,\n };\n}\n","import type { Graph } from \"../core/graph.js\";\nimport type { NodeId } from \"../types/index.js\";\nimport { euclideanDistance, SeededRandom } from \"../utils/math-utilities.js\";\n\n/**\n * Configuration options for the SynC (Synergistic Deep Graph Clustering) algorithm\n */\nexport interface SynCConfig {\n /** Number of clusters to find */\n numClusters: number;\n /** Maximum number of iterations for convergence */\n maxIterations?: number;\n /** Convergence tolerance */\n tolerance?: number;\n /** Random seed for reproducibility */\n seed?: number;\n /** Learning rate for optimization */\n learningRate?: number;\n /** Regularization parameter */\n lambda?: number;\n}\n\n/**\n * Result of the SynC clustering algorithm\n */\nexport interface SynCResult {\n /** Cluster assignments for each node */\n clusters: Map<NodeId, number>;\n /** Final loss value */\n loss: number;\n /** Number of iterations performed */\n iterations: number;\n /** Node embeddings learned by the algorithm */\n embeddings: Map<NodeId, number[]>;\n /** Whether the algorithm converged */\n converged: boolean;\n}\n\n/**\n * Synergistic Deep Graph Clustering (SynC) Algorithm\n *\n * This algorithm combines representation learning with structure augmentation\n * for improved clustering performance on graphs. It jointly optimizes node\n * embeddings and cluster assignments while preserving graph structure.\n *\n * Based on: \"Synergistic Deep Graph Clustering\" (arXiv:2406.15797, June 2024)\n * @param graph - Input graph to cluster\n * @param config - Configuration options\n * @returns Clustering result with assignments and embeddings\n */\nexport function syncClustering(graph: Graph, config: SynCConfig): SynCResult {\n const { numClusters, maxIterations = 100, tolerance = 1e-6, seed = 42, learningRate = 0.01, lambda = 0.1 } = config;\n\n // Set random seed for reproducibility (save original)\n const originalRandom = Math.random;\n const rng = SeededRandom.createGenerator(seed);\n Math.random = rng;\n\n const nodes = Array.from(graph.nodes());\n const nodeCount = nodes.length;\n\n if (nodeCount === 0) {\n return {\n clusters: new Map(),\n loss: 0,\n iterations: 0,\n embeddings: new Map(),\n converged: true,\n };\n }\n\n if (numClusters <= 0 || numClusters > nodeCount) {\n throw new Error(\n `Invalid number of clusters: ${String(numClusters)}. Must be between 1 and ${String(nodeCount)}`,\n );\n }\n\n // Initialize node embeddings (simplified version using graph features)\n const embeddingDim = Math.min(64, nodeCount);\n const embeddings = new Map<NodeId, number[]>();\n\n // Initialize embeddings based on node features\n for (const node of nodes) {\n const embedding = initializeNodeEmbedding(graph, node.id, embeddingDim);\n embeddings.set(node.id, embedding);\n }\n\n // Initialize cluster centers\n const clusterCenters = initializeClusterCenters(embeddings, numClusters);\n\n let previousLoss = Infinity;\n let iterations = 0;\n let converged = false;\n\n for (iterations = 0; iterations < maxIterations; iterations++) {\n // E-step: Assign nodes to clusters\n const clusters = new Map<NodeId, number>();\n\n for (const node of nodes) {\n const nodeEmbedding = embeddings.get(node.id);\n if (!nodeEmbedding) {\n continue;\n }\n\n let bestCluster = 0;\n let minDistance = Infinity;\n\n for (let k = 0; k < numClusters; k++) {\n const center = clusterCenters[k];\n if (!center) {\n continue;\n }\n\n const distance = euclideanDistance(nodeEmbedding, center);\n if (distance < minDistance) {\n minDistance = distance;\n bestCluster = k;\n }\n }\n\n clusters.set(node.id, bestCluster);\n }\n\n // M-step: Update embeddings and cluster centers\n updateEmbeddings(graph, embeddings, clusters, learningRate, lambda);\n updateClusterCenters(embeddings, clusters, clusterCenters, numClusters);\n\n // Calculate current loss\n const currentLoss = calculateLoss(graph, embeddings, clusters, clusterCenters, lambda);\n\n // Check for convergence\n if (Math.abs(previousLoss - currentLoss) < tolerance) {\n converged = true;\n break;\n }\n\n previousLoss = currentLoss;\n }\n\n // Final cluster assignment\n const finalClusters = new Map<NodeId, number>();\n for (const node of nodes) {\n const nodeEmbedding = embeddings.get(node.id);\n if (!nodeEmbedding) {\n continue;\n }\n\n let bestCluster = 0;\n let minDistance = Infinity;\n\n for (let k = 0; k < numClusters; k++) {\n const center = clusterCenters[k];\n if (!center) {\n continue;\n }\n\n const distance = euclideanDistance(nodeEmbedding, center);\n if (distance < minDistance) {\n minDistance = distance;\n bestCluster = k;\n }\n }\n\n finalClusters.set(node.id, bestCluster);\n }\n\n // Restore original random function\n Math.random = originalRandom;\n\n return {\n clusters: finalClusters,\n loss: previousLoss,\n iterations: iterations + 1,\n embeddings,\n converged,\n };\n}\n\n/**\n * Initialize node embedding based on graph structure and features\n * @param graph - The input graph\n * @param nodeId - The node ID to initialize embedding for\n * @param dim - The embedding dimension\n * @returns The initialized embedding vector\n */\nfunction initializeNodeEmbedding(graph: Graph, nodeId: NodeId, dim: number): number[] {\n const embedding = new Array<number>(dim).fill(0);\n\n // Use node degree as a base feature\n const degree = graph.degree(nodeId);\n const normalizedDegree = degree / Math.max(1, graph.nodeCount - 1);\n\n // Initialize with small random values influenced by graph structure\n for (let i = 0; i < dim; i++) {\n embedding[i] = (Math.random() - 0.5) * 0.1 + normalizedDegree * 0.1;\n }\n\n return embedding;\n}\n\n/**\n * Initialize cluster centers using k-means++ style initialization\n * @param embeddings - Map of node IDs to embedding vectors\n * @param numClusters - Number of cluster centers to initialize\n * @returns Array of initialized cluster center vectors\n */\nfunction initializeClusterCenters(embeddings: Map<NodeId, number[]>, numClusters: number): number[][] {\n const embeddingArray = Array.from(embeddings.values());\n const centers: number[][] = [];\n\n // Choose first center randomly\n const firstCenter = embeddingArray[Math.floor(Math.random() * embeddingArray.length)];\n if (firstCenter) {\n centers.push([...firstCenter] as number[]);\n }\n\n // Choose remaining centers using k-means++ initialization\n for (let k = 1; k < numClusters; k++) {\n const distances: number[] = [];\n let totalDistance = 0;\n\n for (const embedding of embeddingArray) {\n let minDistance = Infinity;\n for (const center of centers) {\n const distance = euclideanDistance(embedding, center);\n minDistance = Math.min(minDistance, distance);\n }\n distances.push(minDistance * minDistance);\n totalDistance += minDistance * minDistance;\n }\n\n // Choose next center with probability proportional to squared distance\n let randomValue = Math.random() * totalDistance;\n for (let i = 0; i < embeddingArray.length; i++) {\n const distanceValue = distances[i];\n if (distanceValue !== undefined) {\n randomValue -= distanceValue;\n }\n\n if (randomValue <= 0) {\n const newCenter = embeddingArray[i];\n if (newCenter) {\n centers.push([...newCenter] as number[]);\n }\n\n break;\n }\n }\n }\n\n return centers;\n}\n\n/**\n * Update node embeddings using gradient descent\n * @param graph - The input graph\n * @param embeddings - Map of node IDs to embedding vectors\n * @param _clusters - Map of node IDs to cluster assignments (reserved for future use)\n * @param learningRate - Learning rate for gradient descent\n * @param lambda - Regularization parameter\n */\nfunction updateEmbeddings(\n graph: Graph,\n embeddings: Map<NodeId, number[]>,\n _clusters: Map<NodeId, number>,\n learningRate: number,\n lambda: number,\n): void {\n const gradients = new Map<NodeId, number[]>();\n\n // Initialize gradients\n for (const [nodeId, embedding] of embeddings) {\n gradients.set(nodeId, new Array<number>(embedding.length).fill(0));\n }\n\n // Calculate gradients based on graph structure (simplified)\n for (const node of graph.nodes()) {\n const nodeId = node.id;\n const nodeEmbedding = embeddings.get(nodeId);\n if (!nodeEmbedding) {\n continue;\n }\n\n const gradient = gradients.get(nodeId);\n if (!gradient) {\n continue;\n }\n\n // Neighbor reconstruction loss gradient\n for (const neighborId of graph.neighbors(nodeId)) {\n const neighborEmbedding = embeddings.get(neighborId);\n if (!neighborEmbedding) {\n continue;\n }\n\n const diff = nodeEmbedding.map((val: number, i: number) => val - (neighborEmbedding[i] ?? 0));\n\n for (let i = 0; i < gradient.length; i++) {\n const gradVal = gradient[i];\n const diffVal = diff[i];\n if (gradVal !== undefined && diffVal !== undefined) {\n gradient[i] = gradVal + lambda * diffVal;\n }\n }\n }\n\n // Regularization gradient\n for (let i = 0; i < gradient.length; i++) {\n const gradVal = gradient[i];\n const nodeVal = nodeEmbedding[i];\n if (gradVal !== undefined && nodeVal !== undefined) {\n gradient[i] = gradVal + lambda * nodeVal;\n }\n }\n }\n\n // Update embeddings\n for (const [nodeId, embedding] of embeddings) {\n const gradient = gradients.get(nodeId);\n if (!gradient) {\n continue;\n }\n\n for (let i = 0; i < embedding.length; i++) {\n const embVal = embedding[i];\n const gradVal = gradient[i];\n if (embVal !== undefined && gradVal !== undefined) {\n embedding[i] = embVal - learningRate * gradVal;\n }\n }\n }\n}\n\n/**\n * Update cluster centers based on current assignments\n * @param embeddings - Map of node IDs to embedding vectors\n * @param clusters - Map of node IDs to cluster assignments\n * @param clusterCenters - Array of cluster center vectors to update\n * @param numClusters - Number of clusters\n */\nfunction updateClusterCenters(\n embeddings: Map<NodeId, number[]>,\n clusters: Map<NodeId, number>,\n clusterCenters: number[][],\n numClusters: number,\n): void {\n const dimensions = clusterCenters[0]?.length ?? 0;\n const clusterSums: number[][] = Array.from(\n { length: numClusters },\n () => new Array(dimensions).fill(0) as number[],\n );\n const clusterCounts = new Array<number>(numClusters).fill(0);\n\n // Sum embeddings for each cluster\n for (const [nodeId, clusterIdx] of clusters) {\n const embedding = embeddings.get(nodeId);\n if (!embedding) {\n continue;\n }\n\n for (let i = 0; i < embedding.length; i++) {\n const clusterSum = clusterSums[clusterIdx];\n if (!clusterSum) {\n continue;\n }\n\n const sumVal = clusterSum[i];\n const embVal = embedding[i];\n if (sumVal !== undefined && embVal !== undefined) {\n clusterSum[i] = sumVal + embVal;\n }\n }\n if (clusterCounts[clusterIdx] !== undefined) {\n clusterCounts[clusterIdx]++;\n }\n }\n\n // Update cluster centers (average of assigned embeddings)\n for (let k = 0; k < numClusters; k++) {\n const count = clusterCounts[k];\n const center = clusterCenters[k];\n const sum = clusterSums[k];\n if (count !== undefined && count > 0 && center && sum) {\n for (let i = 0; i < center.length; i++) {\n const sumVal = sum[i];\n if (sumVal !== undefined) {\n center[i] = sumVal / count;\n }\n }\n }\n }\n}\n\n/**\n * Calculate the total loss function\n * @param graph - The input graph\n * @param embeddings - Map of node IDs to embedding vectors\n * @param clusters - Map of node IDs to cluster assignments\n * @param clusterCenters - Array of cluster center vectors\n * @param lambda - Regularization parameter\n * @returns The total loss value\n */\nfunction calculateLoss(\n graph: Graph,\n embeddings: Map<NodeId, number[]>,\n clusters: Map<NodeId, number>,\n clusterCenters: number[][],\n lambda: number,\n): number {\n let clusteringLoss = 0;\n let reconstructionLoss = 0;\n let regularizationLoss = 0;\n\n // Clustering loss (distance to cluster centers)\n for (const [nodeId, clusterIdx] of clusters) {\n const embedding = embeddings.get(nodeId);\n if (!embedding) {\n continue;\n }\n\n const center = clusterCenters[clusterIdx];\n if (!center) {\n continue;\n }\n\n clusteringLoss += euclideanDistance(embedding, center) ** 2;\n }\n\n // Graph reconstruction loss\n for (const node of graph.nodes()) {\n const nodeId = node.id;\n const nodeEmbedding = embeddings.get(nodeId);\n if (!nodeEmbedding) {\n continue;\n }\n\n for (const neighborId of graph.neighbors(nodeId)) {\n const neighborEmbedding = embeddings.get(neighborId);\n if (!neighborEmbedding) {\n continue;\n }\n\n const distance = euclideanDistance(nodeEmbedding, neighborEmbedding);\n reconstructionLoss += distance ** 2;\n }\n }\n\n // Regularization loss\n for (const embedding of embeddings.values()) {\n for (const value of embedding) {\n regularizationLoss += value ** 2;\n }\n }\n\n return clusteringLoss + lambda * reconstructionLoss + lambda * regularizationLoss;\n}\n","import type { Graph } from \"../core/graph.js\";\nimport type { NodeId } from \"../types/index.js\";\n\n/**\n * Configuration options for the TeraHAC (Hierarchical Agglomerative Clustering) algorithm\n */\nexport interface TeraHACConfig {\n /** Linkage criterion: 'single', 'complete', 'average', 'ward' */\n linkage?: \"single\" | \"complete\" | \"average\" | \"ward\";\n /** Number of clusters to stop at (optional) */\n numClusters?: number;\n /** Distance threshold to stop clustering */\n distanceThreshold?: number;\n /** Maximum number of nodes to process efficiently */\n maxNodes?: number;\n /** Use graph structure for distance calculation */\n useGraphDistance?: boolean;\n /** Custom warning handler (default: console.warn) */\n onWarning?: (message: string) => void;\n}\n\n/**\n * Represents a node in the dendrogram/cluster hierarchy\n */\nexport interface ClusterNode {\n /** Unique identifier for this cluster */\n id: string;\n /** Node IDs in this cluster */\n members: Set<NodeId>;\n /** Left child cluster (if internal node) */\n left?: ClusterNode;\n /** Right child cluster (if internal node) */\n right?: ClusterNode;\n /** Distance at which this cluster was formed */\n distance: number;\n /** Size of the cluster */\n size: number;\n}\n\n/**\n * Result of the TeraHAC clustering algorithm\n */\nexport interface TeraHACResult {\n /** Root of the dendrogram */\n dendrogram: ClusterNode;\n /** Flat clustering at specified level */\n clusters: Map<NodeId, number>;\n /** All merge distances in order */\n distances: number[];\n /** Number of clusters in final result */\n numClusters: number;\n}\n\n/**\n * TeraHAC - Hierarchical Agglomerative Clustering for Large Graphs\n *\n * This algorithm performs hierarchical clustering on graphs by iteratively\n * merging the closest clusters. Optimized for scalability to handle large\n * graphs efficiently.\n *\n * Based on: \"Scaling Hierarchical Agglomerative Clustering to Trillion-Edge Graphs\"\n * Google Research 2024\n * @param graph - Input graph to cluster\n * @param config - Configuration options\n * @returns Hierarchical clustering result\n */\nexport function teraHAC(graph: Graph, config: TeraHACConfig = {}): TeraHACResult {\n const {\n linkage = \"average\",\n numClusters,\n distanceThreshold,\n maxNodes = 10000,\n useGraphDistance = true,\n onWarning = console.warn,\n } = config;\n\n // Input validation\n if (numClusters !== undefined && (numClusters < 1 || !Number.isInteger(numClusters))) {\n throw new Error(\"numClusters must be a positive integer\");\n }\n\n const nodes = Array.from(graph.nodes());\n const nodeCount = nodes.length;\n\n if (nodeCount === 0) {\n throw new Error(\"Cannot cluster empty graph\");\n }\n\n if (nodeCount > maxNodes) {\n onWarning(\n `Graph has ${String(nodeCount)} nodes, which exceeds maxNodes (${String(maxNodes)}). Performance may be degraded.`,\n );\n }\n\n // Initialize each node as its own cluster\n const clusters = new Map<string, ClusterNode>();\n let nextClusterId = nodeCount;\n\n for (let i = 0; i < nodeCount; i++) {\n const node = nodes[i];\n if (!node) {\n continue;\n }\n\n const clusterId = i.toString();\n clusters.set(clusterId, {\n id: clusterId,\n members: new Set([node.id]),\n distance: 0,\n size: 1,\n });\n }\n\n // Calculate initial distance matrix\n const distanceMatrix = calculateDistanceMatrix(graph, nodes, useGraphDistance);\n const mergeDistances: number[] = [];\n\n // Priority queue for efficient nearest neighbor finding\n const mergeCandidates = initializeMergeCandidates(clusters, distanceMatrix);\n\n let dendrogram: ClusterNode | undefined;\n\n // Perform agglomerative clustering\n while (clusters.size > 1 && mergeCandidates.length > 0) {\n // Find closest pair of clusters\n const { cluster1Id, cluster2Id, distance } = findClosestPair(mergeCandidates);\n\n // Check stopping criteria\n if (numClusters && clusters.size <= numClusters) {\n break;\n }\n\n if (distanceThreshold && distance > distanceThreshold) {\n break;\n }\n\n // Get the two clusters to merge\n const cluster1 = clusters.get(cluster1Id);\n const cluster2 = clusters.get(cluster2Id);\n if (!cluster1 || !cluster2) {\n continue;\n }\n\n // Create new merged cluster\n const newClusterId = (nextClusterId++).toString();\n const mergedMembers = new Set([...cluster1.members, ...cluster2.members]);\n\n const newCluster: ClusterNode = {\n id: newClusterId,\n members: mergedMembers,\n left: cluster1,\n right: cluster2,\n distance,\n size: cluster1.size + cluster2.size,\n };\n\n // Remove old clusters\n clusters.delete(cluster1Id);\n clusters.delete(cluster2Id);\n\n // Add new cluster\n clusters.set(newClusterId, newCluster);\n mergeDistances.push(distance);\n\n // Update merge candidates\n updateMergeCandidates(mergeCandidates, cluster1Id, cluster2Id, newClusterId, clusters, distanceMatrix, linkage);\n\n dendrogram = newCluster;\n }\n\n // If we have multiple remaining clusters, create a virtual root\n if (clusters.size > 1) {\n const remainingClusters = Array.from(clusters.values());\n let root = remainingClusters[0];\n if (!root) {\n dendrogram = undefined;\n } else {\n for (let i = 1; i < remainingClusters.length; i++) {\n const currentCluster = remainingClusters[i];\n if (!currentCluster) {\n continue;\n }\n\n const newRoot: ClusterNode = {\n id: (nextClusterId++).toString(),\n members: new Set([...root.members, ...currentCluster.members]),\n left: root,\n right: currentCluster,\n distance: Infinity,\n size: root.size + currentCluster.size,\n };\n root = newRoot;\n }\n dendrogram = root;\n }\n\n dendrogram = root;\n }\n\n dendrogram ??= Array.from(clusters.values())[0];\n\n // Extract flat clustering\n const finalNumClusters = numClusters ?? clusters.size;\n const flatClusters = dendrogram ? extractFlatClustering(dendrogram, finalNumClusters) : new Map<NodeId, number>();\n\n if (!dendrogram) {\n throw new Error(\"Failed to create dendrogram\");\n }\n\n return {\n dendrogram,\n clusters: flatClusters,\n distances: mergeDistances,\n numClusters: finalNumClusters,\n };\n}\n\n/**\n * Calculate distance matrix between all pairs of nodes\n * @param graph - The input graph\n * @param nodes - Array of nodes to calculate distances between\n * @param useGraphDistance - Whether to use graph-based shortest path distances\n * @returns 2D distance matrix\n */\nfunction calculateDistanceMatrix(graph: Graph, nodes: { id: NodeId }[], useGraphDistance: boolean): number[][] {\n const n = nodes.length;\n const matrix: number[][] = Array.from({ length: n }, () => new Array(n).fill(Infinity) as number[]);\n\n if (useGraphDistance) {\n // Use graph-based distances (shortest path)\n for (let i = 0; i < n; i++) {\n const node = nodes[i];\n if (!node) {\n continue;\n }\n\n const distances = bfsShortestPaths(graph, node.id);\n for (let j = 0; j < n; j++) {\n if (i !== j) {\n const targetNode = nodes[j];\n if (targetNode && i < matrix.length && j < n) {\n const row = matrix[i];\n if (row && j < row.length) {\n const distance = distances.get(targetNode.id);\n row[j] = distance ?? Infinity;\n }\n }\n } else if (i < matrix.length) {\n const row = matrix[i];\n if (row && j < row.length) {\n row[j] = 0;\n }\n }\n }\n }\n } else {\n // Use simple edge-based distances\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n const node1 = nodes[i];\n const node2 = nodes[j];\n if (node1 && node2) {\n const hasEdge = graph.hasEdge(node1.id, node2.id);\n const distance = hasEdge ? 1 : 2; // Connected: 1, not connected: 2\n if (i < matrix.length) {\n const rowI = matrix[i];\n if (rowI && j < rowI.length) {\n rowI[j] = distance;\n }\n }\n\n if (j < matrix.length) {\n const rowJ = matrix[j];\n if (rowJ && i < rowJ.length) {\n rowJ[i] = distance;\n }\n }\n }\n }\n if (i < matrix.length) {\n const row = matrix[i];\n if (row && i < row.length) {\n row[i] = 0;\n }\n }\n }\n }\n\n return matrix;\n}\n\n/**\n * BFS-based shortest path calculation from a source node\n * @param graph - The input graph\n * @param source - The source node ID\n * @returns Map of node IDs to their distances from the source\n */\nfunction bfsShortestPaths(graph: Graph, source: NodeId): Map<NodeId, number> {\n const distances = new Map<NodeId, number>();\n const queue: [NodeId, number][] = [[source, 0]];\n const visited = new Set<NodeId>();\n\n visited.add(source);\n distances.set(source, 0);\n\n while (queue.length > 0) {\n const item = queue.shift();\n if (!item) {\n break;\n }\n\n const [current, distance] = item;\n\n for (const neighbor of graph.neighbors(current)) {\n if (!visited.has(neighbor)) {\n visited.add(neighbor);\n distances.set(neighbor, distance + 1);\n queue.push([neighbor, distance + 1]);\n }\n }\n }\n\n return distances;\n}\n\n/**\n * Initialize merge candidates priority queue\n * @param clusters - Map of cluster IDs to cluster nodes\n * @param distanceMatrix - 2D distance matrix between nodes\n * @returns Array of merge candidates sorted by distance\n */\nfunction initializeMergeCandidates(\n clusters: Map<string, ClusterNode>,\n distanceMatrix: number[][],\n): { cluster1Id: string; cluster2Id: string; distance: number }[] {\n const candidates: { cluster1Id: string; cluster2Id: string; distance: number }[] = [];\n const clusterIds = Array.from(clusters.keys());\n\n for (let i = 0; i < clusterIds.length; i++) {\n for (let j = i + 1; j < clusterIds.length; j++) {\n const id1 = clusterIds[i];\n const id2 = clusterIds[j];\n if (!id1 || !id2) {\n continue;\n }\n\n const row = distanceMatrix[parseInt(id1)];\n if (!row) {\n continue;\n }\n\n const distance = row[parseInt(id2)] ?? Infinity;\n // Include all candidates, even disconnected ones (with finite but large distance)\n candidates.push({\n cluster1Id: id1,\n cluster2Id: id2,\n distance: distance === Infinity ? 100 : distance,\n });\n }\n }\n\n // Sort by distance (ascending)\n candidates.sort((a, b) => a.distance - b.distance);\n return candidates;\n}\n\n/**\n * Find the closest pair of clusters\n * @param mergeCandidates - Array of merge candidates\n * @returns The closest cluster pair with their distance\n */\nfunction findClosestPair(mergeCandidates: { cluster1Id: string; cluster2Id: string; distance: number }[]): {\n cluster1Id: string;\n cluster2Id: string;\n distance: number;\n} {\n // Return the first (closest) valid candidate\n const candidate = mergeCandidates.shift();\n if (!candidate) {\n throw new Error(\"No merge candidates available\");\n }\n\n return candidate;\n}\n\n/**\n * Update merge candidates after a merge operation\n * @param mergeCandidates - Array of merge candidates to update\n * @param oldCluster1Id - ID of first merged cluster\n * @param oldCluster2Id - ID of second merged cluster\n * @param newClusterId - ID of the newly created cluster\n * @param clusters - Map of cluster IDs to cluster nodes\n * @param distanceMatrix - 2D distance matrix between nodes\n * @param linkage - Linkage criterion to use\n */\nfunction updateMergeCandidates(\n mergeCandidates: { cluster1Id: string; cluster2Id: string; distance: number }[],\n oldCluster1Id: string,\n oldCluster2Id: string,\n newClusterId: string,\n clusters: Map<string, ClusterNode>,\n distanceMatrix: number[][],\n linkage: string,\n): void {\n // Remove candidates involving the merged clusters\n for (let i = mergeCandidates.length - 1; i >= 0; i--) {\n const candidate = mergeCandidates[i];\n if (!candidate) {\n continue;\n }\n\n if (\n candidate.cluster1Id === oldCluster1Id ||\n candidate.cluster1Id === oldCluster2Id ||\n candidate.cluster2Id === oldCluster1Id ||\n candidate.cluster2Id === oldCluster2Id\n ) {\n mergeCandidates.splice(i, 1);\n }\n }\n\n // Add new candidates for the merged cluster\n const newCluster = clusters.get(newClusterId);\n if (!newCluster) {\n return;\n }\n\n for (const [clusterId, cluster] of clusters) {\n if (clusterId !== newClusterId) {\n const distance = calculateClusterDistance(newCluster, cluster, distanceMatrix, linkage);\n mergeCandidates.push({\n cluster1Id: newClusterId,\n cluster2Id: clusterId,\n distance: distance === Infinity ? 100 : distance,\n });\n }\n }\n\n // Re-sort candidates\n mergeCandidates.sort((a, b) => a.distance - b.distance);\n}\n\n/**\n * Calculate distance between two clusters based on linkage criterion\n * @param cluster1 - First cluster\n * @param cluster2 - Second cluster\n * @param distanceMatrix - 2D distance matrix between nodes\n * @param linkage - Linkage criterion (single, complete, average, ward)\n * @returns The distance between the two clusters\n */\nfunction calculateClusterDistance(\n cluster1: ClusterNode,\n cluster2: ClusterNode,\n distanceMatrix: number[][],\n linkage: string,\n): number {\n const members1 = Array.from(cluster1.members);\n const members2 = Array.from(cluster2.members);\n const distances: number[] = [];\n\n // Calculate all pairwise distances between cluster members\n for (const member1 of members1) {\n for (const member2 of members2) {\n const idx1 = parseInt(member1.toString());\n const idx2 = parseInt(member2.toString());\n if (idx1 < distanceMatrix.length && idx2 < distanceMatrix.length) {\n const row = distanceMatrix[idx1];\n if (row) {\n const distance = row[idx2];\n if (distance !== undefined) {\n distances.push(distance);\n }\n }\n }\n }\n }\n\n if (distances.length === 0) {\n return Infinity;\n }\n\n // Apply linkage criterion\n switch (linkage) {\n case \"single\":\n return Math.min(...distances);\n case \"complete\":\n return Math.max(...distances);\n case \"average\":\n return distances.reduce((sum, d) => sum + d, 0) / distances.length;\n case \"ward\":\n // Simplified Ward linkage (would need cluster centroids for full implementation)\n return distances.reduce((sum, d) => sum + d * d, 0) / distances.length;\n default:\n return distances.reduce((sum, d) => sum + d, 0) / distances.length;\n }\n}\n\n/**\n * Extract flat clustering from dendrogram\n * @param dendrogram - The root of the dendrogram tree\n * @param numClusters - The target number of clusters\n * @returns Map of node IDs to cluster assignments\n */\nfunction extractFlatClustering(dendrogram: ClusterNode, numClusters: number): Map<NodeId, number> {\n const clusters = new Map<NodeId, number>();\n\n if (numClusters === 1) {\n // Single cluster\n const clusterId = 0;\n for (const member of dendrogram.members) {\n clusters.set(member, clusterId);\n }\n return clusters;\n }\n\n // Find clusters at the specified level\n const clusterNodes: ClusterNode[] = [];\n const queue: ClusterNode[] = [dendrogram];\n\n while (queue.length > 0 && clusterNodes.length < numClusters) {\n const current = queue.shift();\n if (!current) {\n break;\n }\n\n if (!current.left || !current.right || clusterNodes.length + queue.length + 1 >= numClusters) {\n // This is a leaf or we need to keep this level\n clusterNodes.push(current);\n } else {\n // Continue decomposing\n queue.push(current.left, current.right);\n }\n }\n\n // Assign cluster IDs\n for (let i = 0; i < clusterNodes.length; i++) {\n const cluster = clusterNodes[i];\n if (!cluster) {\n continue;\n }\n\n for (const member of cluster.members) {\n clusters.set(member, i);\n }\n }\n\n return clusters;\n}\n","import type { Graph } from \"../core/graph.js\";\nimport type { NodeId } from \"../types/index.js\";\nimport { SeededRandom } from \"../utils/math-utilities.js\";\n\n/**\n * Configuration options for the GRSBM (Greedy Recursive Spectral Bisection) algorithm\n */\nexport interface GRSBMConfig {\n /** Maximum depth of recursive bisection */\n maxDepth?: number;\n /** Minimum cluster size to continue splitting */\n minClusterSize?: number;\n /** Number of eigenvectors to use for spectral embedding */\n numEigenvectors?: number;\n /** Convergence tolerance for eigenvalue computation */\n tolerance?: number;\n /** Maximum number of power iterations for eigenvalue computation */\n maxIterations?: number;\n /** Random seed for reproducibility */\n seed?: number;\n}\n\n/**\n * Represents a cluster in the hierarchical structure\n */\nexport interface GRSBMCluster {\n /** Unique identifier for this cluster */\n id: string;\n /** Node IDs in this cluster */\n members: Set<NodeId>;\n /** Left child cluster (if split) */\n left?: GRSBMCluster;\n /** Right child cluster (if split) */\n right?: GRSBMCluster;\n /** Modularity score of this cluster */\n modularity: number;\n /** Depth in the hierarchy */\n depth: number;\n /** Spectral embedding quality score */\n spectralScore: number;\n}\n\n/**\n * Result of the GRSBM clustering algorithm\n */\nexport interface GRSBMResult {\n /** Root of the cluster hierarchy */\n root: GRSBMCluster;\n /** Flat clustering at leaf level */\n clusters: Map<NodeId, number>;\n /** Number of final clusters */\n numClusters: number;\n /** Modularity scores for each level */\n modularityScores: number[];\n /** Explanation of the clustering structure */\n explanation: ClusterExplanation[];\n}\n\n/**\n * Explanation for a cluster split decision\n */\nexport interface ClusterExplanation {\n /** Cluster that was split */\n clusterId: string;\n /** Reason for the split */\n reason: string;\n /** Modularity improvement from the split */\n modularityImprovement: number;\n /** Key nodes that influenced the split */\n keyNodes: NodeId[];\n /** Spectral embedding values */\n spectralValues: number[];\n}\n\n/**\n * GRSBM - Greedy Recursive Spectral Bisection with Modularity\n *\n * This algorithm performs hierarchical community detection using spectral\n * bisection guided by modularity optimization. It provides explainable\n * community structure by tracking the reasoning behind each split.\n *\n * Based on: \"Explainable Community Detection via Hierarchical Spectral Clustering\" (2024)\n * @param graph - Input graph to cluster\n * @param config - Configuration options\n * @returns Hierarchical clustering result with explanations\n */\nexport function grsbm(graph: Graph, config: GRSBMConfig = {}): GRSBMResult {\n const {\n maxDepth = 10,\n minClusterSize = 2, // Reduced default to allow more splits\n numEigenvectors = 2,\n tolerance = 1e-6,\n maxIterations = 100,\n seed = 42,\n } = config;\n\n // Set random seed for reproducibility\n const rng = SeededRandom.createGenerator(seed);\n const originalRandom = Math.random;\n Math.random = rng;\n\n const nodes = Array.from(graph.nodes());\n const nodeCount = nodes.length;\n\n if (nodeCount === 0) {\n throw new Error(\"Cannot cluster empty graph\");\n }\n\n // Initialize root cluster with all nodes\n const rootMembers = new Set(nodes.map((node) => node.id));\n const initialModularity = calculateModularity(graph, new Map([...rootMembers].map((id) => [id, 0])));\n\n const root: GRSBMCluster = {\n id: \"root\",\n members: rootMembers,\n modularity: initialModularity,\n depth: 0,\n spectralScore: 0,\n };\n\n const explanations: ClusterExplanation[] = [];\n const modularityScores: number[] = [initialModularity];\n\n // Perform recursive bisection\n const clusterQueue: GRSBMCluster[] = [root];\n let nextClusterId = 1;\n\n while (clusterQueue.length > 0) {\n const currentCluster = clusterQueue.shift();\n if (!currentCluster) {\n continue;\n }\n\n // Check stopping criteria\n if (currentCluster.depth >= maxDepth || currentCluster.members.size < minClusterSize * 2) {\n continue;\n }\n\n // Attempt spectral bisection\n const bisectionResult = spectralBisection(graph, currentCluster, numEigenvectors, tolerance, maxIterations);\n\n if (!bisectionResult) {\n continue; // Could not split this cluster\n }\n\n const { leftMembers, rightMembers, spectralScore, keyNodes, spectralValues, reason } = bisectionResult;\n\n // Create child clusters\n const leftCluster: GRSBMCluster = {\n id: `cluster_${String(nextClusterId++)}`,\n members: leftMembers,\n modularity: 0, // Will be calculated below\n depth: currentCluster.depth + 1,\n spectralScore,\n };\n\n const rightCluster: GRSBMCluster = {\n id: `cluster_${String(nextClusterId++)}`,\n members: rightMembers,\n modularity: 0, // Will be calculated below\n depth: currentCluster.depth + 1,\n spectralScore,\n };\n\n // Calculate modularity improvement\n const newAssignment = new Map<NodeId, number>();\n for (const nodeId of leftMembers) {\n newAssignment.set(nodeId, 0);\n }\n for (const nodeId of rightMembers) {\n newAssignment.set(nodeId, 1);\n }\n\n const newModularity = calculateModularity(graph, newAssignment);\n const modularityImprovement = newModularity - currentCluster.modularity;\n\n // Only split if modularity improves or is neutral (allow small splits)\n if (modularityImprovement >= -0.01) {\n // Small tolerance for neutral splits\n leftCluster.modularity = newModularity;\n rightCluster.modularity = newModularity;\n\n currentCluster.left = leftCluster;\n currentCluster.right = rightCluster;\n\n // Add explanation\n explanations.push({\n clusterId: currentCluster.id,\n reason,\n modularityImprovement,\n keyNodes,\n spectralValues,\n });\n\n modularityScores.push(newModularity);\n\n // Add children to queue for further processing\n clusterQueue.push(leftCluster, rightCluster);\n }\n }\n\n // Extract flat clustering from leaf nodes\n const clusters = new Map<NodeId, number>();\n let clusterId = 0;\n\n function assignClusterIds(cluster: GRSBMCluster): void {\n if (!cluster.left && !cluster.right) {\n // Leaf node\n for (const nodeId of cluster.members) {\n clusters.set(nodeId, clusterId);\n }\n clusterId++;\n } else {\n // Internal node - traverse children\n if (cluster.left) {\n assignClusterIds(cluster.left);\n }\n\n if (cluster.right) {\n assignClusterIds(cluster.right);\n }\n }\n }\n\n assignClusterIds(root);\n\n // Restore original random function\n Math.random = originalRandom;\n\n return {\n root,\n clusters,\n numClusters: clusterId,\n modularityScores,\n explanation: explanations,\n };\n}\n\n/**\n * Perform spectral bisection on a cluster\n * @param graph - The input graph\n * @param cluster - The cluster to bisect\n * @param _numEigenvectors - Number of eigenvectors to compute (reserved for future use)\n * @param tolerance - Convergence tolerance\n * @param maxIterations - Maximum number of iterations\n * @returns Bisection result with left/right members, scores, and explanation, or null if bisection failed\n */\nfunction spectralBisection(\n graph: Graph,\n cluster: GRSBMCluster,\n _numEigenvectors: number,\n tolerance: number,\n maxIterations: number,\n): {\n leftMembers: Set<NodeId>;\n rightMembers: Set<NodeId>;\n spectralScore: number;\n keyNodes: NodeId[];\n spectralValues: number[];\n reason: string;\n} | null {\n const members = Array.from(cluster.members);\n const n = members.length;\n\n if (n < 4) {\n return null; // Too small to split meaningfully\n }\n\n // Create subgraph Laplacian matrix\n const laplacian = createLaplacianMatrix(graph, members);\n\n // Compute the second smallest eigenvector (Fiedler vector)\n const eigenvector = computeFiedlerVector(laplacian, tolerance, maxIterations);\n\n if (!eigenvector) {\n return null; // Could not compute eigenvector\n }\n\n // Find optimal split point\n const sortedIndices = eigenvector.map((value, index) => ({ value, index })).sort((a, b) => a.value - b.value);\n\n let bestSplitIndex = Math.floor(n / 2);\n let bestModularity = -Infinity;\n\n // Try different split points\n for (let splitIndex = Math.floor(n * 0.2); splitIndex <= Math.floor(n * 0.8); splitIndex++) {\n const leftIndices = sortedIndices.slice(0, splitIndex).map((item) => item.index);\n const rightIndices = sortedIndices.slice(splitIndex).map((item) => item.index);\n\n const assignment = new Map<NodeId, number>();\n for (const idx of leftIndices) {\n const nodeId = members[idx];\n if (nodeId !== undefined) {\n assignment.set(nodeId, 0);\n }\n }\n for (const idx of rightIndices) {\n const nodeId = members[idx];\n if (nodeId !== undefined) {\n assignment.set(nodeId, 1);\n }\n }\n\n const modularity = calculateModularity(graph, assignment);\n\n if (modularity > bestModularity) {\n bestModularity = modularity;\n bestSplitIndex = splitIndex;\n }\n }\n\n // Create final split\n const leftIndices = sortedIndices.slice(0, bestSplitIndex).map((item) => item.index);\n const rightIndices = sortedIndices.slice(bestSplitIndex).map((item) => item.index);\n\n const leftMembers = new Set<NodeId>();\n const rightMembers = new Set<NodeId>();\n\n for (const idx of leftIndices) {\n const nodeId = members[idx];\n if (nodeId !== undefined) {\n leftMembers.add(nodeId);\n }\n }\n\n for (const idx of rightIndices) {\n const nodeId = members[idx];\n if (nodeId !== undefined) {\n rightMembers.add(nodeId);\n }\n }\n\n // Identify key nodes (those with extreme spectral values)\n const extremeThreshold = 0.1;\n const sortedValues = [...eigenvector].sort((a, b) => Math.abs(b) - Math.abs(a));\n const threshold = sortedValues[Math.floor(sortedValues.length * extremeThreshold)] ?? 0;\n\n const keyNodes: NodeId[] = [];\n for (let i = 0; i < eigenvector.length; i++) {\n const eigenValue = eigenvector[i];\n if (eigenValue !== undefined && Math.abs(eigenValue) >= Math.abs(threshold)) {\n const nodeId = members[i];\n if (nodeId !== undefined) {\n keyNodes.push(nodeId);\n }\n }\n }\n\n // Calculate spectral score (based on eigenvalue gap)\n const firstValue = sortedValues[0] ?? 0;\n const lastValue = sortedValues[sortedValues.length - 1] ?? 0;\n const spectralScore = Math.abs(firstValue - lastValue);\n\n // Generate explanation\n const reason = `Spectral bisection based on Fiedler vector with modularity ${bestModularity.toFixed(3)}. Split creates clusters of sizes ${String(leftMembers.size)} and ${String(rightMembers.size)}.`;\n\n return {\n leftMembers,\n rightMembers,\n spectralScore,\n keyNodes: keyNodes.slice(0, 5), // Top 5 key nodes\n spectralValues: eigenvector,\n reason,\n };\n}\n\n/**\n * Create Laplacian matrix for a subgraph\n * @param graph - The input graph\n * @param nodes - The nodes to include in the subgraph\n * @returns The Laplacian matrix as a 2D array\n */\nfunction createLaplacianMatrix(graph: Graph, nodes: NodeId[]): number[][] {\n const n = nodes.length;\n const nodeIndex = new Map<NodeId, number>();\n\n // Create node index mapping\n for (let i = 0; i < n; i++) {\n const node = nodes[i];\n if (node !== undefined) {\n nodeIndex.set(node, i);\n }\n }\n\n // Initialize Laplacian matrix\n const laplacian = Array.from({ length: n }, () => new Array<number>(n).fill(0));\n\n // Fill adjacency part and calculate degrees\n const degrees = new Array<number>(n).fill(0);\n\n for (let i = 0; i < n; i++) {\n const nodeId = nodes[i];\n if (nodeId === undefined) {\n continue;\n }\n\n for (const neighbor of graph.neighbors(nodeId)) {\n const neighborIdx = nodeIndex.get(neighbor);\n if (neighborIdx !== undefined && i < laplacian.length && i < degrees.length) {\n const row = laplacian[i];\n if (row) {\n row[neighborIdx] = -1;\n degrees[i] = (degrees[i] ?? 0) + 1;\n }\n }\n }\n }\n\n // Set diagonal (degree) values\n for (let i = 0; i < n; i++) {\n const row = laplacian[i];\n const degree = degrees[i];\n if (row && degree !== undefined) {\n row[i] = degree;\n }\n }\n\n return laplacian;\n}\n\n/**\n * Compute the Fiedler vector (second smallest eigenvector) using power iteration\n * @param laplacian - The Laplacian matrix\n * @param tolerance - Convergence tolerance\n * @param maxIterations - Maximum number of iterations\n * @returns The Fiedler vector, or null if computation failed\n */\nfunction computeFiedlerVector(laplacian: number[][], tolerance: number, maxIterations: number): number[] | null {\n const n = laplacian.length;\n if (n < 2) {\n return null;\n }\n\n // Initialize random vector orthogonal to the all-ones vector\n let vector = new Array<number>(n).fill(0);\n for (let i = 0; i < n; i++) {\n vector[i] = Math.random() - 0.5;\n }\n\n // Make orthogonal to all-ones vector\n const mean = vector.reduce((sum: number, val: number) => sum + val, 0) / n;\n for (let i = 0; i < n; i++) {\n const val = vector[i];\n if (val !== undefined) {\n vector[i] = val - mean;\n }\n }\n\n // Normalize\n const norm = Math.sqrt(vector.reduce((sum: number, val: number) => sum + val * val, 0));\n if (norm > 0) {\n for (let i = 0; i < n; i++) {\n const val = vector[i];\n if (val !== undefined) {\n vector[i] = val / norm;\n }\n }\n }\n\n // Power iteration with deflation for second smallest eigenvalue\n for (let iter = 0; iter < maxIterations; iter++) {\n const newVector = new Array<number>(n).fill(0);\n\n // Matrix-vector multiplication: newVector = L * vector\n for (let i = 0; i < n; i++) {\n let sum = 0;\n const row = laplacian[i];\n if (row) {\n for (let j = 0; j < n; j++) {\n const matrixVal = row[j];\n const vectorVal = vector[j];\n if (matrixVal !== undefined && vectorVal !== undefined) {\n sum += matrixVal * vectorVal;\n }\n }\n }\n\n newVector[i] = sum;\n }\n\n // For smallest eigenvalue, we actually want inverse iteration\n // This is simplified - in practice would solve (L - shift*I)x = vector\n // For now, use power iteration on -L (approximately)\n for (let i = 0; i < n; i++) {\n const val = newVector[i];\n if (val !== undefined) {\n newVector[i] = -val;\n }\n }\n\n // Orthogonalize against all-ones vector\n const newMean = newVector.reduce((sum, val) => sum + val, 0) / n;\n for (let i = 0; i < n; i++) {\n const val = newVector[i];\n if (val !== undefined) {\n newVector[i] = val - newMean;\n }\n }\n\n // Normalize\n const newNorm = Math.sqrt(newVector.reduce((sum, val) => sum + val * val, 0));\n if (newNorm < tolerance) {\n break; // Converged to zero vector\n }\n\n for (let i = 0; i < n; i++) {\n const val = newVector[i];\n if (val !== undefined) {\n newVector[i] = val / newNorm;\n }\n }\n\n // Check convergence\n let diff = 0;\n for (let i = 0; i < n; i++) {\n const newVal = newVector[i];\n const oldVal = vector[i];\n if (newVal !== undefined && oldVal !== undefined) {\n diff += Math.abs(newVal - oldVal);\n }\n }\n\n vector = newVector;\n\n if (diff < tolerance) {\n break;\n }\n }\n\n return vector;\n}\n\n/**\n * Calculate modularity of a graph partitioning\n * @param graph - The input graph\n * @param assignment - Map from node ID to community ID\n * @returns The modularity score\n */\nfunction calculateModularity(graph: Graph, assignment: Map<NodeId, number>): number {\n const totalEdges = graph.uniqueEdgeCount;\n if (totalEdges === 0) {\n return 0;\n }\n\n let modularity = 0;\n const communities = new Map<number, Set<NodeId>>();\n\n // Group nodes by community\n for (const [nodeId, communityId] of assignment) {\n if (!communities.has(communityId)) {\n communities.set(communityId, new Set());\n }\n\n const community = communities.get(communityId);\n if (community) {\n community.add(nodeId);\n }\n }\n\n // Calculate modularity for each community\n for (const [, members] of communities) {\n let internalEdges = 0;\n let totalDegree = 0;\n\n for (const nodeId of members) {\n const nodeDegree = graph.degree(nodeId);\n totalDegree += nodeDegree;\n\n // Count internal edges\n for (const neighbor of graph.neighbors(nodeId)) {\n if (members.has(neighbor)) {\n internalEdges++;\n }\n }\n }\n\n // Each edge is counted twice in undirected graphs\n internalEdges /= 2;\n\n // Modularity contribution for this community\n const expectedEdges = (totalDegree * totalDegree) / (4 * totalEdges);\n modularity += (internalEdges - expectedEdges) / totalEdges;\n }\n\n return modularity;\n}\n","const INVALID_INDEX = 4294967295;\nconst MAX_COUNT = 4294967294;\nconst FORMAT_VERSION = 1;\nconst SNAPSHOT_BRAND = /* @__PURE__ */ Symbol.for(\"@graphty/graph-format/snapshot\");\nconst ALIGNMENT = 256;\nconst IS_LITTLE_ENDIAN = new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\nconst WIRE_MAJOR = 1;\nconst WIRE_MINOR = 0;\nconst WIRE_FORMAT = \"graphty-snapshot\";\nconst CONTAINER_MAGIC = [71, 83, 78, 80];\nconst ENDIAN_PROBE = 16909060;\nconst EMPTY_DETAILS = Object.freeze({});\nclass GraphFormatError extends Error {\n /**\n * Create a GraphFormatError.\n * @param code - the stable error code the caller can branch on\n * @param message - a plain-ASCII human-readable message naming the offending index, id or value\n * @param details - optional machine-readable context; copied shallowly and frozen\n */\n constructor(code, message, details) {\n super(message);\n this.name = \"GraphFormatError\";\n this.code = code;\n this.details = details === void 0 ? EMPTY_DETAILS : Object.freeze({ ...details });\n }\n}\nconst HOLDERS = /* @__PURE__ */ new WeakMap();\nfunction claimHolder(target) {\n HOLDERS.set(target, (HOLDERS.get(target) ?? 0) + 1);\n}\nfunction noteShared(target) {\n HOLDERS.set(target, Math.max(HOLDERS.get(target) ?? 0, 1) + 1);\n}\nfunction holderCount(target) {\n return HOLDERS.get(target) ?? 0;\n}\nfunction isShared(target) {\n return (HOLDERS.get(target) ?? 0) > 1;\n}\nconst ASCII_FAST_PATH_MAX_BYTES = 32;\nlet sharedDecoder = null;\nlet fatalDecoder$1 = null;\nfunction replacingDecoder() {\n sharedDecoder ??= new TextDecoder(\"utf-8\", { ignoreBOM: true });\n return sharedDecoder;\n}\nfunction strictDecoder() {\n fatalDecoder$1 ??= new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true });\n return fatalDecoder$1;\n}\nfunction utf8ByteLength(s) {\n let bytes = 0;\n const n = s.length;\n for (let i = 0; i < n; i++) {\n const c = s.charCodeAt(i);\n if (c < 128) {\n bytes += 1;\n } else if (c < 2048) {\n bytes += 2;\n } else if (c >= 55296 && c <= 56319 && i + 1 < n) {\n const d = s.charCodeAt(i + 1);\n if (d >= 56320 && d <= 57343) {\n bytes += 4;\n i++;\n } else {\n bytes += 3;\n }\n } else {\n bytes += 3;\n }\n }\n return bytes;\n}\nfunction encodeUtf8Into(s, out, position) {\n let p = position;\n const n = s.length;\n for (let i = 0; i < n; i++) {\n let c = s.charCodeAt(i);\n if (c < 128) {\n out[p++] = c;\n continue;\n }\n if (c < 2048) {\n out[p++] = 192 | c >> 6;\n out[p++] = 128 | c & 63;\n continue;\n }\n if (c >= 55296 && c <= 57343) {\n if (c <= 56319 && i + 1 < n) {\n const d = s.charCodeAt(i + 1);\n if (d >= 56320 && d <= 57343) {\n c = 65536 + (c - 55296 << 10) + (d - 56320);\n i++;\n out[p++] = 240 | c >> 18;\n out[p++] = 128 | c >> 12 & 63;\n out[p++] = 128 | c >> 6 & 63;\n out[p++] = 128 | c & 63;\n continue;\n }\n }\n c = 65533;\n }\n out[p++] = 224 | c >> 12;\n out[p++] = 128 | c >> 6 & 63;\n out[p++] = 128 | c & 63;\n }\n return p;\n}\nconst SLICED_STRING_MIN_LENGTH = 13;\nfunction detachString(s) {\n return s.length < SLICED_STRING_MIN_LENGTH ? s : ` ${s}`.slice(1);\n}\nfunction hasLoneSurrogate(s) {\n const n = s.length;\n for (let i = 0; i < n; i++) {\n const c = s.charCodeAt(i);\n if (c < 55296 || c > 57343) {\n continue;\n }\n if (c > 56319) {\n return true;\n }\n if (i + 1 >= n) {\n return true;\n }\n const d = s.charCodeAt(i + 1);\n if (d < 56320 || d > 57343) {\n return true;\n }\n i++;\n }\n return false;\n}\nfunction decodeUtf8Row(utf8, start, end) {\n const len = end - start;\n if (len === 0) {\n return \"\";\n }\n if (len <= ASCII_FAST_PATH_MAX_BYTES) {\n let s = \"\";\n let i = start;\n for (; i < end; i++) {\n const b = utf8[i];\n if (b >= 128) {\n break;\n }\n s += String.fromCharCode(b);\n }\n if (i === end) {\n return s;\n }\n }\n return replacingDecoder().decode(utf8.subarray(start, end));\n}\nfunction isAsciiRange(utf8, start, end) {\n for (let i = start; i < end; i++) {\n if (utf8[i] >= 128) {\n return false;\n }\n }\n return true;\n}\nfunction decodeUtf8Rows(utf8, offsets, from, to) {\n const out = new Array(to - from);\n if (to <= from) {\n return out;\n }\n const base = offsets[from];\n const end = offsets[to];\n if (isAsciiRange(utf8, base, end)) {\n const whole = replacingDecoder().decode(utf8.subarray(base, end));\n for (let i = from; i < to; i++) {\n out[i - from] = whole.substring(offsets[i] - base, offsets[i + 1] - base);\n }\n return out;\n }\n for (let i = from; i < to; i++) {\n out[i - from] = decodeUtf8Row(utf8, offsets[i], offsets[i + 1]);\n }\n return out;\n}\nfunction isWellFormedUtf8Row(utf8, start, end) {\n let ascii = true;\n for (let i = start; i < end; i++) {\n if (utf8[i] >= 128) {\n ascii = false;\n break;\n }\n }\n if (ascii) {\n return true;\n }\n try {\n strictDecoder().decode(utf8.subarray(start, end));\n return true;\n } catch {\n return false;\n }\n}\nfunction encodeUtf8Rows(source, length) {\n const offsets = new Uint32Array(length + 1);\n let total = 0;\n for (let i = 0; i < length; i++) {\n const v = source[i];\n if (typeof v === \"string\") {\n total += utf8ByteLength(v);\n }\n offsets[i + 1] = total;\n }\n const utf8 = new Uint8Array(total);\n let p = 0;\n for (let i = 0; i < length; i++) {\n const v = source[i];\n if (typeof v === \"string\") {\n p = encodeUtf8Into(v, utf8, p);\n }\n }\n return { offsets, utf8 };\n}\nfunction checkUtf8Layout(offsets, utf8, rows, ref) {\n if (offsets.length !== rows + 1) {\n throw new GraphFormatError(\n \"E_BAD_SERIALIZATION\",\n `${ref}: expected ${rows + 1} offsets, found ${offsets.length}`,\n { ref, reason: \"offsets length\", expected: rows + 1, found: offsets.length }\n );\n }\n let previous = offsets[0];\n for (let i = 1; i <= rows; i++) {\n const current = offsets[i];\n if (current < previous) {\n throw new GraphFormatError(\"E_BAD_SERIALIZATION\", `${ref}: offsets decrease at row ${i - 1}`, {\n ref,\n reason: \"offsets not monotonic\",\n row: i - 1\n });\n }\n previous = current;\n }\n if (previous > utf8.length) {\n throw new GraphFormatError(\n \"E_BAD_SERIALIZATION\",\n `${ref}: offsets end at ${previous} but the byte store has ${utf8.length} bytes`,\n { ref, reason: \"offsets exceed utf8\", end: previous, byteLength: utf8.length }\n );\n }\n}\nclass Utf8Store {\n /**\n * Construct a store; use the static factories. At least one representation is always given.\n * @param length - the row count\n * @param source - the decoded rows or null\n * @param encoded - the offsets and bytes or null\n */\n constructor(length, source, encoded) {\n this.length = length;\n this.source = source;\n this.cache = null;\n this.encodedArrays = encoded;\n }\n /**\n * A store over decoded strings, shared by reference: the builder-side representation. Encoding\n * happens on the first read of `offsets` / `utf8`.\n * @param source - the rows; only entries below `length` are ever read, so a builder array that\n * keeps growing can be shared (design section 4.2)\n * @param length - the row count; default source.length\n * @returns the store\n */\n static fromStrings(source, length = source.length) {\n return new Utf8Store(length, source, null);\n }\n /**\n * A store over an encoded Utf8 layout, adopted by reference: the wire-side representation.\n * Decoding happens per row on `at()` and in bulk on `slice()` / `decodeAll()`. The layout is not\n * checked here; `checkUtf8Layout` does that for untrusted input.\n * @param offsets - rows + 1 non-decreasing offsets\n * @param utf8 - the concatenated bytes\n * @returns the store\n */\n static fromEncoded(offsets, utf8) {\n return new Utf8Store(Math.max(0, offsets.length - 1), null, { offsets, utf8 });\n }\n /**\n * Whether the encoded representation exists (adopted or already materialised).\n * @returns true when `offsets` / `utf8` can be read without encoding\n */\n get encoded() {\n return this.encodedArrays !== null;\n }\n /**\n * Whether the store is backed by a decoded source array, so `at()` never decodes.\n * @returns true for a store built from strings\n */\n get decoded() {\n return this.source !== null;\n }\n /**\n * Whether the encoded arrays were transferred away while rows still depend on them (design\n * section 9.1): a transferred buffer leaves zero-length views.\n * @returns true when detached\n */\n get detached() {\n return this.source === null && this.length > 0 && this.encodedArrays !== null && this.encodedArrays.offsets.length === 0;\n }\n /**\n * The `length + 1` offsets, encoding the source on first access.\n * @returns the offsets array (cached)\n */\n get offsets() {\n return this.ensureEncoded().offsets;\n }\n /**\n * The concatenated UTF-8 bytes, encoding the source on first access.\n * @returns the byte array (cached)\n */\n get utf8() {\n return this.ensureEncoded().utf8;\n }\n /**\n * The string of one row, decoded on first access and cached per row.\n * @param row - the row index\n * @returns the string; E_INDEX_RANGE when row is out of range\n */\n at(row) {\n if (!(row >= 0 && row < this.length) || !Number.isInteger(row)) {\n throw new GraphFormatError(\"E_INDEX_RANGE\", `row ${row} out of range (length ${this.length})`, {\n index: row,\n size: this.length\n });\n }\n if (this.source !== null) {\n return this.source[row];\n }\n this.cache ??= new Array(this.length);\n const cached = this.cache[row];\n if (cached !== void 0) {\n return cached;\n }\n const { offsets, utf8 } = this.ensureEncoded();\n const value = decodeUtf8Row(utf8, offsets[row], offsets[row + 1]);\n this.cache[row] = value;\n return value;\n }\n /**\n * The strings of a row range decoded in one pass (one TextDecoder call for an all-ASCII range);\n * nothing is cached. Bounds follow Array.prototype.slice (negative values count from the end,\n * out-of-range values are clamped).\n * @param start - first row (default 0)\n * @param end - one past the last row (default length)\n * @returns a fresh array of the rows in order\n */\n slice(start = 0, end = this.length) {\n const [from, to] = resolveRange(start, end, this.length);\n const { source } = this;\n if (source !== null) {\n const out = new Array(to - from);\n for (let i = from; i < to; i++) {\n out[i - from] = source[i];\n }\n return out;\n }\n const { offsets, utf8 } = this.ensureEncoded();\n return decodeUtf8Rows(utf8, offsets, from, to);\n }\n /**\n * Every row decoded in one pass; not cached.\n * @returns a fresh array of all rows\n */\n decodeAll() {\n return this.slice(0, this.length);\n }\n /**\n * Decode every row of an encoded store once, in bulk, and keep the result as the decoded\n * representation so that later `at()` calls are O(1) without a per-row decode. For a store that\n * already has its decoded rows this is a no-op. Used before a pass that will touch every row\n * anyway (building the reverse map of a wire-decoded id map).\n */\n materialiseDecoded() {\n if (this.source === null) {\n this.source = this.decodeAll();\n this.cache = null;\n }\n }\n /**\n * Bytes of typed storage: the offsets and utf8 arrays when they exist, 0 for a store that has not\n * been encoded yet. JS strings are never counted.\n * @returns the byte count\n */\n byteLength() {\n const enc = this.encodedArrays;\n return enc === null ? 0 : enc.offsets.byteLength + enc.utf8.byteLength;\n }\n /**\n * The first row whose bytes are not well-formed UTF-8, for full validation of untrusted input\n * (design section 9.5: string ids are decoded with a fatal decoder). A source-backed store is\n * always well-formed.\n * @returns the row index, or -1 when every row is well-formed\n */\n firstMalformedRow() {\n const enc = this.encodedArrays;\n if (this.source !== null || enc === null) {\n return -1;\n }\n const { offsets, utf8 } = enc;\n for (let i = 0; i < this.length; i++) {\n if (!isWellFormedUtf8Row(utf8, offsets[i], offsets[i + 1])) {\n return i;\n }\n }\n return -1;\n }\n /**\n * The encoded representation, encoding the source once on first use. A store always has a source\n * when it has no encoded arrays (the private constructor is only reached through the factories).\n * @returns the offsets and bytes\n */\n ensureEncoded() {\n let enc = this.encodedArrays;\n if (enc === null) {\n enc = encodeUtf8Rows(this.source, this.length);\n this.encodedArrays = enc;\n claimHolder(enc.offsets.buffer);\n claimHolder(enc.utf8.buffer);\n }\n return enc;\n }\n}\nfunction resolveRange(start, end, length) {\n let from = Math.trunc(start);\n let to = Math.trunc(end);\n if (Number.isNaN(from)) {\n from = 0;\n }\n if (Number.isNaN(to)) {\n to = 0;\n }\n from = from < 0 ? Math.max(length + from, 0) : Math.min(from, length);\n to = to < 0 ? Math.max(length + to, 0) : Math.min(to, length);\n return [from, Math.max(from, to)];\n}\nfunction detectResizableArrayBuffer() {\n try {\n const probe = new ArrayBuffer(0, { maxByteLength: 64 });\n if (!probe.resizable || typeof probe.resize !== \"function\") {\n return false;\n }\n probe.resize(64);\n return probe.byteLength === 64 && probe.maxByteLength === 64;\n } catch {\n return false;\n }\n}\nconst HAS_RESIZABLE_ARRAY_BUFFER = detectResizableArrayBuffer();\nconst STAGING_ELEMENT_GRANULE = 16;\nconst STAGING_BYTE_GRANULE = 64;\nconst STAGING_RESERVE_BYTES = 256 * 1024 * 1024;\nfunction roundUp(value, multiple) {\n const remainder = value % multiple;\n return remainder === 0 ? value : value + multiple - remainder;\n}\nfunction padTo4(byteLength) {\n return roundUp(byteLength, 4);\n}\nfunction paddedWordCount(byteLength) {\n return Math.ceil(byteLength / 4);\n}\nfunction alignUp(byteOffset, alignment = ALIGNMENT) {\n return roundUp(byteOffset, alignment);\n}\nfunction layoutSegments(byteLengths, alignment = ALIGNMENT) {\n const offsets = [];\n const ends = [];\n let cursor = 0;\n let padding = 0;\n for (const byteLength of byteLengths) {\n if (byteLength === 0) {\n offsets.push(null);\n ends.push(null);\n continue;\n }\n const offset = alignUp(cursor, alignment);\n padding += offset - cursor;\n offsets.push(offset);\n cursor = offset + byteLength;\n ends.push(cursor);\n }\n return { offsets, ends, byteLength: cursor, padding };\n}\nfunction isFourByteAligned(view) {\n return view.byteOffset % 4 === 0 && view.byteLength % 4 === 0;\n}\nfunction isOverPlainBuffer(view) {\n const { buffer } = view;\n return buffer instanceof ArrayBuffer && !buffer.resizable;\n}\nfunction canViewAsPaddedU32(data) {\n return data.byteOffset % 4 === 0 && data.byteOffset + padTo4(data.byteLength) <= data.buffer.byteLength;\n}\nfunction paddedU32View(data) {\n if (!canViewAsPaddedU32(data)) {\n throw new GraphFormatError(\n \"E_COLUMN_ALIGNMENT\",\n `u8 array at byteOffset ${data.byteOffset} with byteLength ${data.byteLength} has no zero-copy padded u32 view`,\n { byteOffset: data.byteOffset, byteLength: data.byteLength, bufferByteLength: data.buffer.byteLength }\n );\n }\n return new Uint32Array(data.buffer, data.byteOffset, paddedWordCount(data.byteLength));\n}\nfunction copyToPaddedStore(data) {\n const store = new Uint8Array(new ArrayBuffer(padTo4(data.byteLength)), 0, data.byteLength);\n store.set(data);\n return store;\n}\nfunction unsupportedDtype$1(dtype) {\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unsupported dtype ${String(dtype)}`, { dtype });\n}\nfunction growCapacity(current, needed) {\n return roundUp(Math.max(needed, current * 2, STAGING_ELEMENT_GRANULE), STAGING_ELEMENT_GRANULE);\n}\nfunction stagingByteLength(capacity, bytesPerElement) {\n return roundUp(capacity * bytesPerElement, STAGING_BYTE_GRANULE);\n}\nfunction allocateStagingBuffer(byteLength, resizable = HAS_RESIZABLE_ARRAY_BUFFER, reserveBytes = STAGING_RESERVE_BYTES) {\n if (!resizable) {\n return new ArrayBuffer(byteLength);\n }\n const maxByteLength = Math.max(byteLength, reserveBytes);\n try {\n return new ArrayBuffer(byteLength, { maxByteLength });\n } catch (err) {\n if (err instanceof RangeError && maxByteLength > byteLength) {\n return new ArrayBuffer(byteLength, { maxByteLength: byteLength });\n }\n throw err;\n }\n}\nfunction growTypedArray(array, ctor, minLength, resizable = HAS_RESIZABLE_ARRAY_BUFFER) {\n if (minLength <= array.length) {\n return array;\n }\n const bytesPerElement = ctor.BYTES_PER_ELEMENT;\n const byteLength = stagingByteLength(growCapacity(array.length, minLength), bytesPerElement);\n const capacity = byteLength / bytesPerElement;\n const { buffer } = array;\n if (buffer.resizable && array.byteOffset === 0 && byteLength <= buffer.maxByteLength) {\n buffer.resize(byteLength);\n return new ctor(buffer, 0, capacity);\n }\n const reserve = Math.max(buffer.maxByteLength * 2, STAGING_RESERVE_BYTES);\n const next = new ctor(allocateStagingBuffer(byteLength, resizable, reserve), 0, capacity);\n next.set(array);\n return next;\n}\nconst ALL_ONES$1 = 4294967295;\nfunction bitmapWordCount(bits) {\n return Math.ceil(bits / 32);\n}\nfunction lastWordMask(bits) {\n const remainder = bits % 32;\n return remainder === 0 ? ALL_ONES$1 : ALL_ONES$1 >>> 32 - remainder;\n}\nfunction bitmapClearTrailing(words, bits) {\n const wordCount = bitmapWordCount(bits);\n if (wordCount > 0 && wordCount <= words.length && bits % 32 !== 0) {\n words[wordCount - 1] &= lastWordMask(bits);\n }\n if (wordCount < words.length) {\n words.fill(0, wordCount);\n }\n}\nfunction makeBitmap(bits, fill = false) {\n const words = new Uint32Array(bitmapWordCount(bits));\n if (fill) {\n words.fill(ALL_ONES$1);\n bitmapClearTrailing(words, bits);\n }\n return words;\n}\nfunction bitmapGet(words, i) {\n return (words[i >>> 5] >>> (i & 31) & 1) === 1;\n}\nfunction bitmapSet(words, i) {\n words[i >>> 5] |= 1 << (i & 31);\n}\nfunction bitmapClear(words, i) {\n words[i >>> 5] &= ~(1 << (i & 31));\n}\nfunction bitmapWrite(words, i, value) {\n if (value) {\n bitmapSet(words, i);\n } else {\n bitmapClear(words, i);\n }\n}\nfunction popcount32(word) {\n let w = word - (word >>> 1 & 1431655765);\n w = (w & 858993459) + (w >>> 2 & 858993459);\n w = w + (w >>> 4) & 252645135;\n return Math.imul(w, 16843009) >>> 24;\n}\nfunction bitmapCount(words, bits) {\n const fullWords = Math.floor(bits / 32);\n let count = 0;\n for (let k = 0; k < fullWords; k++) {\n count += popcount32(words[k]);\n }\n if (bits % 32 !== 0) {\n count += popcount32(words[fullWords] & lastWordMask(bits));\n }\n return count;\n}\nfunction bitmapToIndices(words, bits) {\n const out = new Uint32Array(bitmapCount(words, bits));\n let n = 0;\n for (let i = 0; i < bits; i++) {\n if ((words[i >>> 5] >>> (i & 31) & 1) === 1) {\n out[n++] = i;\n }\n }\n return out;\n}\nfunction bitmapSlice(words, start, end) {\n const bits = Math.max(0, end - start);\n const out = makeBitmap(bits);\n if (bits === 0) {\n return out;\n }\n const firstWord = start >>> 5;\n const shift = start & 31;\n if (shift === 0) {\n out.set(words.subarray(firstWord, firstWord + out.length));\n } else {\n const upper = 32 - shift;\n for (let j = 0; j < out.length; j++) {\n const k = firstWord + j;\n const lo = k < words.length ? words[k] >>> shift : 0;\n const hi = k + 1 < words.length ? words[k + 1] << upper : 0;\n out[j] = lo | hi;\n }\n }\n bitmapClearTrailing(out, bits);\n return out;\n}\nfunction assertWellFormedString(value, details) {\n if (hasLoneSurrogate(value)) {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", \"string value contains a lone surrogate\", {\n ...details,\n reason: \"lone surrogate\"\n });\n }\n}\nfunction buildCodeMap(dictionary) {\n const map = /* @__PURE__ */ new Map();\n for (let i = 0; i < dictionary.length; i++) {\n const value = dictionary[i];\n if (!map.has(value)) {\n map.set(value, i);\n }\n }\n return map;\n}\nclass DictionaryBuilder {\n /**\n * Create a dictionary, optionally seeded with declared options (GEXF `<options>`) in order.\n * @param initial - the initial members in code order; duplicates keep their first code\n */\n constructor(initial) {\n this.values = [];\n this.codes = /* @__PURE__ */ new Map();\n if (initial !== void 0) {\n for (const value of initial) {\n this.intern(value);\n }\n }\n }\n /**\n * Number of distinct values interned so far.\n * @returns the dictionary size\n */\n get size() {\n return this.values.length;\n }\n /**\n * The code of a value, appending it when unseen.\n * @param value - the string to intern; E_COLUMN_TYPE when it holds a lone surrogate\n * @returns the dense code of the value\n */\n intern(value) {\n const existing = this.codes.get(value);\n if (existing !== void 0) {\n return existing;\n }\n assertWellFormedString(value);\n const code = this.values.length;\n const owned = detachString(value);\n this.values.push(owned);\n this.codes.set(owned, code);\n return code;\n }\n /**\n * The code of a value without interning it.\n * @param value - the string to look up\n * @returns its code, or INVALID_INDEX when absent\n */\n codeOf(value) {\n const code = this.codes.get(value);\n return code === void 0 ? INVALID_INDEX : code;\n }\n /**\n * Whether a value has been interned.\n * @param value - the string to test\n * @returns true when present\n */\n has(value) {\n return this.codes.has(value);\n }\n}\nconst WIDENING_ORDER = [\"bool\", \"i32\", \"f64\", \"string\", \"json\"];\nconst I32_TEXT = /^-?(0|[1-9][0-9]*)$/;\nconst F64_TEXT = /^[+-]?((0|[1-9][0-9]*)(\\.[0-9]*)?|\\.[0-9]+)([eE][+-]?[0-9]+)?$/;\nconst I32_MIN$1 = -2147483648;\nconst I32_MAX$1 = 2147483647;\nfunction wideningRank(dtype) {\n return WIDENING_ORDER.indexOf(dtype);\n}\nfunction widenDtype(current, observed) {\n if (current === null) {\n return observed;\n }\n if (observed === null) {\n return current;\n }\n return wideningRank(observed) > wideningRank(current) ? observed : current;\n}\nfunction inferTextDtype(text) {\n if (text === \"true\" || text === \"false\") {\n return \"bool\";\n }\n if (I32_TEXT.test(text)) {\n const n = Number(text);\n if (n >= I32_MIN$1 && n <= I32_MAX$1) {\n return \"i32\";\n }\n return Number.isFinite(n) ? \"f64\" : \"string\";\n }\n if (F64_TEXT.test(text) && Number.isFinite(Number(text))) {\n return \"f64\";\n }\n return \"string\";\n}\nfunction inferValueDtype(value) {\n if (value === void 0 || value === null) {\n return null;\n }\n switch (typeof value) {\n case \"boolean\":\n return \"bool\";\n case \"number\":\n return Number.isInteger(value) && value >= I32_MIN$1 && value <= I32_MAX$1 ? \"i32\" : \"f64\";\n case \"string\":\n return \"string\";\n case \"object\":\n return \"json\";\n default:\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `a ${typeof value} value cannot be stored in a column`, {\n reason: \"unsupported value type\",\n found: typeof value\n });\n }\n}\nfunction coerceValue(value, dtype) {\n switch (dtype) {\n case \"bool\":\n if (typeof value === \"boolean\") {\n return value;\n }\n break;\n case \"i32\":\n case \"f64\":\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"boolean\") {\n return value ? 1 : 0;\n }\n break;\n case \"string\":\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n break;\n case \"json\":\n return value;\n default: {\n const name = dtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${name}`, { dtype: name });\n }\n }\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `a ${typeof value} value cannot be stored in a ${dtype} column`, {\n dtype,\n found: typeof value\n });\n}\nfunction inferValuesDtype(values) {\n let dtype = null;\n for (const value of values) {\n dtype = widenDtype(dtype, inferValueDtype(value));\n if (dtype === \"json\") {\n break;\n }\n }\n return dtype;\n}\nclass DtypeInferrer {\n constructor() {\n this.current = null;\n }\n /**\n * The column's dtype so far.\n * @returns the widened dtype, or null until a set cell has been observed\n */\n get dtype() {\n return this.current;\n }\n /**\n * Observe a JS value.\n * @param value - the cell value; undefined and null are unset and never widen\n * @returns true when the column's dtype changed\n */\n observeValue(value) {\n return this.apply(inferValueDtype(value));\n }\n /**\n * Observe a text cell. Part of the reference text grammar of design section 5.1 (see\n * inferTextDtype).\n * @public\n * @param text - the cell text\n * @returns true when the column's dtype changed\n */\n observeText(text) {\n return this.apply(inferTextDtype(text));\n }\n /**\n * Force the dtype to at least the given one (a declared lower bound, or the dtype of a column\n * being merged in).\n * @param dtype - the dtype to widen to\n * @returns true when the column's dtype changed\n */\n widenTo(dtype) {\n return this.apply(dtype);\n }\n apply(observed) {\n const next = widenDtype(this.current, observed);\n if (next === this.current) {\n return false;\n }\n this.current = next;\n return true;\n }\n}\nconst ALL_DTYPES = /* @__PURE__ */ new Set([\n \"f32\",\n \"f64\",\n \"i32\",\n \"u32\",\n \"u8\",\n \"bool\",\n \"dict\",\n \"string\",\n \"list\",\n \"json\"\n]);\nconst NUMERIC_DTYPES = /* @__PURE__ */ new Set([\"f32\", \"f64\", \"i32\", \"u32\", \"u8\"]);\nconst MAX_COMPONENTS = 16;\nconst MAX_JSON_DEPTH$1 = 256;\nconst I32_MIN = -2147483648;\nconst I32_MAX = 2147483647;\nconst U32_MAX = 4294967295;\nconst U8_MAX = 255;\nconst decoder = new TextDecoder();\nconst f32Cache = /* @__PURE__ */ new WeakMap();\nfunction allocU8(length) {\n return new Uint8Array(new ArrayBuffer(padTo4(length)), 0, length);\n}\nfunction gpuEligibility(dtype) {\n switch (dtype) {\n case \"f32\":\n case \"i32\":\n case \"u32\":\n case \"dict\":\n return \"direct\";\n case \"u8\":\n case \"bool\":\n return \"packed\";\n case \"f64\":\n return \"convert\";\n case \"string\":\n case \"list\":\n case \"json\":\n return \"none\";\n default: {\n const name = dtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${name}`, { dtype: name });\n }\n }\n}\nfunction isScalarDtype(value) {\n return value !== \"list\" && ALL_DTYPES.has(value);\n}\nfunction isPlainObject(value) {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\nfunction assertJsonValue(value, field, depth = 0) {\n if (value === null || typeof value === \"boolean\" || typeof value === \"number\") {\n return;\n }\n if (typeof value === \"string\") {\n assertWellFormedString(value, { field });\n return;\n }\n if (depth > MAX_JSON_DEPTH$1) {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `${field} is nested deeper than ${MAX_JSON_DEPTH$1} levels`, {\n field,\n reason: \"nesting\"\n });\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n assertJsonValue(item, field, depth + 1);\n }\n return;\n }\n if (isPlainObject(value)) {\n for (const key of Object.keys(value)) {\n assertJsonValue(value[key], field, depth + 1);\n }\n return;\n }\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `${field} is not a JSON value`, {\n field,\n found: value === void 0 ? \"undefined\" : typeof value\n });\n}\nfunction cloneJson(value) {\n if (Array.isArray(value)) {\n return value.map((item) => cloneJson(item));\n }\n if (isPlainObject(value)) {\n const out = {};\n for (const key of Object.keys(value)) {\n out[key] = cloneJson(value[key]);\n }\n return out;\n }\n return value;\n}\nfunction representableNumber(dtype, value) {\n switch (dtype) {\n case \"f32\":\n case \"f64\":\n return true;\n case \"i32\":\n return Number.isInteger(value) && value >= I32_MIN && value <= I32_MAX;\n case \"u32\":\n return Number.isInteger(value) && value >= 0 && value <= U32_MAX;\n case \"u8\":\n return Number.isInteger(value) && value >= 0 && value <= U8_MAX;\n default: {\n const name = dtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${name}`, { dtype: name });\n }\n }\n}\nfunction numericDefaultFill(dtype, components, value) {\n if (typeof value === \"number\") {\n return representableNumber(dtype, value) ? value : null;\n }\n if (components > 1 && Array.isArray(value) && value.length === components) {\n const first = value[0];\n if (typeof first !== \"number\" || !representableNumber(dtype, first)) {\n return null;\n }\n for (let k = 1; k < components; k++) {\n if (!Object.is(value[k], first)) {\n return null;\n }\n }\n return first;\n }\n return null;\n}\nfunction typeError(field, message, extra) {\n return new GraphFormatError(\"E_COLUMN_TYPE\", message, { ...extra, field });\n}\nfunction resolveOrigin(origin) {\n if (origin === void 0) {\n return null;\n }\n if (!isPlainObject(origin)) {\n throw typeError(\"origin\", \"origin must be a plain object\");\n }\n const pick = (key) => {\n const value = origin[key];\n if (value === void 0 || value === null) {\n return null;\n }\n if (typeof value !== \"string\") {\n throw typeError(\"origin\", `origin.${key} must be a string or null`, { found: typeof value });\n }\n return value;\n };\n return {\n format: pick(\"format\"),\n id: pick(\"id\"),\n title: pick(\"title\"),\n type: pick(\"type\"),\n namespace: pick(\"namespace\")\n };\n}\nfunction resolveComponents(field, value, dtype) {\n if (value === void 0) {\n return 1;\n }\n if (!Number.isInteger(value) || value < 1 || value > MAX_COMPONENTS) {\n throw typeError(field, `${field} must be an integer in 1..${MAX_COMPONENTS}, found ${value}`, { found: value });\n }\n if (value > 1 && !NUMERIC_DTYPES.has(dtype)) {\n throw typeError(field, `${field} > 1 is only allowed for f32 / f64 / i32 / u32 / u8, not ${dtype}`, {\n found: value,\n dtype\n });\n }\n return value;\n}\nfunction resolveFill(dtype, components, explicit, defaultValue, options, refersTo) {\n switch (dtype) {\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\": {\n if (explicit !== void 0) {\n if (typeof explicit !== \"number\") {\n throw typeError(\"fill\", `fill of a ${dtype} column must be a number`, { found: typeof explicit });\n }\n return explicit;\n }\n if (refersTo !== null) {\n return INVALID_INDEX;\n }\n const fromDefault = numericDefaultFill(dtype, components, defaultValue);\n return fromDefault ?? 0;\n }\n case \"bool\": {\n if (explicit !== void 0) {\n if (typeof explicit !== \"boolean\") {\n throw typeError(\"fill\", \"fill of a bool column must be a boolean\", { found: typeof explicit });\n }\n return explicit;\n }\n return typeof defaultValue === \"boolean\" ? defaultValue : false;\n }\n case \"dict\": {\n if (explicit !== void 0) {\n if (typeof explicit !== \"string\") {\n throw typeError(\"fill\", \"fill of a dict column must be a string\", { found: typeof explicit });\n }\n return explicit;\n }\n if (typeof defaultValue === \"string\" && (options === null || options.includes(defaultValue))) {\n return defaultValue;\n }\n if (options !== null && options.length > 0 && typeof options[0] === \"string\") {\n return options[0];\n }\n return \"\";\n }\n case \"string\": {\n if (explicit !== void 0) {\n if (typeof explicit !== \"string\") {\n throw typeError(\"fill\", \"fill of a string column must be a string\", { found: typeof explicit });\n }\n return explicit;\n }\n return \"\";\n }\n case \"list\":\n case \"json\": {\n if (explicit !== void 0 && explicit !== \"\") {\n throw typeError(\"fill\", `a ${dtype} column takes no fill value`, { found: explicit });\n }\n return \"\";\n }\n default: {\n const name = dtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${name}`, { dtype: name });\n }\n }\n}\nfunction resolveColumnMeta(name, domain, decl) {\n const { dtype } = decl;\n if (dtype === void 0 || !ALL_DTYPES.has(dtype)) {\n throw typeError(\"dtype\", `column \"${name}\" has no valid dtype`, { name, found: dtype });\n }\n const components = resolveComponents(\"components\", decl.components, dtype);\n let itemDtype = null;\n let itemComponents = null;\n if (dtype === \"list\") {\n const { itemDtype: declaredItem } = decl;\n if (declaredItem === void 0 || !isScalarDtype(declaredItem)) {\n throw typeError(\"itemDtype\", `list column \"${name}\" needs a scalar itemDtype`, {\n name,\n found: declaredItem\n });\n }\n itemDtype = declaredItem;\n itemComponents = resolveComponents(\"itemComponents\", decl.itemComponents, declaredItem);\n } else if (decl.itemDtype !== void 0 || decl.itemComponents !== void 0) {\n throw typeError(\"itemDtype\", `itemDtype / itemComponents are only allowed on list columns, not ${dtype}`, {\n name,\n dtype\n });\n }\n const refersTo = decl.refersTo ?? null;\n if (refersTo !== null) {\n if (refersTo !== \"node\" && refersTo !== \"edge\") {\n throw typeError(\"refersTo\", `refersTo must be \"node\" or \"edge\"`, { found: refersTo });\n }\n const indexColumn = dtype === \"u32\" && components === 1 || dtype === \"list\" && itemDtype === \"u32\" && itemComponents === 1;\n if (!indexColumn) {\n throw typeError(\"refersTo\", `refersTo requires a u32 column or a list of u32, not ${dtype}`, {\n name,\n dtype\n });\n }\n }\n const defaultValue = decl.default;\n if (defaultValue !== void 0) {\n assertJsonValue(defaultValue, \"default\");\n }\n let options = null;\n if (decl.options !== void 0) {\n if (!Array.isArray(decl.options)) {\n throw typeError(\"options\", \"options must be an array\");\n }\n assertJsonValue(decl.options, \"options\");\n if (dtype === \"dict\") {\n for (const option of decl.options) {\n if (typeof option !== \"string\") {\n throw typeError(\"options\", \"options of a dict column must be strings\", { found: typeof option });\n }\n }\n }\n options = Object.freeze(cloneJson([...decl.options]));\n }\n const extra = decl.extra ?? {};\n if (!isPlainObject(extra)) {\n throw typeError(\"extra\", \"extra must be a plain object\");\n }\n assertJsonValue(extra, \"extra\");\n const role = decl.role ?? null;\n if (role !== null && typeof role !== \"string\") {\n throw typeError(\"role\", \"role must be a string\", { found: typeof role });\n }\n const fill = resolveFill(dtype, components, decl.fill, defaultValue, options, refersTo);\n return Object.freeze({\n name,\n domain,\n dtype,\n components,\n itemDtype,\n itemComponents,\n nullable: decl.nullable ?? true,\n mutable: decl.mutable ?? false,\n role,\n refersTo,\n unique: decl.unique ?? false,\n default: cloneJson(defaultValue),\n fill,\n options,\n origin: resolveOrigin(decl.origin),\n dynamic: decl.dynamic ?? false,\n extra: Object.freeze(cloneJson({ ...extra }))\n });\n}\nfunction metaToDecl(meta) {\n return {\n name: meta.name,\n dtype: meta.dtype,\n components: meta.components,\n itemDtype: meta.itemDtype ?? void 0,\n itemComponents: meta.itemComponents ?? void 0,\n nullable: meta.nullable,\n mutable: meta.mutable,\n role: meta.role ?? void 0,\n refersTo: meta.refersTo ?? void 0,\n unique: meta.unique,\n default: meta.default,\n fill: meta.fill,\n options: meta.options ?? void 0,\n origin: meta.origin ?? void 0,\n dynamic: meta.dynamic,\n extra: meta.extra\n };\n}\nclass ColumnImpl {\n constructor(dtype, meta, length, validity, nullCount) {\n this.versionValue = 0;\n this.defaultCache = null;\n this.dtype = dtype;\n this.meta = meta;\n this.length = length;\n this.gpu = gpuEligibility(dtype);\n this.validityWords = validity;\n this.nullCountValue = nullCount;\n this.defaultValue = cloneJson(meta.default);\n }\n get validity() {\n return this.validityWords;\n }\n get nullCount() {\n return this.nullCountValue;\n }\n get version() {\n return this.versionValue;\n }\n get paddedByteLength() {\n return this.byteLength;\n }\n get validityByteLength() {\n return this.validityWords === null ? 0 : this.validityWords.byteLength;\n }\n /**\n * Whether the column's storage was transferred away (design sections 9.1 and 11.3): derived from\n * the array state, since a transferred ArrayBuffer leaves zero-length views behind.\n * @returns true when a typed array the column needs is empty although the column has rows\n */\n get detached() {\n if (this.length === 0) {\n return false;\n }\n const words = this.validityWords;\n return words !== null && words.length === 0 || this.storageDetached();\n }\n isSet(row) {\n if (!(row >= 0 && row < this.length)) {\n return false;\n }\n const words = this.validityWords;\n if (words === null) {\n return true;\n }\n if (words.length === 0) {\n throw this.detachedError();\n }\n return bitmapGet(words, row);\n }\n value(row) {\n this.assertAttached();\n if (!(Number.isInteger(row) && row >= 0 && row < this.length)) {\n throw new GraphFormatError(\n \"E_INDEX_RANGE\",\n `row ${row} is out of range for a column of ${this.length} rows`,\n {\n row,\n length: this.length,\n column: this.meta.name\n }\n );\n }\n const words = this.validityWords;\n if (words !== null && !bitmapGet(words, row)) {\n const { defaultValue } = this;\n return defaultValue === void 0 ? void 0 : cloneJson(defaultValue);\n }\n return this.readValue(row);\n }\n materializeDefault() {\n this.assertAttached();\n if (this.meta.default === void 0) {\n throw new GraphFormatError(\"E_NO_DEFAULT\", `column \"${this.meta.name}\" declares no default`, {\n column: this.meta.name\n });\n }\n if (this.nullCountValue === 0 || this.fillIsDefault()) {\n return this.self();\n }\n this.defaultCache ??= this.withDefaults();\n return this.defaultCache;\n }\n paddedU32View() {\n throw new GraphFormatError(\"E_GPU_INELIGIBLE\", `a ${this.dtype} column has no u32 view`, {\n column: this.meta.name,\n dtype: this.dtype\n });\n }\n markDirty() {\n this.assertMutable(\"markDirty\");\n this.assertAttached();\n this.versionValue++;\n this.defaultCache = null;\n f32Cache.delete(this);\n const words = this.validityWords;\n if (words !== null) {\n this.nullCountValue = this.length - bitmapCount(words, this.length);\n }\n }\n mutableValidity() {\n this.assertMutable(\"mutableValidity\");\n return this.validityWords;\n }\n setAll() {\n this.assertMutable(\"setAll\");\n this.validityWords = null;\n this.nullCountValue = 0;\n this.versionValue++;\n this.defaultCache = null;\n }\n assertAttached() {\n if (this.detached) {\n throw this.detachedError();\n }\n }\n detachedError() {\n return new GraphFormatError(\"E_DETACHED\", `column \"${this.meta.name}\" was transferred away`, {\n column: this.meta.name\n });\n }\n assertMutable(operation) {\n if (!this.meta.mutable) {\n throw new GraphFormatError(\"E_COLUMN_IMMUTABLE\", `${operation}() on immutable column \"${this.meta.name}\"`, {\n column: this.meta.name,\n operation\n });\n }\n }\n checkRange(start, end) {\n this.assertAttached();\n if (!(Number.isInteger(start) && Number.isInteger(end) && start >= 0 && start <= end && end <= this.length)) {\n throw new GraphFormatError(\n \"E_INDEX_RANGE\",\n `row range [${start}, ${end}) is invalid for ${this.length} rows`,\n {\n start,\n end,\n length: this.length,\n column: this.meta.name\n }\n );\n }\n }\n /**\n * The validity bitmap and null count of the row range [start, end); zero-copy at word boundaries.\n * @param start - first row\n * @param end - one past the last row\n * @returns the bitmap over the range (null when every row is set) and its null count\n */\n sliceValidity(start, end) {\n const words = this.validityWords;\n if (words === null) {\n return { validity: null, nullCount: 0 };\n }\n const rows = end - start;\n const validity = start % 32 === 0 ? shareView(words.subarray(start >>> 5, (start >>> 5) + bitmapWordCount(rows))) : bitmapSlice(words, start, end);\n return { validity, nullCount: rows - bitmapCount(validity, rows) };\n }\n cloneValidity() {\n this.assertAttached();\n return this.validityWords === null ? null : this.validityWords.slice();\n }\n}\nfunction shareView(view) {\n noteShared(view.buffer);\n return view;\n}\nclass FixedColumnImpl extends ColumnImpl {\n constructor(dtype, meta, length, data, validity, nullCount) {\n super(dtype, meta, length, validity, nullCount);\n this.data = data;\n }\n get byteLength() {\n return this.data.byteLength + this.validityByteLength;\n }\n mutableData() {\n this.assertMutable(\"mutableData\");\n this.assertAttached();\n return this.data;\n }\n storageDetached() {\n return this.data.length === 0 && this.length * this.meta.components > 0;\n }\n slice(start, end) {\n this.checkRange(start, end);\n const { components } = this.meta;\n const data = this.sliceData(start * components, end * components);\n const { validity, nullCount } = this.sliceValidity(start, end);\n return this.wrap(this.meta, end - start, data, validity, nullCount);\n }\n clone() {\n this.assertAttached();\n return this.wrap(this.meta, this.length, this.copyData(), this.cloneValidity(), this.nullCountValue);\n }\n readValue(row) {\n const { components } = this.meta;\n if (components === 1) {\n return this.data[row];\n }\n return this.data.subarray(row * components, (row + 1) * components);\n }\n fillIsDefault() {\n const { fill, default: defaultValue, components } = this.meta;\n if (typeof fill !== \"number\") {\n return false;\n }\n return numericDefaultFill(this.dtype, components, defaultValue) === fill;\n }\n withDefaults() {\n const { components, default: defaultValue } = this.meta;\n const data = this.copyData();\n const words = this.validityWords;\n if (words !== null) {\n for (let row = 0; row < this.length; row++) {\n if (!bitmapGet(words, row)) {\n writeNumeric(this.dtype, data, row * components, components, defaultValue, this.meta.name, row);\n }\n }\n }\n return this.wrap(this.meta, this.length, data, this.cloneValidity(), this.nullCountValue);\n }\n sliceData(start, end) {\n return shareView(this.data.subarray(start, end));\n }\n copyData() {\n return this.data.slice();\n }\n}\nfunction writeNumeric(dtype, data, at, components, value, column, row) {\n if (typeof value === \"number\") {\n assertRepresentable(dtype, value, column, row);\n if (components === 1) {\n data[at] = value;\n } else {\n data.fill(value, at, at + components);\n }\n return;\n }\n if (components === 1 || !isArrayLikeNumbers(value, components)) {\n throw new GraphFormatError(\n \"E_COLUMN_TYPE\",\n `row ${row} of ${dtype} column \"${column}\" is not ${components} number(s)`,\n { column, row, components, found: typeof value }\n );\n }\n for (let k = 0; k < components; k++) {\n assertRepresentable(dtype, value[k], column, row);\n }\n for (let k = 0; k < components; k++) {\n data[at + k] = value[k];\n }\n}\nfunction assertRepresentable(dtype, value, column, row) {\n if (!representableNumber(dtype, value)) {\n throw new GraphFormatError(\n \"E_COLUMN_TYPE\",\n `row ${row} of ${dtype} column \"${column}\": ${value} is not representable`,\n { column, row, value }\n );\n }\n}\nfunction isArrayLikeNumbers(value, length) {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const arrayLike = value;\n if (arrayLike.length !== length) {\n return false;\n }\n for (let k = 0; k < length; k++) {\n if (typeof arrayLike[k] !== \"number\") {\n return false;\n }\n }\n return true;\n}\nclass F32ColumnImpl extends FixedColumnImpl {\n constructor(meta, length, data, validity, nullCount) {\n super(\"f32\", meta, length, data, validity, nullCount);\n }\n self() {\n return this;\n }\n wrap(meta, length, data, validity, nullCount) {\n return new F32ColumnImpl(meta, length, data, validity, nullCount);\n }\n}\nclass F64ColumnImpl extends FixedColumnImpl {\n constructor(meta, length, data, validity, nullCount) {\n super(\"f64\", meta, length, data, validity, nullCount);\n }\n self() {\n return this;\n }\n wrap(meta, length, data, validity, nullCount) {\n return new F64ColumnImpl(meta, length, data, validity, nullCount);\n }\n}\nclass I32ColumnImpl extends FixedColumnImpl {\n constructor(meta, length, data, validity, nullCount) {\n super(\"i32\", meta, length, data, validity, nullCount);\n }\n self() {\n return this;\n }\n wrap(meta, length, data, validity, nullCount) {\n return new I32ColumnImpl(meta, length, data, validity, nullCount);\n }\n}\nclass U32ColumnImpl extends FixedColumnImpl {\n constructor(meta, length, data, validity, nullCount) {\n super(\"u32\", meta, length, data, validity, nullCount);\n }\n paddedU32View() {\n return this.data;\n }\n self() {\n return this;\n }\n wrap(meta, length, data, validity, nullCount) {\n return new U32ColumnImpl(meta, length, data, validity, nullCount);\n }\n}\nclass U8ColumnImpl extends FixedColumnImpl {\n constructor(meta, length, data, validity, nullCount) {\n super(\"u8\", meta, length, data, validity, nullCount);\n }\n get paddedByteLength() {\n return padTo4(this.data.byteLength) + this.validityByteLength;\n }\n paddedU32View() {\n return paddedU32View(this.data);\n }\n self() {\n return this;\n }\n wrap(meta, length, data, validity, nullCount) {\n return new U8ColumnImpl(meta, length, data, validity, nullCount);\n }\n sliceData(start, end) {\n if (start % 4 === 0) {\n return shareView(this.data.subarray(start, end));\n }\n const out = allocU8(end - start);\n out.set(this.data.subarray(start, end));\n return out;\n }\n copyData() {\n const out = allocU8(this.data.length);\n out.set(this.data);\n return out;\n }\n}\nclass BoolColumnImpl extends ColumnImpl {\n constructor(meta, length, data, validity, nullCount) {\n super(\"bool\", meta, length, validity, nullCount);\n this.data = data;\n }\n get byteLength() {\n return this.data.byteLength + this.validityByteLength;\n }\n mutableData() {\n this.assertMutable(\"mutableData\");\n this.assertAttached();\n return this.data;\n }\n paddedU32View() {\n this.assertAttached();\n return this.data;\n }\n slice(start, end) {\n this.checkRange(start, end);\n const rows = end - start;\n const data = start % 32 === 0 ? shareView(this.data.subarray(start >>> 5, (start >>> 5) + bitmapWordCount(rows))) : bitmapSlice(this.data, start, end);\n const { validity, nullCount } = this.sliceValidity(start, end);\n return new BoolColumnImpl(this.meta, rows, data, validity, nullCount);\n }\n clone() {\n this.assertAttached();\n return new BoolColumnImpl(this.meta, this.length, this.data.slice(), this.cloneValidity(), this.nullCountValue);\n }\n storageDetached() {\n return this.data.length === 0;\n }\n self() {\n return this;\n }\n readValue(row) {\n return bitmapGet(this.data, row);\n }\n fillIsDefault() {\n return this.meta.fill === this.meta.default;\n }\n withDefaults() {\n const { default: defaultValue, name } = this.meta;\n if (typeof defaultValue !== \"boolean\") {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `default of bool column \"${name}\" is not a boolean`, {\n column: name,\n field: \"default\"\n });\n }\n const data = this.data.slice();\n const words = this.validityWords;\n if (words !== null) {\n for (let row = 0; row < this.length; row++) {\n if (!bitmapGet(words, row)) {\n if (defaultValue) {\n bitmapSet(data, row);\n } else {\n bitmapClear(data, row);\n }\n }\n }\n }\n return new BoolColumnImpl(this.meta, this.length, data, this.cloneValidity(), this.nullCountValue);\n }\n}\nclass DictColumnImpl extends ColumnImpl {\n constructor(meta, length, codes, dictionary, validity, nullCount) {\n super(\"dict\", meta, length, validity, nullCount);\n this.codeMap = null;\n this.codes = codes;\n this.dictionary = dictionary;\n }\n get byteLength() {\n return this.codes.byteLength + this.validityByteLength;\n }\n codeOf(value) {\n this.codeMap ??= buildCodeMap(this.dictionary);\n const code = this.codeMap.get(value);\n return code === void 0 ? INVALID_INDEX : code;\n }\n mutableData() {\n this.assertMutable(\"mutableData\");\n this.assertAttached();\n return this.codes;\n }\n paddedU32View() {\n this.assertAttached();\n return this.codes;\n }\n slice(start, end) {\n this.checkRange(start, end);\n const { validity, nullCount } = this.sliceValidity(start, end);\n return new DictColumnImpl(\n this.meta,\n end - start,\n shareView(this.codes.subarray(start, end)),\n this.dictionary,\n validity,\n nullCount\n );\n }\n storageDetached() {\n return this.codes.length === 0;\n }\n clone() {\n this.assertAttached();\n return new DictColumnImpl(\n this.meta,\n this.length,\n this.codes.slice(),\n [...this.dictionary],\n this.cloneValidity(),\n this.nullCountValue\n );\n }\n self() {\n return this;\n }\n readValue(row) {\n return this.dictionary[this.codes[row]];\n }\n fillIsDefault() {\n return this.meta.fill === this.meta.default;\n }\n withDefaults() {\n const { default: defaultValue, name } = this.meta;\n if (typeof defaultValue !== \"string\") {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `default of dict column \"${name}\" is not a string`, {\n column: name,\n field: \"default\"\n });\n }\n let dict = this.dictionary;\n let code = this.codeOf(defaultValue);\n if (code === INVALID_INDEX) {\n code = dict.length;\n dict = [...dict, defaultValue];\n }\n const codes = this.codes.slice();\n const words = this.validityWords;\n if (words !== null) {\n for (let row = 0; row < this.length; row++) {\n if (!bitmapGet(words, row)) {\n codes[row] = code;\n }\n }\n }\n return new DictColumnImpl(this.meta, this.length, codes, dict, this.cloneValidity(), this.nullCountValue);\n }\n}\nfunction encodeStrings(strings) {\n const encoded = encodeUtf8Rows(strings, strings.length);\n const utf8 = allocU8(encoded.utf8.length);\n utf8.set(encoded.utf8);\n return { offsets: encoded.offsets, utf8 };\n}\nclass StringColumnImpl extends ColumnImpl {\n constructor(meta, length, offsets, utf8, strings, validity, nullCount) {\n super(\"string\", meta, length, validity, nullCount);\n this.offsetsStore = offsets;\n this.utf8Store = utf8;\n this.strings = strings;\n }\n get offsets() {\n this.store();\n return this.offsetsStore;\n }\n get utf8() {\n this.store();\n return this.utf8Store;\n }\n get byteLength() {\n this.store();\n return this.offsetsStore.byteLength + this.utf8Store.byteLength + this.validityByteLength;\n }\n valueAt(row) {\n const cached = this.strings?.[row];\n if (cached !== void 0) {\n return cached;\n }\n this.assertAttached();\n this.store();\n const offsets = this.offsetsStore;\n const utf8 = this.utf8Store;\n const text = decoder.decode(utf8.subarray(offsets[row], offsets[row + 1]));\n this.strings ??= new Array(this.length);\n this.strings[row] = text;\n return text;\n }\n decodeAll() {\n const out = new Array(this.length);\n for (let row = 0; row < this.length; row++) {\n out[row] = this.valueAt(row);\n }\n return out;\n }\n slice(start, end) {\n this.checkRange(start, end);\n const rows = end - start;\n const { validity, nullCount } = this.sliceValidity(start, end);\n const strings = this.strings === null ? null : this.strings.slice(start, end);\n if (this.offsetsStore === null || this.utf8Store === null) {\n return new StringColumnImpl(this.meta, rows, null, null, strings, validity, nullCount);\n }\n const base = this.offsetsStore[start];\n const offsets = new Uint32Array(rows + 1);\n for (let i = 0; i <= rows; i++) {\n offsets[i] = this.offsetsStore[start + i] - base;\n }\n const utf8 = shareView(this.utf8Store.subarray(base, this.offsetsStore[end]));\n return new StringColumnImpl(this.meta, rows, offsets, utf8, strings, validity, nullCount);\n }\n clone() {\n this.assertAttached();\n const strings = this.strings === null ? null : [...this.strings];\n if (this.offsetsStore === null || this.utf8Store === null) {\n return new StringColumnImpl(\n this.meta,\n this.length,\n null,\n null,\n strings,\n this.cloneValidity(),\n this.nullCountValue\n );\n }\n const utf8 = allocU8(this.utf8Store.length);\n utf8.set(this.utf8Store);\n return new StringColumnImpl(\n this.meta,\n this.length,\n this.offsetsStore.slice(),\n utf8,\n strings,\n this.cloneValidity(),\n this.nullCountValue\n );\n }\n /**\n * Whether the Utf8 store has been materialised (the wire writer asks before encoding).\n * @returns true when offsets and utf8 exist without being computed\n */\n hasStore() {\n return this.offsetsStore !== null;\n }\n /**\n * The decoded cache as it stands (sparse), for zero-copy re-wrapping.\n * @returns the cache, or null when no row has been decoded\n */\n decodedCache() {\n return this.strings;\n }\n self() {\n return this;\n }\n storageDetached() {\n return this.offsetsStore !== null && this.offsetsStore.length === 0;\n }\n readValue(row) {\n return this.valueAt(row);\n }\n fillIsDefault() {\n return this.meta.fill === this.meta.default;\n }\n withDefaults() {\n const { default: defaultValue, name } = this.meta;\n if (typeof defaultValue !== \"string\") {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `default of string column \"${name}\" is not a string`, {\n column: name,\n field: \"default\"\n });\n }\n const strings = this.decodeAll();\n const words = this.validityWords;\n if (words !== null) {\n for (let row = 0; row < this.length; row++) {\n if (!bitmapGet(words, row)) {\n strings[row] = defaultValue;\n }\n }\n }\n return new StringColumnImpl(\n this.meta,\n this.length,\n null,\n null,\n strings,\n this.cloneValidity(),\n this.nullCountValue\n );\n }\n /**\n * Materialise the Utf8 store from the decoded strings on first need (design section 5.7); a\n * store that was transferred away is E_DETACHED.\n */\n store() {\n if (this.offsetsStore !== null && this.utf8Store !== null) {\n this.assertAttached();\n return;\n }\n const strings = this.strings ?? [];\n const dense = new Array(this.length);\n for (let row = 0; row < this.length; row++) {\n dense[row] = strings[row] ?? \"\";\n }\n const encoded = encodeStrings(dense);\n this.offsetsStore = encoded.offsets;\n this.utf8Store = encoded.utf8;\n claimHolder(encoded.offsets.buffer);\n claimHolder(encoded.utf8.buffer);\n }\n}\nclass ListColumnImpl extends ColumnImpl {\n constructor(meta, length, offsets, child, validity, nullCount) {\n super(\"list\", meta, length, validity, nullCount);\n this.offsets = offsets;\n this.child = child;\n }\n get byteLength() {\n return this.offsets.byteLength + this.child.byteLength + this.validityByteLength;\n }\n sliceOf(row) {\n this.assertAttached();\n const start = this.offsets[row];\n const end = this.offsets[row + 1];\n const out = new Array(end - start);\n for (let i = start; i < end; i++) {\n out[i - start] = this.child.value(i);\n }\n return out;\n }\n slice(start, end) {\n this.checkRange(start, end);\n const rows = end - start;\n const base = this.offsets[start];\n const offsets = new Uint32Array(rows + 1);\n for (let i = 0; i <= rows; i++) {\n offsets[i] = this.offsets[start + i] - base;\n }\n const { validity, nullCount } = this.sliceValidity(start, end);\n return new ListColumnImpl(\n this.meta,\n rows,\n offsets,\n this.child.slice(base, this.offsets[end]),\n validity,\n nullCount\n );\n }\n clone() {\n this.assertAttached();\n return new ListColumnImpl(\n this.meta,\n this.length,\n this.offsets.slice(),\n this.child.clone(),\n this.cloneValidity(),\n this.nullCountValue\n );\n }\n storageDetached() {\n return this.offsets.length === 0 || isColumnDetached(this.child);\n }\n self() {\n return this;\n }\n readValue(row) {\n return this.sliceOf(row);\n }\n fillIsDefault() {\n return false;\n }\n withDefaults() {\n const { default: defaultValue, name } = this.meta;\n if (!Array.isArray(defaultValue)) {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `default of list column \"${name}\" is not an array`, {\n column: name,\n field: \"default\"\n });\n }\n const rows = new Array(this.length);\n const words = this.validityWords;\n for (let row = 0; row < this.length; row++) {\n rows[row] = words !== null && !bitmapGet(words, row) ? defaultValue : this.sliceOf(row);\n }\n const parts = listPartsFromValues(this.meta, rows);\n return new ListColumnImpl(\n this.meta,\n this.length,\n parts.offsets,\n parts.child,\n this.cloneValidity(),\n this.nullCountValue\n );\n }\n}\nclass JsonColumnImpl extends ColumnImpl {\n constructor(meta, length, values, validity, nullCount) {\n super(\"json\", meta, length, validity, nullCount);\n this.values = values;\n }\n get byteLength() {\n return this.validityByteLength;\n }\n slice(start, end) {\n this.checkRange(start, end);\n const { validity, nullCount } = this.sliceValidity(start, end);\n return new JsonColumnImpl(this.meta, end - start, this.values.slice(start, end), validity, nullCount);\n }\n clone() {\n this.assertAttached();\n return new JsonColumnImpl(this.meta, this.length, [...this.values], this.cloneValidity(), this.nullCountValue);\n }\n storageDetached() {\n return false;\n }\n self() {\n return this;\n }\n readValue(row) {\n return this.values[row];\n }\n fillIsDefault() {\n return false;\n }\n withDefaults() {\n const { default: defaultValue } = this.meta;\n const values = [...this.values];\n const words = this.validityWords;\n if (words !== null) {\n for (let row = 0; row < this.length; row++) {\n if (!bitmapGet(words, row)) {\n values[row] = defaultValue;\n }\n }\n }\n return new JsonColumnImpl(this.meta, this.length, values, this.cloneValidity(), this.nullCountValue);\n }\n}\nfunction isPackageColumn(value) {\n return value instanceof ColumnImpl;\n}\nfunction isColumnDetached(column) {\n return column.detached;\n}\nfunction lengthError$1(meta, what, expected, found) {\n return new GraphFormatError(\n \"E_COLUMN_LENGTH\",\n `column \"${meta.name}\": ${what} has length ${found}, expected ${expected}`,\n {\n column: meta.name,\n what,\n expected,\n found\n }\n );\n}\nfunction slotError(meta, message) {\n return new GraphFormatError(\"E_COLUMN_TYPE\", `column \"${meta.name}\": ${message}`, { column: meta.name });\n}\nfunction createColumn(parts) {\n const { meta, length } = parts;\n if (!(Number.isInteger(length) && length >= 0)) {\n throw new GraphFormatError(\"E_COLUMN_LENGTH\", `column \"${meta.name}\": invalid row count ${length}`, {\n column: meta.name,\n found: length\n });\n }\n const { validity: given } = parts;\n let validity = null;\n if (given !== null) {\n if (!meta.nullable) {\n throw slotError(meta, \"a non-nullable column cannot carry a validity bitmap\");\n }\n if (!(given instanceof Uint32Array)) {\n throw slotError(meta, \"validity must be a Uint32Array\");\n }\n if (given.length !== bitmapWordCount(length)) {\n throw lengthError$1(meta, \"validity\", bitmapWordCount(length), given.length);\n }\n validity = given;\n }\n const nullCount = validity === null ? 0 : length - bitmapCount(validity, length);\n const { dtype } = meta;\n switch (dtype) {\n case \"f32\":\n return new F32ColumnImpl(meta, length, checkNumeric(parts, Float32Array), validity, nullCount);\n case \"f64\":\n return new F64ColumnImpl(meta, length, checkNumeric(parts, Float64Array), validity, nullCount);\n case \"i32\":\n return new I32ColumnImpl(meta, length, checkNumeric(parts, Int32Array), validity, nullCount);\n case \"u32\":\n return new U32ColumnImpl(meta, length, checkNumeric(parts, Uint32Array), validity, nullCount);\n case \"u8\": {\n const data = checkNumeric(parts, Uint8Array);\n if (!canViewAsPaddedU32(data)) {\n throw new GraphFormatError(\n \"E_COLUMN_ALIGNMENT\",\n `column \"${meta.name}\": no padded u32 view over the u8 data`,\n {\n column: meta.name,\n byteOffset: data.byteOffset,\n byteLength: data.byteLength\n }\n );\n }\n return new U8ColumnImpl(meta, length, data, validity, nullCount);\n }\n case \"bool\": {\n if (!(parts.data instanceof Uint32Array)) {\n throw slotError(meta, \"bool data must be packed Uint32Array words\");\n }\n if (parts.data.length !== bitmapWordCount(length)) {\n throw lengthError$1(meta, \"data\", bitmapWordCount(length), parts.data.length);\n }\n return new BoolColumnImpl(meta, length, parts.data, validity, nullCount);\n }\n case \"dict\": {\n if (!(parts.data instanceof Uint32Array)) {\n throw slotError(meta, \"dict codes must be a Uint32Array\");\n }\n if (parts.data.length !== length) {\n throw lengthError$1(meta, \"codes\", length, parts.data.length);\n }\n if (parts.dictionary === null) {\n throw slotError(meta, \"dict column needs a dictionary\");\n }\n return new DictColumnImpl(meta, length, parts.data, parts.dictionary, validity, nullCount);\n }\n case \"string\": {\n if (parts.offsets === null || parts.utf8 === null) {\n const { strings } = parts;\n if (strings === null || strings.length !== length) {\n throw lengthError$1(meta, \"strings\", length, strings === null ? -1 : strings.length);\n }\n for (let row = 0; row < length; row++) {\n if (typeof strings[row] !== \"string\") {\n throw slotError(meta, `row ${row} is not a decoded string and no Utf8 store is present`);\n }\n }\n return new StringColumnImpl(meta, length, null, null, strings, validity, nullCount);\n }\n if (parts.offsets.length !== length + 1) {\n throw lengthError$1(meta, \"offsets\", length + 1, parts.offsets.length);\n }\n if (parts.offsets[length] !== parts.utf8.length) {\n throw lengthError$1(meta, \"utf8\", parts.offsets[length], parts.utf8.length);\n }\n return new StringColumnImpl(meta, length, parts.offsets, parts.utf8, parts.strings, validity, nullCount);\n }\n case \"list\": {\n if (parts.offsets === null || parts.offsets.length !== length + 1) {\n throw lengthError$1(meta, \"offsets\", length + 1, parts.offsets === null ? -1 : parts.offsets.length);\n }\n const { child } = parts;\n if (child === null || child.dtype === \"list\") {\n throw slotError(meta, \"list column needs a non-list child column\");\n }\n if (child.validity !== null || child.meta.nullable) {\n throw slotError(meta, \"list child must be non-nullable\");\n }\n if (child.dtype !== meta.itemDtype || child.meta.components !== meta.itemComponents) {\n throw slotError(\n meta,\n `list child is ${child.dtype} x${child.meta.components}, declared ${String(meta.itemDtype)} x${String(meta.itemComponents)}`\n );\n }\n if (parts.offsets[length] !== child.length) {\n throw lengthError$1(meta, \"child\", parts.offsets[length], child.length);\n }\n return new ListColumnImpl(meta, length, parts.offsets, child, validity, nullCount);\n }\n case \"json\": {\n if (parts.values === null || parts.values.length !== length) {\n throw lengthError$1(meta, \"values\", length, parts.values === null ? -1 : parts.values.length);\n }\n return new JsonColumnImpl(meta, length, parts.values, validity, nullCount);\n }\n default: {\n const name = dtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${name}`, { dtype: name });\n }\n }\n}\nfunction checkNumeric(parts, ctor) {\n const { meta, length } = parts;\n if (!(parts.data instanceof ctor)) {\n throw slotError(meta, `${meta.dtype} data must be a ${ctor.name}`);\n }\n const expected = length * meta.components;\n if (parts.data.length !== expected) {\n throw lengthError$1(meta, \"data\", expected, parts.data.length);\n }\n return parts.data;\n}\nfunction partsOf(column) {\n const base = {\n meta: column.meta,\n length: column.length,\n data: null,\n validity: column.validity,\n nullCount: column.nullCount,\n dictionary: null,\n offsets: null,\n utf8: null,\n strings: null,\n child: null,\n values: null\n };\n const { dtype } = column;\n switch (dtype) {\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\":\n case \"bool\":\n base.data = column.data;\n return base;\n case \"dict\":\n base.data = column.codes;\n base.dictionary = column.dictionary;\n return base;\n case \"string\": {\n if (column instanceof StringColumnImpl) {\n base.strings = column.decodedCache();\n if (column.hasStore()) {\n base.offsets = column.offsets;\n base.utf8 = column.utf8;\n }\n return base;\n }\n base.offsets = column.offsets;\n base.utf8 = column.utf8;\n return base;\n }\n case \"list\":\n base.offsets = column.offsets;\n base.child = column.child;\n return base;\n case \"json\":\n base.values = column.values;\n return base;\n default: {\n const name = dtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${name}`, { dtype: name });\n }\n }\n}\nfunction columnBuffers(column) {\n const out = /* @__PURE__ */ new Set();\n const add = (view) => {\n if (view !== null) {\n out.add(view.buffer);\n }\n };\n add(column.validity);\n switch (column.dtype) {\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\":\n case \"bool\":\n add(column.data);\n break;\n case \"dict\":\n add(column.codes);\n break;\n case \"string\":\n if (!(column instanceof StringColumnImpl) || column.hasStore()) {\n add(column.offsets);\n add(column.utf8);\n }\n break;\n case \"list\":\n add(column.offsets);\n for (const buffer of columnBuffers(column.child)) {\n out.add(buffer);\n }\n break;\n case \"json\":\n break;\n default: {\n const unknown = column;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${unknown.dtype}`, {});\n }\n }\n return [...out];\n}\nfunction rewrapColumn(column, meta) {\n const old = column.meta;\n if (meta.dtype !== old.dtype || meta.components !== old.components || meta.itemDtype !== old.itemDtype || meta.itemComponents !== old.itemComponents) {\n throw new GraphFormatError(\n \"E_COLUMN_TYPE\",\n `column \"${old.name}\" is ${old.dtype} x${old.components}; a patch cannot change its dtype`,\n {\n column: old.name,\n field: \"dtype\"\n }\n );\n }\n if (meta.fill !== old.fill) {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `the fill of existing column \"${old.name}\" cannot change`, {\n column: old.name,\n field: \"fill\"\n });\n }\n const parts = partsOf(column);\n if (!meta.nullable && column.validity !== null) {\n if (column.nullCount > 0) {\n throw new GraphFormatError(\n \"E_COLUMN_TYPE\",\n `column \"${old.name}\" has ${column.nullCount} unset rows and cannot become non-nullable`,\n {\n column: old.name,\n field: \"nullable\",\n nullCount: column.nullCount\n }\n );\n }\n parts.validity = null;\n }\n parts.meta = meta;\n return createColumn(parts);\n}\nfunction dropGpuViewCache(column) {\n f32Cache.delete(column);\n}\nfunction gpuViewOf(column) {\n const { dtype } = column;\n switch (dtype) {\n case \"f32\":\n case \"i32\":\n case \"u32\":\n case \"bool\":\n return column.data;\n case \"u8\":\n return column.paddedU32View();\n case \"dict\":\n return column.codes;\n case \"f64\": {\n let cached = f32Cache.get(column);\n if (cached === void 0) {\n cached = new Float32Array(column.data);\n f32Cache.set(column, cached);\n }\n return cached;\n }\n case \"string\":\n case \"list\":\n case \"json\":\n throw new GraphFormatError(\"E_GPU_INELIGIBLE\", `a ${dtype} column cannot be bound by the GPU`, {\n column: column.meta.name,\n dtype\n });\n default: {\n const name = dtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${name}`, { dtype: name });\n }\n }\n}\nfunction fillCode(dictionary, fill, set) {\n const text = typeof fill === \"string\" ? fill : \"\";\n const code = dictionary.codeOf(text);\n return code === INVALID_INDEX ? 0 : code;\n}\nfunction seedDictionary(meta) {\n const dictionary = new DictionaryBuilder(meta.options === null ? void 0 : meta.options);\n if (typeof meta.fill === \"string\" && meta.fill !== \"\") {\n dictionary.intern(meta.fill);\n }\n return dictionary;\n}\nfunction emptyParts(meta, length, validity) {\n return {\n meta,\n length,\n data: null,\n validity,\n nullCount: validity === null ? 0 : length,\n dictionary: null,\n offsets: null,\n utf8: null,\n strings: null,\n child: null,\n values: null\n };\n}\nfunction childMeta(meta) {\n if (meta.itemDtype === null || meta.itemComponents === null) {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `column \"${meta.name}\" is not a list`, {\n column: meta.name,\n field: \"itemDtype\"\n });\n }\n return resolveColumnMeta(`${meta.name}.item`, meta.domain, {\n dtype: meta.itemDtype,\n components: meta.itemComponents,\n nullable: false,\n refersTo: meta.refersTo ?? void 0\n });\n}\nfunction isUnsetEntry(value, dtype) {\n return value === void 0 || value === null && dtype !== \"json\";\n}\nfunction listPartsFromValues(meta, rows) {\n const offsets = new Uint32Array(rows.length + 1);\n const items = [];\n for (let row = 0; row < rows.length; row++) {\n for (const item of rows[row]) {\n items.push(item);\n }\n offsets[row + 1] = items.length;\n }\n const child = columnOfValues(childMeta(meta), items);\n return { offsets, child };\n}\nfunction columnOfValues(meta, values) {\n const { length } = values;\n const { dtype, components, fill, name } = meta;\n let validity = null;\n let nullCount = 0;\n for (let row = 0; row < length; row++) {\n if (isUnsetEntry(values[row], dtype)) {\n if (!meta.nullable) {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `row ${row} of non-nullable column \"${name}\" is unset`, {\n column: name,\n row\n });\n }\n validity ??= makeBitmap(length, true);\n bitmapClear(validity, row);\n nullCount++;\n }\n }\n const parts = emptyParts(meta, length, validity);\n parts.nullCount = nullCount;\n const isSet = (row) => validity === null || bitmapGet(validity, row);\n switch (dtype) {\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\": {\n const data = allocNumeric(dtype, length * components);\n if (fill !== 0) {\n data.fill(fill);\n }\n for (let row = 0; row < length; row++) {\n if (!isSet(row)) {\n continue;\n }\n const raw = values[row];\n const value = typeof raw === \"boolean\" ? Number(raw) : raw;\n writeNumeric(dtype, data, row * components, components, value, name, row);\n }\n parts.data = data;\n break;\n }\n case \"bool\": {\n const data = makeBitmap(length, fill === true);\n for (let row = 0; row < length; row++) {\n if (!isSet(row)) {\n continue;\n }\n const value = coerceValue(values[row], \"bool\");\n if (value === true) {\n bitmapSet(data, row);\n } else {\n bitmapClear(data, row);\n }\n }\n parts.data = data;\n break;\n }\n case \"dict\": {\n const dictionary = seedDictionary(meta);\n const codes = new Uint32Array(length);\n if (validity !== null) {\n codes.fill(fillCode(dictionary, fill));\n }\n for (let row = 0; row < length; row++) {\n if (!isSet(row)) {\n continue;\n }\n const value = coerceValue(values[row], \"string\");\n if (typeof value !== \"string\") {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `row ${row} of dict column \"${name}\" is not a string`, {\n column: name,\n row\n });\n }\n codes[row] = dictionary.intern(value);\n }\n parts.data = codes;\n parts.dictionary = dictionary.values;\n break;\n }\n case \"string\": {\n const fillText = typeof fill === \"string\" ? fill : \"\";\n const strings = new Array(length);\n for (let row = 0; row < length; row++) {\n if (!isSet(row)) {\n strings[row] = fillText;\n continue;\n }\n const value = coerceValue(values[row], \"string\");\n if (typeof value !== \"string\") {\n throw new GraphFormatError(\n \"E_COLUMN_TYPE\",\n `row ${row} of string column \"${name}\" is not a string`,\n { column: name, row }\n );\n }\n assertWellFormedString(value, { column: name, row });\n strings[row] = value;\n }\n parts.strings = strings;\n break;\n }\n case \"list\": {\n const rows = new Array(length);\n for (let row = 0; row < length; row++) {\n if (!isSet(row)) {\n rows[row] = [];\n continue;\n }\n const value = values[row];\n if (!Array.isArray(value)) {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `row ${row} of list column \"${name}\" is not an array`, {\n column: name,\n row\n });\n }\n rows[row] = value;\n }\n const listParts = listPartsFromValues(meta, rows);\n parts.offsets = listParts.offsets;\n parts.child = listParts.child;\n break;\n }\n case \"json\": {\n const out = new Array(length);\n for (let row = 0; row < length; row++) {\n if (!isSet(row)) {\n out[row] = void 0;\n continue;\n }\n assertJsonValue(values[row], `row ${row}`);\n out[row] = values[row];\n }\n parts.values = out;\n break;\n }\n default: {\n const dtypeName = dtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${dtypeName}`, { dtype: dtypeName });\n }\n }\n return createColumn(parts);\n}\nfunction allocNumeric(dtype, length) {\n switch (dtype) {\n case \"f32\":\n return new Float32Array(length);\n case \"f64\":\n return new Float64Array(length);\n case \"i32\":\n return new Int32Array(length);\n case \"u32\":\n return new Uint32Array(length);\n case \"u8\":\n return allocU8(length);\n default: {\n const name = dtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${name}`, { dtype: name });\n }\n }\n}\nfunction inferDeclFromValues(values) {\n let sawArray = false;\n let sawOther = false;\n for (const value of values) {\n if (value === void 0 || value === null) {\n continue;\n }\n if (Array.isArray(value)) {\n sawArray = true;\n } else {\n sawOther = true;\n }\n }\n if (sawArray && !sawOther) {\n const items = [];\n for (const value of values) {\n if (Array.isArray(value)) {\n for (const item of value) {\n items.push(item);\n }\n }\n }\n return { dtype: \"list\", itemDtype: inferValuesDtype(items) ?? \"json\" };\n }\n return { dtype: inferValuesDtype(values) ?? \"json\", itemDtype: void 0 };\n}\nfunction columnFromValues(domain, length, name, values, decl) {\n if (values.length !== length) {\n throw new GraphFormatError(\"E_COLUMN_LENGTH\", `column \"${name}\": ${values.length} values for ${length} rows`, {\n column: name,\n expected: length,\n found: values.length\n });\n }\n let patch = { nullable: true, ...decl };\n if (patch.dtype === void 0) {\n const inferred = inferDeclFromValues(values);\n patch = { ...patch, dtype: inferred.dtype };\n if (inferred.dtype === \"list\" && patch.itemDtype === void 0) {\n patch = { ...patch, itemDtype: inferred.itemDtype };\n }\n }\n const meta = resolveColumnMeta(name, domain, patch);\n return columnOfValues(meta, values);\n}\nfunction dtypeOfArray(data) {\n if (data instanceof Float32Array) {\n return \"f32\";\n }\n if (data instanceof Float64Array) {\n return \"f64\";\n }\n if (data instanceof Int32Array) {\n return \"i32\";\n }\n if (data instanceof Uint32Array) {\n return \"u32\";\n }\n return \"u8\";\n}\nfunction columnFromTypedArray(domain, length, name, data, decl, adopt = \"copy\") {\n const arrayDtype = dtypeOfArray(data);\n const dtype = decl.dtype ?? arrayDtype;\n const compatible = dtype === arrayDtype || arrayDtype === \"u32\" && (dtype === \"bool\" || dtype === \"dict\");\n if (!compatible) {\n throw new GraphFormatError(\n \"E_COLUMN_TYPE\",\n `column \"${name}\": a ${arrayDtype} array cannot back a ${dtype} column`,\n {\n column: name,\n field: \"dtype\",\n found: arrayDtype,\n expected: dtype\n }\n );\n }\n const meta = resolveColumnMeta(name, domain, { nullable: false, ...decl, dtype });\n const parts = emptyParts(meta, length, null);\n let expected;\n switch (dtype) {\n case \"bool\":\n expected = bitmapWordCount(length);\n break;\n case \"dict\":\n expected = length;\n break;\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\":\n expected = length * meta.components;\n break;\n default: {\n const dtypeName = dtype;\n throw new GraphFormatError(\n \"E_COLUMN_TYPE\",\n `column \"${name}\": a ${dtypeName} column cannot adopt a typed array`,\n {\n column: name,\n field: \"dtype\"\n }\n );\n }\n }\n if (data.length !== expected) {\n throw new GraphFormatError(\n \"E_COLUMN_LENGTH\",\n `column \"${name}\": array length ${data.length}, expected ${expected}`,\n {\n column: name,\n expected,\n found: data.length\n }\n );\n }\n if (!isOverPlainBuffer(data)) {\n const reason = data.buffer instanceof ArrayBuffer ? \"resizable ArrayBuffer\" : \"SharedArrayBuffer\";\n throw new GraphFormatError(\"E_UNSUPPORTED\", `column \"${name}\": a view over a ${reason} cannot be adopted`, {\n column: name,\n reason\n });\n }\n let stored = data;\n if (data instanceof Uint8Array && !canViewAsPaddedU32(data)) {\n if (adopt === \"strict\") {\n throw new GraphFormatError(\n \"E_COLUMN_ALIGNMENT\",\n `column \"${name}\": no zero-copy padded u32 view over the u8 array`,\n {\n column: name,\n byteOffset: data.byteOffset,\n byteLength: data.byteLength,\n bufferByteLength: data.buffer.byteLength\n }\n );\n }\n const copy = allocU8(data.length);\n copy.set(data);\n stored = copy;\n }\n parts.data = stored;\n if (dtype === \"dict\") {\n const dictionary = seedDictionary(meta);\n for (let row = 0; row < length; row++) {\n const code = data[row];\n if (code >= dictionary.size) {\n throw new GraphFormatError(\n \"E_COLUMN_TYPE\",\n `column \"${name}\": code ${code} at row ${row} is outside the ${dictionary.size} declared options`,\n { column: name, row, code }\n );\n }\n }\n parts.dictionary = dictionary.values;\n }\n return createColumn(parts);\n}\nfunction assertOneOf(field, value, allowed) {\n if (value === void 0) {\n return void 0;\n }\n if (typeof value !== \"string\" || !allowed.includes(value)) {\n throw new GraphFormatError(\n \"E_UNSUPPORTED\",\n `option ${field} has an unsupported value ${describeOption(value)}`,\n {\n field,\n found: value,\n reason: \"unsupported option\"\n }\n );\n }\n return value;\n}\nfunction describeOption(value) {\n if (typeof value === \"string\") {\n return JSON.stringify(value.length > 40 ? `${value.slice(0, 37)}...` : value);\n }\n if (typeof value === \"number\" || typeof value === \"boolean\" || value === null) {\n return String(value);\n }\n return `a ${typeof value}`;\n}\nconst WEIGHT_REDUCERS = [\"first\", \"last\", \"sum\", \"min\", \"max\"];\nconst COLUMN_REDUCERS = [...WEIGHT_REDUCERS, \"mean\", \"count\", \"drop\"];\nfunction describeId(id) {\n if (typeof id === \"number\") {\n return String(id);\n }\n if (typeof id === \"string\") {\n const text = id.length > 40 ? `${id.slice(0, 37)}...` : id;\n return JSON.stringify(text);\n }\n if (id === null) {\n return \"null\";\n }\n if (typeof id === \"bigint\") {\n return `${String(id)}n`;\n }\n return `a value of type ${typeof id}`;\n}\nfunction validateNodeId(id) {\n if (typeof id === \"number\") {\n if (!Number.isFinite(id)) {\n throw new GraphFormatError(\"E_INVALID_ID\", `invalid node id ${String(id)}: not a finite number`, {\n id,\n reason: \"non-finite\"\n });\n }\n return id === 0 ? 0 : id;\n }\n if (typeof id === \"string\") {\n if (hasLoneSurrogate(id)) {\n throw new GraphFormatError(\"E_INVALID_ID\", `invalid node id ${describeId(id)}: lone surrogate`, {\n id,\n reason: \"lone surrogate\"\n });\n }\n return id;\n }\n throw new GraphFormatError(\"E_INVALID_ID\", `invalid node id: ${describeId(id)} is not a string or a number`, {\n reason: \"unsupported type\",\n type: typeof id\n });\n}\nconst INTERNALS = /* @__PURE__ */ new WeakMap();\nfunction storageOf(map) {\n const storage = INTERNALS.get(map);\n if (storage === void 0) {\n throw new GraphFormatError(\"E_UNSUPPORTED\", \"not a NodeIdMap of this package\", { reason: \"foreign id map\" });\n }\n return storage;\n}\nfunction makeStorage(kind, size, slots = {}) {\n return {\n kind,\n size,\n offset: 0,\n denseValues: null,\n denseInverse: null,\n decoded: null,\n numbers: null,\n tags: null,\n strings: null,\n map: null,\n stringIndex: null,\n ...slots\n };\n}\nfunction storageDetached(storage) {\n if (storage.size === 0) {\n return false;\n }\n return storage.denseValues !== null && storage.denseValues.length === 0 || storage.decoded === null && storage.numbers !== null && storage.numbers.length === 0 || storage.decoded === null && storage.tags !== null && storage.tags.length === 0 || storage.decoded === null && storage.strings !== null && storage.strings.detached;\n}\nfunction idMapDetached(map) {\n const storage = INTERNALS.get(map);\n return storage !== void 0 && storageDetached(storage);\n}\nfunction normaliseZero(value) {\n return value === 0 ? 0 : value;\n}\nfunction duplicateIdError(id, first, second) {\n return new GraphFormatError(\n \"E_DUPLICATE_ID\",\n `duplicate node id ${describeId(id)} at indices ${first} and ${second}`,\n {\n id,\n indices: [first, second]\n }\n );\n}\nfunction bijectionError(reason, details) {\n return new GraphFormatError(\"E_INVALID_SNAPSHOT\", `id map violates invariant I11: ${reason}`, {\n invariant: \"I11\",\n reason,\n ...details\n });\n}\nfunction layoutError(ref, reason, details = {}) {\n return new GraphFormatError(\"E_BAD_SERIALIZATION\", `${ref}: ${reason}`, { ref, reason, ...details });\n}\nfunction buildDenseInverse(values, maxId, onDuplicate) {\n const inverse = new Uint32Array(maxId + 1).fill(INVALID_INDEX);\n for (let i = 0; i < values.length; i++) {\n const id = values[i];\n if (inverse[id] !== INVALID_INDEX) {\n throw onDuplicate(id, inverse[id], i);\n }\n inverse[id] = i;\n }\n return inverse;\n}\nfunction buildReverseMap(ids, size, onDuplicate) {\n const map = /* @__PURE__ */ new Map();\n for (let i = 0; i < size; i++) {\n const id = ids[i];\n const seen = map.get(id);\n if (seen !== void 0) {\n throw onDuplicate(id, seen, i);\n }\n map.set(id, i);\n }\n return map;\n}\nfunction scanIds(ids, size) {\n let allNumbers = true;\n let allStrings = true;\n let allDenseIntegers = true;\n let maxId = -1;\n let offset = 0;\n let identity = true;\n if (size > 0) {\n const first = ids[0];\n if (typeof first === \"number\" && Number.isSafeInteger(first)) {\n offset = first;\n } else {\n identity = false;\n }\n }\n for (let i = 0; i < size; i++) {\n const id = ids[i];\n if (typeof id === \"number\") {\n allStrings = false;\n if (identity && id !== i + offset) {\n identity = false;\n }\n if (allDenseIntegers) {\n if (Number.isInteger(id) && id >= 0 && id < MAX_COUNT) {\n if (id > maxId) {\n maxId = id;\n }\n } else {\n allDenseIntegers = false;\n }\n }\n } else {\n allNumbers = false;\n identity = false;\n allDenseIntegers = false;\n }\n }\n if (!allNumbers) {\n maxId = -1;\n }\n return { allNumbers, allStrings, identity, offset, allDenseIntegers, maxId };\n}\nfunction kindOf(scan, size) {\n if (size === 0 || scan.identity) {\n return \"identity\";\n }\n if (scan.allDenseIntegers && scan.maxId + 1 <= 2 * size) {\n return \"dense\";\n }\n if (scan.allNumbers) {\n return \"numeric\";\n }\n if (scan.allStrings) {\n return \"string\";\n }\n return \"mixed\";\n}\nfunction denseValuesOf(ids, size) {\n const values = new Uint32Array(size);\n for (let i = 0; i < size; i++) {\n const id = ids[i];\n values[i] = typeof id === \"number\" ? id : INVALID_INDEX;\n }\n return values;\n}\nclass NodeIdMap {\n /**\n * Wrap a prepared storage record. Sibling modules use the factories of this module instead.\n * @param storage - the storage; the kind's slots must be filled as documented on NodeIdMapStorage\n * @internal\n */\n constructor(storage) {\n this.kind = storage.kind;\n this.size = storage.size;\n this.offset = storage.kind === \"identity\" ? storage.offset : 0;\n this.storage = storage;\n INTERNALS.set(this, storage);\n Object.freeze(this);\n }\n /**\n * The id of a node index.\n * @param index - the node index\n * @returns the id; E_INDEX_RANGE when index is not an integer in [0, size)\n */\n idOf(index) {\n if (!(index >= 0 && index < this.size) || !Number.isInteger(index)) {\n throw new GraphFormatError(\"E_INDEX_RANGE\", `node index ${index} out of range (size ${this.size})`, {\n index,\n size: this.size\n });\n }\n return this.idAt(index);\n }\n /**\n * Total lookup by id: SameValueZero, never coerces, so `indexOf(\"1\")` misses a map of numbers.\n * @param id - the node id\n * @returns the node index, or INVALID_INDEX when absent\n */\n indexOf(id) {\n const { storage } = this;\n switch (storage.kind) {\n case \"identity\": {\n if (typeof id !== \"number\") {\n return INVALID_INDEX;\n }\n const index = id - storage.offset;\n if (!Number.isInteger(index) || index < 0 || index >= storage.size) {\n return INVALID_INDEX;\n }\n return index === 0 ? 0 : index;\n }\n case \"dense\": {\n const inverse = storage.denseInverse;\n if (typeof id !== \"number\" || !Number.isInteger(id) || id < 0 || id >= inverse.length) {\n return INVALID_INDEX;\n }\n return inverse[id];\n }\n case \"numeric\":\n case \"string\":\n case \"mixed\": {\n const index = this.reverseMap().get(id);\n return index === void 0 || index >= storage.size ? INVALID_INDEX : index;\n }\n default:\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown id map kind ${String(storage.kind)}`, {\n kind: storage.kind\n });\n }\n }\n /**\n * Whether an id is present.\n * @param id - the node id\n * @returns true when present\n */\n has(id) {\n return this.indexOf(id) !== INVALID_INDEX;\n }\n /**\n * Checked lookup by id, for algorithms that today throw \"node not found\".\n * @param id - the node id\n * @returns the node index; E_UNKNOWN_NODE when absent\n */\n requireIndex(id) {\n const index = this.indexOf(id);\n if (index === INVALID_INDEX) {\n throw new GraphFormatError(\"E_UNKNOWN_NODE\", `unknown node id ${describeId(id)}`, { id });\n }\n return index;\n }\n /**\n * Bulk lookup.\n * @param ids - the ids to resolve\n * @param onMissing - \"invalid\" (default) writes INVALID_INDEX for a miss; \"throw\" raises E_UNKNOWN_NODE\n * @returns a fresh U32 of indices in input order\n */\n indicesOf(ids, onMissing = \"invalid\") {\n assertOneOf(\"onMissing\", onMissing, [\"invalid\", \"throw\"]);\n const lookup = onMissing === \"throw\" ? (id) => this.requireIndex(id) : (id) => this.indexOf(id);\n if (Array.isArray(ids)) {\n const list = ids;\n const out2 = new Uint32Array(list.length);\n for (let i = 0; i < list.length; i++) {\n out2[i] = lookup(list[i]);\n }\n return out2;\n }\n let out = new Uint32Array(16);\n let count = 0;\n for (const id of ids) {\n if (count === out.length) {\n const grown = new Uint32Array(out.length * 2);\n grown.set(out);\n out = grown;\n }\n out[count++] = lookup(id);\n }\n return out.slice(0, count);\n }\n /**\n * Bulk decode of a range of ids in one pass. Bounds follow Array.prototype.slice (negative values\n * count from the end, out-of-range values are clamped).\n * @param start - first index (default 0)\n * @param end - one past the last index (default size)\n * @returns a fresh array of the ids in index order\n */\n idsSlice(start = 0, end = this.size) {\n const [from, to] = resolveRange(start, end, this.size);\n const { storage } = this;\n this.assertAttached();\n switch (storage.kind) {\n case \"identity\": {\n const out = new Array(to - from);\n for (let i = from; i < to; i++) {\n out[i - from] = i + storage.offset;\n }\n return out;\n }\n case \"dense\":\n return Array.from(storage.denseValues.subarray(from, to));\n case \"numeric\":\n if (storage.decoded !== null) {\n return storage.decoded.slice(from, to);\n }\n return Array.from(storage.numbers.subarray(from, to), normaliseZero);\n case \"string\":\n return storage.strings.slice(from, to);\n case \"mixed\": {\n if (storage.decoded !== null) {\n return storage.decoded.slice(from, to);\n }\n const tags = storage.tags;\n const numbers = storage.numbers;\n const strings = storage.strings;\n const out = new Array(to - from);\n for (let i = from; i < to; i++) {\n out[i - from] = tags[i] === 0 ? normaliseZero(numbers[i]) : strings.at(i);\n }\n return out;\n }\n default:\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown id map kind ${String(storage.kind)}`, {\n kind: storage.kind\n });\n }\n }\n /**\n * Every id in index order.\n * @returns a fresh array\n */\n toArray() {\n return this.idsSlice(0, this.size);\n }\n /**\n * Iterate the ids in index order.\n * @yields each id, decoding lazily\n */\n *[Symbol.iterator]() {\n for (let i = 0; i < this.size; i++) {\n yield this.idAt(i);\n }\n }\n /**\n * Key an index-aligned result vector by id (boundary helper, decision C11).\n * @param values - one value per node index\n * @returns a Map from id to value, in index order\n */\n toMap(values) {\n const out = /* @__PURE__ */ new Map();\n for (let i = 0; i < this.size; i++) {\n out.set(this.idAt(i), values[i]);\n }\n return out;\n }\n /**\n * Key an index-aligned result vector by String(id), for legacy Map<string, T> result shapes. When\n * two ids share a string form (1 and \"1\") the HIGHER index wins, exactly as the legacy\n * algorithms' assignment in node order does (design section 14.2).\n * @param values - one value per node index\n * @returns a Map from String(id) to value\n */\n toStringMap(values) {\n const out = /* @__PURE__ */ new Map();\n for (let i = 0; i < this.size; i++) {\n out.set(String(this.idAt(i)), values[i]);\n }\n return out;\n }\n /**\n * Key an index-aligned result vector by String(id), for legacy record result shapes only. The\n * record has a null prototype so ids such as \"__proto__\" are ordinary keys; when two ids share a\n * string form the HIGHER index wins (the legacy assignment order, design section 14.2).\n * @param values - one value per node index\n * @returns a record from String(id) to value\n */\n toRecord(values) {\n const out = /* @__PURE__ */ Object.create(null);\n for (let i = 0; i < this.size; i++) {\n out[String(this.idAt(i))] = values[i];\n }\n return out;\n }\n /**\n * Iterate [id, value] pairs of an index-aligned result vector.\n * @param values - one value per node index\n * @yields the pairs in index order\n */\n *entries(values) {\n for (let i = 0; i < this.size; i++) {\n yield [this.idAt(i), values[i]];\n }\n }\n /**\n * String(idOf(i)) -> i, built lazily once, for legacy string-typed id parameters. When two ids\n * share a string form (always one number and one string, since ids are distinct) the STRING id\n * wins: a legacy string parameter \"1\" addressed the node whose id is the string \"1\".\n * @returns the read-only string index\n */\n stringIndex() {\n const { storage } = this;\n if (storage.stringIndex === null) {\n const index = /* @__PURE__ */ new Map();\n for (let i = 0; i < storage.size; i++) {\n const id = this.idAt(i);\n const key = String(id);\n if (typeof id === \"string\" || !index.has(key)) {\n index.set(key, i);\n }\n }\n storage.stringIndex = index;\n }\n return storage.stringIndex;\n }\n /**\n * Bytes of typed storage currently materialised; excludes the reverse Map and JS strings.\n * @returns the byte count\n */\n byteLength() {\n const { storage } = this;\n let bytes = 0;\n if (storage.denseValues !== null) {\n bytes += storage.denseValues.byteLength;\n }\n if (storage.denseInverse !== null) {\n bytes += storage.denseInverse.byteLength;\n }\n if (storage.numbers !== null) {\n bytes += storage.numbers.byteLength;\n }\n if (storage.tags !== null) {\n bytes += storage.tags.byteLength;\n }\n if (storage.strings !== null) {\n bytes += storage.strings.byteLength();\n }\n return bytes;\n }\n /**\n * Unchecked id of an in-range index.\n * @param index - a node index in [0, size)\n * @returns the id\n */\n idAt(index) {\n const { storage } = this;\n this.assertAttached();\n switch (storage.kind) {\n case \"identity\":\n return index + storage.offset;\n case \"dense\":\n return storage.denseValues[index];\n case \"numeric\":\n return storage.decoded !== null ? storage.decoded[index] : normaliseZero(storage.numbers[index]);\n case \"string\":\n return storage.strings.at(index);\n case \"mixed\":\n if (storage.decoded !== null) {\n return storage.decoded[index];\n }\n return storage.tags[index] === 0 ? normaliseZero(storage.numbers[index]) : storage.strings.at(index);\n default:\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown id map kind ${String(storage.kind)}`, {\n kind: storage.kind\n });\n }\n }\n /**\n * E_DETACHED when a typed array the map reads from was transferred away (design sections 9.1\n * and 11.3): derived from the array state (a transferred buffer leaves zero-length views).\n */\n assertAttached() {\n if (storageDetached(this.storage)) {\n throw new GraphFormatError(\"E_DETACHED\", \"the id map's storage was transferred away\", {\n kind: this.storage.kind\n });\n }\n }\n /**\n * The reverse map of a numeric / string / mixed map, built on first use (one pass over the ids,\n * after a bulk decode of a wire-decoded Utf8 store) when it was not shared by the builder.\n * @returns the map from id to index\n */\n reverseMap() {\n const { storage } = this;\n if (storage.map === null) {\n this.assertAttached();\n if (storage.decoded === null && storage.strings !== null) {\n storage.strings.materialiseDecoded();\n }\n const map = /* @__PURE__ */ new Map();\n for (let i = 0; i < storage.size; i++) {\n map.set(this.idAt(i), i);\n }\n storage.map = map;\n }\n return storage.map;\n }\n}\nfunction identityNodeIdMap(size, offset = 0) {\n if (!Number.isInteger(size) || size < 0 || size > MAX_COUNT) {\n throw new GraphFormatError(\"E_TOO_LARGE\", `node count ${size} is not an integer in [0, MAX_COUNT]`, {\n count: size,\n max: MAX_COUNT\n });\n }\n if (!Number.isSafeInteger(offset)) {\n throw new GraphFormatError(\"E_INVALID_ID\", `identity offset ${offset} is not a safe integer`, {\n offset,\n reason: \"non-integer offset\"\n });\n }\n return new NodeIdMap(makeStorage(\"identity\", size, { offset }));\n}\nfunction nodeIdMapFromIds(ids, size = ids.length, options = {}) {\n if (!Number.isInteger(size) || size < 0 || size > MAX_COUNT) {\n throw new GraphFormatError(\"E_TOO_LARGE\", `node count ${size} is not an integer in [0, MAX_COUNT]`, {\n count: size,\n max: MAX_COUNT\n });\n }\n const trusted = options.map !== void 0 || options.validate === false;\n let source = ids;\n if (!trusted) {\n const copy = new Array(size);\n for (let i = 0; i < size; i++) {\n copy[i] = validateNodeId(ids[i]);\n }\n source = copy;\n }\n const scan = scanIds(source, size);\n const kind = kindOf(scan, size);\n switch (kind) {\n case \"identity\":\n return new NodeIdMap(makeStorage(\"identity\", size, { offset: size === 0 ? 0 : scan.offset }));\n case \"dense\": {\n const denseValues = denseValuesOf(source, size);\n const denseInverse = buildDenseInverse(denseValues, scan.maxId, duplicateIdError);\n return new NodeIdMap(makeStorage(\"dense\", size, { denseValues, denseInverse }));\n }\n case \"numeric\":\n case \"mixed\": {\n const map = options.map ?? (trusted ? null : buildReverseMap(source, size, duplicateIdError));\n return new NodeIdMap(makeStorage(kind, size, { decoded: source, map }));\n }\n case \"string\": {\n const map = options.map ?? (trusted ? null : buildReverseMap(source, size, duplicateIdError));\n const strings = Utf8Store.fromStrings(source, size);\n return new NodeIdMap(makeStorage(\"string\", size, { strings, map }));\n }\n default:\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown id map kind ${String(kind)}`, { kind });\n }\n}\nfunction nodeIdMapFromF64(values, options = {}) {\n const size = values.length;\n if (size > MAX_COUNT) {\n throw new GraphFormatError(\"E_TOO_LARGE\", `node count ${size} exceeds MAX_COUNT`, {\n count: size,\n max: MAX_COUNT\n });\n }\n const validate = options.validate !== false;\n let numbers = values;\n if (validate) {\n let negativeZero = false;\n for (let i = 0; i < size; i++) {\n const v = values[i];\n if (!Number.isFinite(v)) {\n throw new GraphFormatError(\n \"E_INVALID_ID\",\n `invalid node id ${String(v)} at index ${i}: not a finite number`,\n {\n id: v,\n index: i,\n reason: \"non-finite\"\n }\n );\n }\n if (Object.is(v, -0)) {\n negativeZero = true;\n }\n }\n if (negativeZero) {\n numbers = values.slice();\n for (let i = 0; i < size; i++) {\n if (numbers[i] === 0) {\n numbers[i] = 0;\n }\n }\n }\n }\n const scan = scanIds(numbers, size);\n const kind = kindOf(scan, size);\n switch (kind) {\n case \"identity\":\n return new NodeIdMap(makeStorage(\"identity\", size, { offset: size === 0 ? 0 : scan.offset }));\n case \"dense\": {\n const denseValues = denseValuesOf(numbers, size);\n const denseInverse = buildDenseInverse(denseValues, scan.maxId, duplicateIdError);\n return new NodeIdMap(makeStorage(\"dense\", size, { denseValues, denseInverse }));\n }\n case \"numeric\": {\n const map = validate ? buildReverseMap(numbers, size, duplicateIdError) : null;\n return new NodeIdMap(makeStorage(\"numeric\", size, { numbers, map }));\n }\n default:\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unexpected id map kind ${kind} for numeric ids`, { kind });\n }\n}\nfunction idMapBuffers(map) {\n const storage = INTERNALS.get(map);\n const out = /* @__PURE__ */ new Set();\n if (storage === void 0) {\n return [];\n }\n for (const view of [storage.denseValues, storage.denseInverse, storage.numbers, storage.tags]) {\n if (view !== null) {\n out.add(view.buffer);\n }\n }\n if (storage.strings !== null && storage.strings.encoded) {\n out.add(storage.strings.offsets.buffer);\n out.add(storage.strings.utf8.buffer);\n }\n return [...out];\n}\nfunction nodeIdMapFromTyped(parts, validate = \"structure\") {\n const { kind, size } = parts;\n const structure = validate !== \"none\";\n const full = validate === \"full\";\n if (structure && (!Number.isInteger(size) || size < 0 || size > MAX_COUNT)) {\n throw layoutError(\"ids.size\", `size ${size} is not an integer in [0, MAX_COUNT]`, { found: size });\n }\n switch (kind) {\n case \"identity\": {\n if (!Number.isSafeInteger(parts.offset) || size > 0 && !Number.isSafeInteger(parts.offset + size - 1)) {\n const reason = `offset ${parts.offset} with ${size} ids leaves the safe-integer range`;\n throw full ? bijectionError(reason, { found: parts.offset, size }) : layoutError(\"ids.offset\", reason, { found: parts.offset, size });\n }\n return new NodeIdMap(makeStorage(\"identity\", size, { offset: normaliseZero(parts.offset) }));\n }\n case \"dense\": {\n const { values } = parts;\n if (!(values instanceof Uint32Array)) {\n throw layoutError(\"ids.values\", \"a dense id map needs u32 values\");\n }\n if (structure && values.length !== size) {\n throw layoutError(\"ids.values\", `expected ${size} values, found ${values.length}`, {\n expected: size,\n found: values.length\n });\n }\n let maxId = -1;\n for (let i = 0; i < values.length; i++) {\n if (values[i] > maxId) {\n maxId = values[i];\n }\n }\n if (maxId >= MAX_COUNT) {\n throw layoutError(\"ids.values\", `dense id ${maxId} is not below MAX_COUNT`, { found: maxId });\n }\n if (maxId + 1 > 2 * Math.max(size, values.length)) {\n throw layoutError(\"ids.values\", `dense bound violated: max id ${maxId} with ${size} nodes`, {\n maxId,\n size\n });\n }\n const denseInverse = buildDenseInverse(\n values,\n maxId,\n (id, first, second) => bijectionError(`duplicate id ${id}`, { id, indices: [first, second] })\n );\n return new NodeIdMap(makeStorage(\"dense\", size, { denseValues: values, denseInverse }));\n }\n case \"numeric\": {\n const numbers = parts.values;\n if (!(numbers instanceof Float64Array)) {\n throw layoutError(\"ids.values\", \"a numeric id map needs f64 values\");\n }\n if (structure && numbers.length !== size) {\n throw layoutError(\"ids.values\", `expected ${size} values, found ${numbers.length}`, {\n expected: size,\n found: numbers.length\n });\n }\n let map = null;\n if (full) {\n for (let i = 0; i < size; i++) {\n if (!Number.isFinite(numbers[i])) {\n throw bijectionError(`non-finite id at index ${i}`, { index: i, id: numbers[i] });\n }\n }\n map = buildReverseMap(\n numbers,\n size,\n (id, first, second) => bijectionError(`duplicate id ${describeId(id)}`, { id, indices: [first, second] })\n );\n }\n return new NodeIdMap(makeStorage(\"numeric\", size, { numbers, map }));\n }\n case \"string\": {\n const { offsets, utf8 } = parts;\n if (offsets === null || utf8 === null) {\n throw layoutError(\"ids.offsets\", \"a string id map needs offsets and utf8\");\n }\n if (structure) {\n checkUtf8Layout(offsets, utf8, size, \"ids.offsets\");\n }\n const strings = Utf8Store.fromEncoded(offsets, utf8);\n let map = null;\n if (full) {\n const bad = strings.firstMalformedRow();\n if (bad !== -1) {\n throw bijectionError(`malformed UTF-8 in id at index ${bad}`, { index: bad });\n }\n map = buildReverseMap(\n strings.decodeAll(),\n size,\n (id, first, second) => bijectionError(`duplicate id ${describeId(id)}`, { id, indices: [first, second] })\n );\n }\n return new NodeIdMap(makeStorage(\"string\", size, { strings, map }));\n }\n case \"mixed\": {\n const { tags, numbers, offsets, utf8 } = parts;\n if (tags === null || numbers === null || offsets === null || utf8 === null) {\n throw layoutError(\"ids.tags\", \"a mixed id map needs tags, numbers, offsets and utf8\");\n }\n if (structure) {\n if (tags.length !== size) {\n throw layoutError(\"ids.tags\", `expected ${size} tags, found ${tags.length}`, {\n expected: size,\n found: tags.length\n });\n }\n if (numbers.length !== size) {\n throw layoutError(\"ids.numbers\", `expected ${size} numbers, found ${numbers.length}`, {\n expected: size,\n found: numbers.length\n });\n }\n for (let i = 0; i < size; i++) {\n if (tags[i] > 1) {\n throw layoutError(\"ids.tags\", `tag ${tags[i]} at index ${i} is not 0 or 1`, {\n index: i,\n found: tags[i]\n });\n }\n }\n checkUtf8Layout(offsets, utf8, size, \"ids.offsets\");\n }\n const strings = Utf8Store.fromEncoded(offsets, utf8);\n let map = null;\n if (full) {\n const bad = strings.firstMalformedRow();\n if (bad !== -1) {\n throw bijectionError(`malformed UTF-8 in id at index ${bad}`, { index: bad });\n }\n const decoded = new Array(size);\n for (let i = 0; i < size; i++) {\n if (tags[i] === 0) {\n if (!Number.isFinite(numbers[i])) {\n throw bijectionError(`non-finite id at index ${i}`, { index: i, id: numbers[i] });\n }\n decoded[i] = numbers[i];\n } else {\n decoded[i] = strings.at(i);\n }\n }\n map = buildReverseMap(\n decoded,\n size,\n (id, first, second) => bijectionError(`duplicate id ${describeId(id)}`, { id, indices: [first, second] })\n );\n }\n return new NodeIdMap(makeStorage(\"mixed\", size, { tags, numbers, strings, map }));\n }\n default:\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown id map kind ${String(kind)}`, { kind });\n }\n}\nfunction nodeIdMapToTyped(map) {\n const storage = storageOf(map);\n const { kind, size } = storage;\n switch (kind) {\n case \"identity\":\n return {\n kind,\n size,\n offset: storage.offset,\n values: null,\n tags: null,\n numbers: null,\n offsets: null,\n utf8: null\n };\n case \"dense\":\n return {\n kind,\n size,\n offset: 0,\n values: storage.denseValues,\n tags: null,\n numbers: null,\n offsets: null,\n utf8: null\n };\n case \"numeric\": {\n if (storage.numbers === null) {\n const decoded = storage.decoded;\n const numbers = new Float64Array(size);\n for (let i = 0; i < size; i++) {\n const id = decoded[i];\n if (typeof id !== \"number\") {\n throw new GraphFormatError(\n \"E_INVALID_ID\",\n `numeric id map holds a ${typeof id} at index ${i}`,\n {\n index: i,\n found: typeof id\n }\n );\n }\n numbers[i] = id;\n }\n storage.numbers = numbers;\n claimHolder(numbers.buffer);\n }\n return {\n kind,\n size,\n offset: 0,\n values: storage.numbers,\n tags: null,\n numbers: null,\n offsets: null,\n utf8: null\n };\n }\n case \"string\": {\n const strings = storage.strings;\n return {\n kind,\n size,\n offset: 0,\n values: null,\n tags: null,\n numbers: null,\n offsets: strings.offsets,\n utf8: strings.utf8\n };\n }\n case \"mixed\": {\n if (storage.tags === null || storage.numbers === null || storage.strings === null) {\n const decoded = storage.decoded;\n const tags = new Uint8Array(size);\n const numbers = new Float64Array(size);\n for (let i = 0; i < size; i++) {\n const id = decoded[i];\n if (typeof id === \"number\") {\n numbers[i] = id;\n } else {\n tags[i] = 1;\n }\n }\n const { offsets, utf8 } = encodeUtf8Rows(decoded, size);\n storage.tags = tags;\n storage.numbers = numbers;\n storage.strings = Utf8Store.fromEncoded(offsets, utf8);\n for (const buffer of [tags.buffer, numbers.buffer, offsets.buffer, utf8.buffer]) {\n claimHolder(buffer);\n }\n }\n return {\n kind,\n size,\n offset: 0,\n values: null,\n tags: storage.tags,\n numbers: storage.numbers,\n offsets: storage.strings.offsets,\n utf8: storage.strings.utf8\n };\n }\n default:\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown id map kind ${String(kind)}`, { kind });\n }\n}\nfunction gatherNodeIdMap(map, indexMap) {\n const n = indexMap.length;\n const ids = new Array(n);\n for (let i = 0; i < n; i++) {\n ids[i] = map.idOf(indexMap[i]);\n }\n return nodeIdMapFromIds(ids, n, { validate: false });\n}\nconst ID_TYPES$1 = /* @__PURE__ */ new Set([\"string\", \"integer\", \"mixed\"]);\nconst TIME_FORMATS$1 = /* @__PURE__ */ new Set([\n \"integer\",\n \"double\",\n \"date\",\n \"dateTime\"\n]);\nconst TIME_REPRESENTATIONS$1 = /* @__PURE__ */ new Set([\"interval\", \"timestamp\"]);\nconst MODES$1 = /* @__PURE__ */ new Set([\"static\", \"dynamic\", \"slice\"]);\nconst EMPTY_GRAPH_META = Object.freeze({\n name: null,\n description: null,\n creator: null,\n created: null,\n modified: null,\n keywords: Object.freeze([]),\n sourceFormat: null,\n sourceVersion: null,\n idType: null,\n timeFormat: null,\n timeRepresentation: null,\n mode: null,\n declaredMultigraph: null,\n weightOrigin: null,\n extra: Object.freeze({})\n});\nfunction metaError(field, found) {\n return new GraphFormatError(\"E_COLUMN_TYPE\", `meta.${field} has an unsupported value`, {\n field,\n found: typeof found\n });\n}\nfunction metaString(field, value) {\n if (value === null || typeof value === \"string\") {\n return value;\n }\n throw metaError(field, value);\n}\nfunction metaEnum(field, value, allowed) {\n if (value === null) {\n return null;\n }\n if (typeof value === \"string\" && allowed.has(value)) {\n return value;\n }\n throw metaError(field, value);\n}\nfunction metaOrigin(value) {\n if (value === null) {\n return null;\n }\n if (typeof value !== \"object\") {\n throw metaError(\"weightOrigin\", value);\n }\n const input = value;\n const field = (name) => {\n const v = input[name];\n if (v === void 0 || v === null) {\n return null;\n }\n if (typeof v !== \"string\") {\n throw metaError(`weightOrigin.${name}`, v);\n }\n return v;\n };\n return Object.freeze({\n format: field(\"format\"),\n id: field(\"id\"),\n title: field(\"title\"),\n type: field(\"type\"),\n namespace: field(\"namespace\")\n });\n}\nfunction resolveGraphMeta$1(current, patch) {\n const pick = (key, convert) => {\n const value = patch[key];\n return value === void 0 ? current[key] : convert(value);\n };\n return Object.freeze({\n name: pick(\"name\", (v) => metaString(\"name\", v)),\n description: pick(\"description\", (v) => metaString(\"description\", v)),\n creator: pick(\"creator\", (v) => metaString(\"creator\", v)),\n created: pick(\"created\", (v) => metaString(\"created\", v)),\n modified: pick(\"modified\", (v) => metaString(\"modified\", v)),\n keywords: pick(\"keywords\", (v) => {\n if (!Array.isArray(v) || v.some((k) => typeof k !== \"string\")) {\n throw metaError(\"keywords\", v);\n }\n return Object.freeze([...v]);\n }),\n sourceFormat: pick(\"sourceFormat\", (v) => metaString(\"sourceFormat\", v)),\n sourceVersion: pick(\"sourceVersion\", (v) => metaString(\"sourceVersion\", v)),\n idType: pick(\"idType\", (v) => metaEnum(\"idType\", v, ID_TYPES$1)),\n timeFormat: pick(\"timeFormat\", (v) => metaEnum(\"timeFormat\", v, TIME_FORMATS$1)),\n timeRepresentation: pick(\"timeRepresentation\", (v) => metaEnum(\"timeRepresentation\", v, TIME_REPRESENTATIONS$1)),\n mode: pick(\"mode\", (v) => metaEnum(\"mode\", v, MODES$1)),\n declaredMultigraph: pick(\"declaredMultigraph\", (v) => {\n if (v === null || typeof v === \"boolean\") {\n return v;\n }\n throw metaError(\"declaredMultigraph\", v);\n }),\n weightOrigin: pick(\"weightOrigin\", (v) => metaOrigin(v)),\n extra: pick(\"extra\", (v) => {\n const resolved = resolveColumnMeta(\"meta\", \"graph\", {\n dtype: \"json\",\n extra: v\n });\n return resolved.extra;\n })\n });\n}\nconst ALL_ONES = 4294967295;\nclass GrowableTypedArray {\n /**\n * Create an empty growable array.\n * @param ctor - the typed-array class of the elements (Uint32Array, Float32Array, ...)\n * @param options - initial capacity and buffer kind\n */\n constructor(ctor, options) {\n this.used = 0;\n this.ctor = ctor;\n this.resizable = options?.resizable ?? HAS_RESIZABLE_ARRAY_BUFFER;\n this.backing = this.allocate(options?.capacity ?? 0);\n }\n /**\n * The number of elements in use.\n * @returns the length\n */\n get length() {\n return this.used;\n }\n /**\n * The allocated element count; growth happens when length would exceed it.\n * @returns the capacity\n */\n get capacity() {\n return this.backing.length;\n }\n /**\n * The backing view over the whole capacity, for hot loops that index it directly. Its identity\n * changes whenever the array grows.\n * @returns the backing typed array\n */\n get array() {\n return this.backing;\n }\n /**\n * Append one element.\n * @param value - the element\n * @returns the index it was written at (the old length)\n */\n push(value) {\n const index = this.used;\n if (index >= this.backing.length) {\n this.backing = growTypedArray(this.backing, this.ctor, index + 1, this.resizable);\n }\n this.backing[index] = value;\n this.used = index + 1;\n return index;\n }\n /**\n * Append many elements at once (bulk addEdges input).\n * @param values - the elements, in order\n * @returns the index the first one was written at (the old length)\n */\n pushAll(values) {\n const index = this.used;\n const end = index + values.length;\n this.ensureCapacity(end);\n this.backing.set(values, index);\n this.used = end;\n return index;\n }\n /**\n * Read element i.\n * @param i - the index, below length\n * @returns the element\n */\n get(i) {\n return this.backing[i];\n }\n /**\n * Write element i.\n * @param i - the index, below length\n * @param value - the element\n */\n set(i, value) {\n this.backing[i] = value;\n }\n /**\n * Make sure at least `n` elements fit without a further reallocation.\n * @param n - the capacity to guarantee\n */\n ensureCapacity(n) {\n if (n > this.backing.length) {\n this.backing = growTypedArray(this.backing, this.ctor, n, this.resizable);\n }\n }\n /**\n * Set the length: growing fills the new elements with `fill` (the incidence lists grow with\n * INVALID_INDEX), shrinking drops the tail without releasing capacity.\n * @param length - the new length\n * @param fill - the value written into elements [old length, length); defaults to 0\n */\n resize(length, fill = 0) {\n if (length > this.used) {\n this.ensureCapacity(length);\n this.backing.fill(fill, this.used, length);\n }\n this.used = length;\n }\n /**\n * A zero-copy window over the elements in use. It aliases staging, so it is for the freeze passes\n * to read from and never for a snapshot to keep (invariant I18); it is invalidated by growth.\n * @returns a view of exactly `length` elements\n */\n view() {\n return new this.ctor(this.backing.buffer, 0, this.used);\n }\n /**\n * An exact-length copy over a fresh fixed-length ArrayBuffer: what a snapshot may keep, and what a\n * compaction writes back through.\n * @returns a new typed array of `length` elements\n */\n trim() {\n const out = new this.ctor(new ArrayBuffer(this.used * this.ctor.BYTES_PER_ELEMENT), 0, this.used);\n out.set(this.view());\n return out;\n }\n /**\n * Drop every element but keep the capacity (a builder reused after a merging freeze).\n */\n clear() {\n this.used = 0;\n }\n /**\n * Drop the elements and the backing storage (freeze({ release: true }) and dispose(), design\n * section 6.1). The array is usable again afterwards; the next push allocates.\n */\n release() {\n this.used = 0;\n this.backing = this.allocate(0);\n }\n /**\n * Allocate a backing view of at least `capacity` elements over a fresh staging buffer.\n * @param capacity - the element count wanted; 0 allocates an empty view over an empty buffer\n * @returns the view\n */\n allocate(capacity) {\n const bytesPerElement = this.ctor.BYTES_PER_ELEMENT;\n const byteLength = capacity === 0 ? 0 : stagingByteLength(roundUp(capacity, STAGING_ELEMENT_GRANULE), bytesPerElement);\n return new this.ctor(allocateStagingBuffer(byteLength, this.resizable), 0, byteLength / bytesPerElement);\n }\n}\nclass GrowableBitmap {\n /**\n * Create an empty bitmap.\n * @param options - initial capacity in bits and buffer kind\n */\n constructor(options) {\n this.bits = 0;\n this.words = new GrowableTypedArray(Uint32Array, {\n capacity: bitmapWordCount(options?.capacity ?? 0),\n resizable: options?.resizable\n });\n }\n /**\n * The number of bits in use.\n * @returns the length in bits\n */\n get length() {\n return this.bits;\n }\n /**\n * Append one bit.\n * @param value - the bit\n * @returns the index it was written at (the old length)\n */\n push(value) {\n const index = this.bits;\n if (index % 32 === 0) {\n this.words.push(0);\n }\n if (value) {\n bitmapWrite(this.words.array, index, true);\n }\n this.bits = index + 1;\n return index;\n }\n /**\n * Read bit i.\n * @param i - the bit index, below length\n * @returns true when set\n */\n get(i) {\n return bitmapGet(this.words.array, i);\n }\n /**\n * Write bit i.\n * @param i - the bit index, below length\n * @param value - the bit\n */\n set(i, value) {\n bitmapWrite(this.words.array, i, value);\n }\n /**\n * The number of set bits below length.\n * @returns the count\n */\n count() {\n return bitmapCount(this.words.array, this.bits);\n }\n /**\n * Set the length in bits: growing writes `fill` into the new bits, shrinking clears the dropped\n * bits so the trailing-bits-clear convention holds.\n * @param length - the new length in bits\n * @param fill - the value of bits [old length, length); defaults to false\n */\n resize(length, fill = false) {\n const oldBits = this.bits;\n this.words.resize(bitmapWordCount(length), 0);\n if (length < oldBits) {\n bitmapClearTrailing(this.words.array, length);\n } else if (fill && length > oldBits) {\n this.setRange(oldBits, length);\n }\n this.bits = length;\n }\n /**\n * Set every bit in [from, to): the ragged head and tail bit by bit, the whole words in between\n * with one fill.\n * @param from - the first bit to set\n * @param to - one past the last bit to set\n */\n setRange(from, to) {\n const { array } = this.words;\n let i = from;\n while (i < to && i % 32 !== 0) {\n bitmapSet(array, i++);\n }\n const fullEnd = to - to % 32;\n if (i < fullEnd) {\n array.fill(ALL_ONES, i / 32, fullEnd / 32);\n i = fullEnd;\n }\n while (i < to) {\n bitmapSet(array, i++);\n }\n }\n /**\n * A zero-copy window over the ceil(length / 32) words in use; aliases staging (invariant I18) and\n * is invalidated by growth.\n * @returns the words\n */\n view() {\n return this.words.view();\n }\n /**\n * An exact copy of the words in use over a fresh fixed-length ArrayBuffer: a validity bitmap or a\n * bool column's data a snapshot may keep.\n * @returns a new U32 of ceil(length / 32) words\n */\n trim() {\n return this.words.trim();\n }\n /**\n * Drop every bit but keep the capacity.\n */\n clear() {\n this.bits = 0;\n this.words.clear();\n }\n /**\n * Drop the bits and the backing storage.\n */\n release() {\n this.bits = 0;\n this.words.release();\n }\n}\nconst EMPTY_LIST = Object.freeze([]);\nfunction cellError(meta, row, message, found) {\n return new GraphFormatError(\"E_COLUMN_TYPE\", `row ${row} of ${meta.dtype} column \"${meta.name}\": ${message}`, {\n column: meta.name,\n domain: meta.domain,\n row,\n found\n });\n}\nfunction inferInitialDtype(value) {\n const dtype = inferValueDtype(value);\n if (dtype === null) {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", \"an unset value cannot start an inferred column\", {\n reason: \"unset\"\n });\n }\n return dtype;\n}\nfunction inferredEquivalent(dtype) {\n switch (dtype) {\n case \"bool\":\n return \"bool\";\n case \"i32\":\n case \"u8\":\n return \"i32\";\n case \"u32\":\n case \"f32\":\n case \"f64\":\n return \"f64\";\n case \"dict\":\n case \"string\":\n return \"string\";\n case \"list\":\n case \"json\":\n return \"json\";\n default: {\n const name = dtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${name}`, { dtype: name });\n }\n }\n}\nfunction checkListItem(meta, row, item) {\n const itemDtype = meta.itemDtype;\n const components = meta.itemComponents ?? 1;\n switch (itemDtype) {\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\": {\n if (components === 1) {\n if (typeof item !== \"number\" || !representableNumber(itemDtype, item)) {\n throw cellError(meta, row, `list item is not a representable ${itemDtype}`, typeof item);\n }\n return;\n }\n if (!Array.isArray(item) || item.length !== components) {\n throw cellError(meta, row, `list item is not ${components} numbers`, typeof item);\n }\n for (const k of item) {\n if (typeof k !== \"number\" || !representableNumber(itemDtype, k)) {\n throw cellError(meta, row, `list item component is not a representable ${itemDtype}`, typeof k);\n }\n }\n return;\n }\n case \"bool\":\n if (typeof item !== \"boolean\") {\n throw cellError(meta, row, \"list item is not a boolean\", typeof item);\n }\n return;\n case \"dict\":\n case \"string\":\n if (typeof item !== \"string\") {\n throw cellError(meta, row, \"list item is not a string\", typeof item);\n }\n assertWellFormedString(item, { column: meta.name, row });\n return;\n case \"json\":\n assertJsonValue(item, meta.name);\n return;\n default: {\n const name = itemDtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${name}`, { dtype: name });\n }\n }\n}\nclass StagingColumn {\n /**\n * Create an empty column.\n * @param meta - the resolved metadata\n * @param inferred - whether the column stages raw values and may widen\n * @param resizable - the staging buffer kind (tests pass false); undefined = engine default\n * @param dictionary - an existing dictionary to share (compaction); a fresh one when omitted\n */\n constructor(meta, inferred, resizable, dictionary) {\n this.length = 0;\n this.typed = null;\n this.bits = null;\n this.values = null;\n this.dictionary = null;\n this.validity = null;\n this.meta = meta;\n this.resizable = resizable;\n if (inferred) {\n this.inferrer = new DtypeInferrer();\n this.inferrer.widenTo(inferredEquivalent(meta.dtype));\n } else {\n this.inferrer = null;\n }\n this.allocate(dictionary);\n }\n /**\n * Whether the column stages raw values and may widen.\n * @returns true for an inferred column\n */\n get inferred() {\n return this.inferrer !== null;\n }\n /**\n * The inferred dtype of an inferred column, or null.\n * @returns the current inferred dtype\n */\n get inferredDtype() {\n return this.inferrer === null ? null : this.inferrer.dtype;\n }\n /**\n * Make at least `rows` rows exist, unset (when nullable) and holding the fill.\n * @param rows - the row count to reach\n */\n ensureLength(rows) {\n if (rows <= this.length) {\n return;\n }\n const { meta } = this;\n if (this.typed !== null) {\n this.typed.resize(rows * meta.components, this.fillNumber());\n } else if (this.bits !== null) {\n this.bits.resize(rows, meta.fill === true);\n } else if (this.values !== null) {\n const fill = this.fillValue();\n for (let row = this.length; row < rows; row++) {\n this.values.push(fill);\n }\n }\n if (this.validity !== null) {\n this.validity.resize(rows, false);\n }\n this.length = rows;\n }\n /**\n * Whether a row holds a value.\n * @param row - the row\n * @returns true when set (non-nullable columns: when materialised)\n */\n isSet(row) {\n if (row >= this.length) {\n return false;\n }\n return this.validity === null || this.validity.get(row);\n }\n /**\n * Set one cell (design sections 5.1 and 6.6). `undefined` unsets the row, and so does `null`\n * except on a declared json column (JSON null imports as unset, design section 5.3). An inferred\n * column widens when the value is wider than its dtype; the widening is returned so the builder\n * can report it.\n * @param row - the row; rows below it are materialised\n * @param value - the value\n * @returns the widening that took place, or null\n */\n write(row, value) {\n this.ensureLength(row + 1);\n if (value === void 0 || value === null && (this.inferrer !== null || this.meta.dtype !== \"json\")) {\n this.unset(row);\n return null;\n }\n let widened = null;\n if (this.inferrer !== null) {\n const before = this.meta.dtype;\n if (this.inferrer.observeValue(value)) {\n const next = this.inferrer.dtype;\n this.widenTo(next);\n widened = { from: before, to: next };\n }\n this.storeRaw(row, value);\n } else {\n this.store(row, value);\n }\n if (this.validity !== null) {\n this.validity.set(row, true);\n }\n return widened;\n }\n /**\n * Validate a value exactly as `write` would, without writing anything: the same E_COLUMN_TYPE\n * errors for a value the column cannot hold (a non-representable number, a lone surrogate, a\n * non-JSON object, an unset value on a non-nullable column). The record methods of the builder\n * validate every attribute before they apply anything (design section 11.1).\n * @param row - the row the value is meant for (error details only)\n * @param value - the value\n */\n checkValue(row, value) {\n if (value === void 0 || value === null && (this.inferrer !== null || this.meta.dtype !== \"json\")) {\n if (this.validity === null) {\n throw this.unsetError(row);\n }\n return;\n }\n if (this.inferrer !== null) {\n inferValueDtype(value);\n this.checkRaw(row, value);\n return;\n }\n this.coerce(row, value);\n }\n /**\n * Unset one cell: the validity bit is cleared and the fill is written back (design section 5.3).\n * @param row - the row; E_COLUMN_TYPE on a non-nullable column\n */\n unset(row) {\n this.ensureLength(row + 1);\n if (this.validity === null) {\n throw this.unsetError(row);\n }\n this.validity.set(row, false);\n this.writeFill(row);\n }\n /**\n * The E_COLUMN_TYPE error for unsetting a row of a non-nullable column.\n * @param row - the row\n * @returns the error\n */\n unsetError(row) {\n return new GraphFormatError(\n \"E_COLUMN_TYPE\",\n `row ${row} of non-nullable column \"${this.meta.name}\" cannot be unset`,\n { column: this.meta.name, row, field: \"nullable\" }\n );\n }\n /**\n * The JS value of one cell as the frozen column would hold it: a number (or an array of\n * `components` numbers), a boolean, a string, a list or a json value; undefined for an unset or\n * unmaterialised row. An inferred column's raw value is coerced to its current dtype.\n * @param row - the row\n * @returns the value\n */\n read(row) {\n if (!this.isSet(row)) {\n return void 0;\n }\n if (this.inferrer !== null) {\n return coerceValue(this.values[row], this.inferrer.dtype);\n }\n const { meta } = this;\n const { dtype, components } = meta;\n switch (dtype) {\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\": {\n const typed = this.typed;\n if (components === 1) {\n return typed.get(row);\n }\n const out = new Array(components);\n for (let k = 0; k < components; k++) {\n out[k] = typed.get(row * components + k);\n }\n return out;\n }\n case \"bool\":\n return this.bits.get(row);\n case \"dict\": {\n const code = this.typed.get(row);\n return this.dictionary.values[code];\n }\n case \"string\":\n case \"list\":\n case \"json\":\n return this.values[row];\n default: {\n const name = dtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${name}`, { dtype: name });\n }\n }\n }\n /**\n * Widen the column to a wider dtype of the design section 5.1 order. An inferred column only\n * changes its dtype (its raw values are coerced at freeze); a declared column becomes inferred:\n * its current values are read out and kept as raw values from then on.\n * @param next - the dtype to widen to\n */\n widenTo(next) {\n const { meta } = this;\n const nextMeta = resolveColumnMeta(meta.name, meta.domain, {\n dtype: next,\n nullable: true,\n role: meta.role ?? void 0,\n extra: meta.extra\n });\n if (this.inferrer !== null) {\n this.inferrer.widenTo(next);\n this.meta = nextMeta;\n return;\n }\n const rows = this.length;\n const raw = new Array(rows);\n const validity = new GrowableBitmap({ capacity: rows, resizable: this.resizable });\n validity.resize(rows, false);\n for (let row = 0; row < rows; row++) {\n if (this.isSet(row)) {\n raw[row] = this.read(row);\n validity.set(row, true);\n }\n }\n this.meta = nextMeta;\n this.inferrer = new DtypeInferrer();\n this.inferrer.widenTo(next);\n this.typed = null;\n this.bits = null;\n this.dictionary = null;\n this.values = raw;\n this.validity = validity;\n }\n /**\n * A new column of the same shape holding the rows `indexMap` selects (`out[i] = this[indexMap[i]]`),\n * or every row in order when `indexMap` is null, with `refersTo` values rewritten through\n * `valueRemap` when given: an in-range value maps to its new index and a dangling reference\n * becomes INVALID_INDEX with the row unset (for a list, dangling items are dropped and a row whose\n * every item dangled becomes unset and empty). The dictionary of a dict column is shared.\n * @param indexMap - new row -> old row, or null to keep every row\n * @param valueRemap - the remap of the space the values reference, or null\n * @returns the gathered column\n */\n gather(indexMap, valueRemap) {\n const rows = indexMap === null ? this.length : indexMap.length;\n const out = new StagingColumn(this.meta, this.inferred, this.resizable, this.dictionary ?? void 0);\n out.ensureLength(rows);\n const { components } = this.meta;\n const rewrite = valueRemap !== null && this.meta.refersTo !== null;\n for (let i = 0; i < rows; i++) {\n const old = indexMap === null ? i : indexMap[i];\n if (!this.isSet(old)) {\n continue;\n }\n if (out.typed !== null && this.typed !== null) {\n if (rewrite) {\n const mapped = remapIndex(this.typed.get(old), valueRemap);\n if (mapped === INVALID_INDEX) {\n out.unsetDangling(i);\n continue;\n }\n out.typed.set(i, mapped);\n } else {\n for (let k = 0; k < components; k++) {\n out.typed.set(i * components + k, this.typed.get(old * components + k));\n }\n }\n } else if (out.bits !== null && this.bits !== null) {\n out.bits.set(i, this.bits.get(old));\n } else if (out.values !== null && this.values !== null) {\n let value = this.values[old];\n if (rewrite) {\n const items = value;\n const kept = [];\n for (const item of items) {\n const mapped = remapIndex(item, valueRemap);\n if (mapped !== INVALID_INDEX) {\n kept.push(mapped);\n }\n }\n if (kept.length === 0 && items.length > 0) {\n out.unsetDangling(i);\n continue;\n }\n value = kept;\n }\n out.values[i] = value;\n }\n if (out.validity !== null) {\n out.validity.set(i, true);\n }\n }\n return out;\n }\n /**\n * Leave row `i` of a gathered column unset because its reference dangled (design section 5.11).\n * A non-nullable column gains a validity bitmap and becomes nullable (invariant I12 forbids a set\n * row holding INVALID_INDEX; `remapColumn` flips `nullable` the same way): every earlier row is\n * marked set except a scalar reference row still holding the INVALID_INDEX fill.\n * @param i - the row being gathered; rows below it are already gathered\n */\n unsetDangling(i) {\n if (this.validity !== null) {\n return;\n }\n const { meta } = this;\n this.meta = resolveColumnMeta(meta.name, meta.domain, { ...metaToDecl(meta), nullable: true });\n const validity = new GrowableBitmap({ capacity: this.length, resizable: this.resizable });\n validity.resize(this.length, false);\n const { typed } = this;\n for (let row = 0; row < i; row++) {\n if (typed === null || typed.get(row) !== INVALID_INDEX) {\n validity.set(row, true);\n }\n }\n this.validity = validity;\n }\n /**\n * Freeze the column into `rows` rows (design section 6.3 step 10): typed data is copied out of\n * staging into exact-length buffers (invariant I18), the validity bitmap is copied (and dropped when\n * every row is set), a dict dictionary is copied so the snapshot's column never changes (I17), and\n * string / list / json rows and the raw values of an inferred column go through the column factory,\n * which coerces them to the final dtype.\n * @param rows - the row count of the table\n * @returns the frozen column\n */\n toColumn(rows) {\n this.ensureLength(rows);\n const { meta } = this;\n const { dtype, components } = meta;\n if (this.inferrer !== null) {\n const source = this.values;\n const entries = new Array(rows);\n for (let row = 0; row < rows; row++) {\n entries[row] = this.isSet(row) ? source[row] : void 0;\n }\n return columnOfValues(meta, entries);\n }\n let validity = null;\n if (this.validity !== null && this.validity.count() !== rows) {\n validity = this.validity.trim();\n }\n const parts = {\n meta,\n length: rows,\n data: null,\n validity,\n nullCount: validity === null ? 0 : rows - this.validity.count(),\n dictionary: null,\n offsets: null,\n utf8: null,\n strings: null,\n child: null,\n values: null\n };\n switch (dtype) {\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\": {\n const data = allocNumeric(dtype, rows * components);\n data.set(this.typed.view().subarray(0, rows * components));\n parts.data = data;\n if (meta.refersTo !== null && this.validity === null) {\n unsetFillReferences(parts, data, rows);\n }\n return createColumn(parts);\n }\n case \"bool\":\n parts.data = this.bits.trim();\n return createColumn(parts);\n case \"dict\": {\n const codes = new Uint32Array(rows);\n codes.set(this.typed.view().subarray(0, rows));\n parts.data = codes;\n parts.dictionary = [...this.dictionary.values];\n return createColumn(parts);\n }\n case \"string\":\n case \"list\":\n case \"json\": {\n const source = this.values;\n const entries = new Array(rows);\n for (let row = 0; row < rows; row++) {\n const value = this.isSet(row) ? source[row] : void 0;\n entries[row] = value === void 0 ? this.unsetEntry() : value;\n }\n return columnOfValues(meta, entries);\n }\n default: {\n const name = dtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${name}`, { dtype: name });\n }\n }\n }\n /**\n * Bytes of typed staging held by the column (JS arrays are not counted).\n * @returns the byte count\n */\n byteLength() {\n let bytes = 0;\n if (this.typed !== null) {\n bytes += this.typed.array.byteLength;\n }\n if (this.bits !== null) {\n bytes += bitmapWordCount(this.bits.length) * 4;\n }\n if (this.validity !== null) {\n bytes += bitmapWordCount(this.validity.length) * 4;\n }\n return bytes;\n }\n /**\n * Allocate the storage of the current dtype (raw values for an inferred column).\n * @param dictionary - a dictionary to share, or undefined for a fresh seeded one\n */\n allocate(dictionary) {\n const { meta } = this;\n const { dtype } = meta;\n const options = { resizable: this.resizable };\n if (this.inferrer !== null) {\n this.values = [];\n this.validity = new GrowableBitmap(options);\n return;\n }\n switch (dtype) {\n case \"f32\":\n this.typed = new GrowableTypedArray(Float32Array, options);\n break;\n case \"f64\":\n this.typed = new GrowableTypedArray(Float64Array, options);\n break;\n case \"i32\":\n this.typed = new GrowableTypedArray(Int32Array, options);\n break;\n case \"u32\":\n this.typed = new GrowableTypedArray(Uint32Array, options);\n break;\n case \"u8\":\n this.typed = new GrowableTypedArray(Uint8Array, options);\n break;\n case \"bool\":\n this.bits = new GrowableBitmap(options);\n break;\n case \"dict\": {\n this.typed = new GrowableTypedArray(Uint32Array, options);\n this.dictionary = dictionary ?? seedDictionary(meta);\n break;\n }\n case \"string\":\n case \"list\":\n case \"json\":\n this.values = [];\n break;\n default: {\n const name = dtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${name}`, { dtype: name });\n }\n }\n this.validity = meta.nullable ? new GrowableBitmap(options) : null;\n }\n /**\n * The number written into unset numeric rows (the dict fill code for dict columns).\n * @returns the fill\n */\n fillNumber() {\n const { meta } = this;\n if (meta.dtype === \"dict\") {\n const dictionary = this.dictionary;\n const text = typeof meta.fill === \"string\" ? meta.fill : \"\";\n if (this.validity === null) {\n return dictionary.intern(text);\n }\n const code = dictionary.codeOf(text);\n return code === INVALID_INDEX ? 0 : code;\n }\n return typeof meta.fill === \"number\" ? meta.fill : 0;\n }\n /**\n * The JS value stored in unset rows of a JS-array column (undefined for an inferred column).\n * @returns the fill\n */\n fillValue() {\n if (this.inferrer !== null) {\n return void 0;\n }\n switch (this.meta.dtype) {\n case \"string\":\n return typeof this.meta.fill === \"string\" ? this.meta.fill : \"\";\n case \"list\":\n return EMPTY_LIST;\n default:\n return void 0;\n }\n }\n /**\n * The entry handed to the column factory for an unset row of a declared JS-array column:\n * undefined for a nullable column, the fill for a non-nullable one (json: null, the one JSON value\n * that means \"nothing\").\n * @returns the entry\n */\n unsetEntry() {\n if (this.meta.nullable) {\n return void 0;\n }\n return this.meta.dtype === \"json\" ? null : this.fillValue();\n }\n writeFill(row) {\n const { components } = this.meta;\n if (this.typed !== null) {\n const fill = this.fillNumber();\n for (let k = 0; k < components; k++) {\n this.typed.set(row * components + k, fill);\n }\n } else if (this.bits !== null) {\n this.bits.set(row, this.meta.fill === true);\n } else if (this.values !== null) {\n this.values[row] = this.fillValue();\n }\n }\n /**\n * Keep a raw value on an inferred column after checking it is storable at all (a json value must\n * be JSON; a string must be well-formed).\n * @param row - the row\n * @param value - the value as written\n */\n storeRaw(row, value) {\n this.checkRaw(row, value);\n this.values[row] = typeof value === \"string\" ? detachString(value) : value;\n }\n /**\n * The checks of storeRaw: a string must be well-formed, an object must be JSON.\n * @param row - the row\n * @param value - the value as written\n */\n checkRaw(row, value) {\n const { meta } = this;\n if (typeof value === \"string\") {\n assertWellFormedString(value, { column: meta.name, row });\n } else if (typeof value === \"object\") {\n assertJsonValue(value, `${meta.name}[${row}]`);\n }\n }\n /**\n * Store a value on a declared column: validate and normalise it (E_COLUMN_TYPE when the column\n * cannot hold it), then write the normalised form.\n * @param row - the row\n * @param value - the value\n */\n store(row, value) {\n this.put(row, this.coerce(row, value));\n }\n /**\n * Validate a value against a declared column's dtype and return the form `put` writes: a number\n * or an array of `components` numbers, a boolean, a string, a copied list, or a JSON value.\n * @param row - the row (error details only)\n * @param value - the value\n * @returns the normalised value\n */\n coerce(row, value) {\n const { meta } = this;\n const { dtype, components } = meta;\n switch (dtype) {\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\": {\n const scalar = typeof value === \"boolean\" ? Number(value) : value;\n if (typeof scalar === \"number\") {\n if (!representableNumber(dtype, scalar)) {\n throw cellError(meta, row, `${scalar} is not representable`, scalar);\n }\n return scalar;\n }\n if (components === 1 || !isArrayLikeNumbers(scalar, components)) {\n throw cellError(meta, row, `not ${components} number(s)`, typeof scalar);\n }\n for (let k = 0; k < components; k++) {\n if (!representableNumber(dtype, scalar[k])) {\n throw cellError(meta, row, `${scalar[k]} is not representable`, scalar[k]);\n }\n }\n return scalar;\n }\n case \"bool\":\n return coerceValue(value, \"bool\") === true;\n case \"dict\":\n case \"string\": {\n const text = coerceValue(value, \"string\");\n if (typeof text !== \"string\") {\n throw cellError(meta, row, \"not a string\", typeof value);\n }\n assertWellFormedString(text, { column: meta.name, row });\n return detachString(text);\n }\n case \"list\": {\n if (!Array.isArray(value)) {\n throw cellError(meta, row, \"not an array\", typeof value);\n }\n for (const item of value) {\n checkListItem(meta, row, item);\n }\n return value.map((item) => typeof item === \"string\" ? detachString(item) : item);\n }\n case \"json\":\n assertJsonValue(value, `${meta.name}[${row}]`);\n return value;\n default: {\n const name = dtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${name}`, { dtype: name });\n }\n }\n }\n /**\n * Write a value `coerce` returned.\n * @param row - the row\n * @param value - the normalised value\n */\n put(row, value) {\n const { dtype, components } = this.meta;\n switch (dtype) {\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\": {\n const typed = this.typed;\n if (typeof value === \"number\") {\n if (components === 1) {\n typed.set(row, value);\n } else {\n for (let k = 0; k < components; k++) {\n typed.set(row * components + k, value);\n }\n }\n return;\n }\n const vector = value;\n for (let k = 0; k < components; k++) {\n typed.set(row * components + k, vector[k]);\n }\n return;\n }\n case \"bool\":\n this.bits.set(row, value === true);\n return;\n case \"dict\":\n this.typed.set(\n row,\n this.dictionary.intern(value)\n );\n return;\n case \"string\":\n case \"list\":\n case \"json\":\n this.values[row] = value;\n return;\n default: {\n const name = dtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${name}`, { dtype: name });\n }\n }\n }\n}\nfunction remapIndex(value, remap) {\n return value < remap.length ? remap[value] : INVALID_INDEX;\n}\nfunction unsetFillReferences(parts, data, rows) {\n let validity = null;\n for (let row = 0; row < rows; row++) {\n if (data[row] === INVALID_INDEX) {\n validity ??= makeBitmap(rows, true);\n bitmapClear(validity, row);\n parts.nullCount++;\n }\n }\n if (validity !== null) {\n const { meta } = parts;\n parts.meta = resolveColumnMeta(meta.name, meta.domain, { ...metaToDecl(meta), nullable: true });\n parts.validity = validity;\n }\n}\nfunction createStagingColumn(name, domain, decl, inferred, resizable) {\n return new StagingColumn(resolveColumnMeta(name, domain, decl), inferred, resizable);\n}\nclass Staging {\n /**\n * Create empty staging.\n * @param options - precision, capacity hints and buffer kind\n */\n constructor(options) {\n this.ids = null;\n this.idToIndex = null;\n this.weight = null;\n this.weightSet = null;\n this.weightMode = \"none\";\n this.liveNodeCount = 0;\n this.liveEdgeCount = 0;\n this.selfLoopCount = 0;\n this.nodeColumns = [];\n this.edgeColumns = [];\n this.extensions = [];\n this.options = options;\n const { resizable } = options;\n const nodes = options.expectedNodes ?? 0;\n const edges = options.expectedEdges ?? 0;\n this.nodeAlive = new GrowableBitmap({ capacity: nodes, resizable });\n this.firstOut = new GrowableTypedArray(Uint32Array, { capacity: nodes, resizable });\n this.firstIn = new GrowableTypedArray(Uint32Array, { capacity: nodes, resizable });\n this.src = new GrowableTypedArray(Uint32Array, { capacity: edges, resizable });\n this.dst = new GrowableTypedArray(Uint32Array, { capacity: edges, resizable });\n this.edgeAlive = new GrowableBitmap({ capacity: edges, resizable });\n this.nextOut = new GrowableTypedArray(Uint32Array, { capacity: edges, resizable });\n this.nextIn = new GrowableTypedArray(Uint32Array, { capacity: edges, resizable });\n if (options.weighted) {\n this.weight = this.allocateWeights(edges);\n }\n }\n /**\n * The next node index to be assigned.\n * @returns the node bound\n */\n get nodeBound() {\n return this.nodeAlive.length;\n }\n /**\n * The next edge index to be assigned.\n * @returns the edge bound\n */\n get edgeBound() {\n return this.edgeAlive.length;\n }\n /**\n * Whether tombstoned nodes or edges exist.\n * @returns true when compaction is needed\n */\n get hasTombstones() {\n return this.liveNodeCount < this.nodeBound || this.liveEdgeCount < this.edgeBound;\n }\n /**\n * Grow capacity ahead of a bulk push.\n * @param nodes - the node count to fit\n * @param edges - the edge count to fit\n */\n reserve(nodes, edges) {\n if (nodes > 0) {\n this.firstOut.ensureCapacity(nodes);\n this.firstIn.ensureCapacity(nodes);\n }\n if (edges > 0) {\n this.src.ensureCapacity(edges);\n this.dst.ensureCapacity(edges);\n this.nextOut.ensureCapacity(edges);\n this.nextIn.ensureCapacity(edges);\n if (this.weight !== null) {\n this.weight.ensureCapacity(edges);\n }\n }\n }\n /**\n * Materialise `ids` and `idToIndex` from the anonymous prefix (every node so far has id === index).\n */\n materialiseIds() {\n if (this.ids !== null && this.idToIndex !== null) {\n return;\n }\n const bound = this.nodeBound;\n const ids = new Array(bound);\n const map = /* @__PURE__ */ new Map();\n for (let i = 0; i < bound; i++) {\n ids[i] = i;\n map.set(i, i);\n }\n this.ids = ids;\n this.idToIndex = map;\n }\n /**\n * Append a live node; the id is recorded only when the id structures exist.\n * @param id - the id, or null for an anonymous node (id === index)\n * @returns the new index\n */\n pushNode(id) {\n const index = this.nodeAlive.push(true);\n this.firstOut.push(INVALID_INDEX);\n this.firstIn.push(INVALID_INDEX);\n if (this.ids !== null && this.idToIndex !== null) {\n const stored = id ?? index;\n this.ids.push(stored);\n this.idToIndex.set(stored, index);\n }\n this.liveNodeCount++;\n return index;\n }\n /**\n * The weight array, allocated on first use and back-filled with 1 for existing edges.\n * @returns the growable weight array\n */\n ensureWeights() {\n if (this.weight === null) {\n this.weight = this.allocateWeights(this.edgeBound);\n this.weight.resize(this.edgeBound, 1);\n }\n return this.weight;\n }\n /**\n * Record whether an edge's weight was explicit (design section 3.7): the `weightSet` bitmap is\n * allocated on the first edge that disagrees with every earlier one.\n * @param edge - the edge index (=== edgeBound - 1 when appending)\n * @param explicit - whether the weight was supplied\n */\n trackWeight(edge, explicit) {\n if (this.weightSet !== null) {\n if (edge >= this.weightSet.length) {\n this.weightSet.resize(edge + 1, false);\n }\n this.weightSet.set(edge, explicit);\n return;\n }\n switch (this.weightMode) {\n case \"none\":\n this.weightMode = explicit ? \"explicit\" : \"omitted\";\n return;\n case \"explicit\":\n if (!explicit) {\n this.allocateWeightSet(true, edge);\n }\n return;\n case \"omitted\":\n if (explicit) {\n this.allocateWeightSet(false, edge);\n }\n return;\n case \"mixed\":\n return;\n default: {\n const mode = this.weightMode;\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown weight mode ${mode}`, { mode });\n }\n }\n }\n /**\n * Whether an edge's weight was supplied explicitly (design section 3.7).\n * @param e - the edge index\n * @returns true when explicit\n */\n weightExplicit(e) {\n if (this.weightSet === null) {\n return this.weightMode === \"explicit\";\n }\n return e < this.weightSet.length && this.weightSet.get(e);\n }\n /**\n * Append a live edge and link it into both incidence lists. The caller has validated the\n * endpoints and the weight.\n * @param u - source index\n * @param v - target index\n * @param weight - the weight, or undefined when omitted (stored as 1 when the array exists)\n * @returns the new edge index\n */\n pushEdge(u, v, weight) {\n const e = this.src.push(u);\n this.dst.push(v);\n if (weight !== void 0) {\n this.ensureWeights().push(weight);\n } else if (this.weight !== null) {\n this.weight.push(1);\n }\n this.trackWeight(e, weight !== void 0);\n this.edgeAlive.push(true);\n this.nextOut.push(this.firstOut.get(u));\n this.firstOut.set(u, e);\n this.nextIn.push(this.firstIn.get(v));\n this.firstIn.set(v, e);\n this.liveEdgeCount++;\n if (u === v) {\n this.selfLoopCount++;\n }\n return e;\n }\n /**\n * Append `src.length` live edges at once (the bulk `addEdges` path): the same storage, weight\n * tracking and incidence-list linking as one pushEdge per edge in order, done as typed-array\n * passes. The caller has validated the endpoints and the weights.\n * @param src - source indices\n * @param dst - target indices, as many as `src`\n * @param weights - the explicit weight of every edge, or null when every weight is omitted\n * @returns the first new edge index\n */\n pushEdges(src, dst, weights) {\n const count = src.length;\n const first = this.edgeBound;\n const end = first + count;\n if (count === 0) {\n return first;\n }\n this.src.pushAll(src);\n this.dst.pushAll(dst);\n if (weights !== null) {\n this.ensureWeights().pushAll(weights);\n } else if (this.weight !== null) {\n this.weight.resize(end, 1);\n }\n this.trackWeights(first, count, weights !== null);\n this.edgeAlive.resize(end, true);\n this.nextOut.resize(end);\n this.nextIn.resize(end);\n this.selfLoopCount += linkEdgeRange(\n this.src.array,\n this.dst.array,\n first,\n end,\n this.firstOut.array,\n this.firstIn.array,\n this.nextOut.array,\n this.nextIn.array\n );\n this.liveEdgeCount += count;\n return first;\n }\n /**\n * trackWeight for a batch of `count` edges from `first` that all supplied or all omitted their\n * weight: the same mode transitions and bitmap contents as `count` calls in order.\n * @param first - the first edge of the batch\n * @param count - the batch size, at least 1\n * @param explicit - whether the batch supplied its weights\n */\n trackWeights(first, count, explicit) {\n const end = first + count;\n let bitmap = this.weightSet;\n if (bitmap === null) {\n switch (this.weightMode) {\n case \"none\":\n this.weightMode = explicit ? \"explicit\" : \"omitted\";\n return;\n case \"explicit\":\n if (explicit) {\n return;\n }\n bitmap = this.allocateWeightSet(true, first);\n break;\n case \"omitted\":\n if (!explicit) {\n return;\n }\n bitmap = this.allocateWeightSet(false, first);\n break;\n case \"mixed\":\n return;\n default: {\n const mode = this.weightMode;\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown weight mode ${mode}`, { mode });\n }\n }\n }\n if (bitmap.length < first) {\n bitmap.resize(first, false);\n }\n bitmap.resize(end, explicit);\n }\n /**\n * Tombstone a live edge (O(1)).\n * @param e - a live edge index\n */\n killEdge(e) {\n this.edgeAlive.set(e, false);\n this.liveEdgeCount--;\n if (this.src.get(e) === this.dst.get(e)) {\n this.selfLoopCount--;\n }\n }\n /**\n * Live edges leaving a node, walked from the out-list (O(degree)).\n * @param u - the node index\n * @returns the live edge indices in ascending order\n */\n outEdges(u) {\n const out = [];\n for (let e = this.firstOut.get(u); e !== INVALID_INDEX; e = this.nextOut.get(e)) {\n if (this.edgeAlive.get(e)) {\n out.push(e);\n }\n }\n return Uint32Array.from(out).sort();\n }\n /**\n * Live edges entering a node, walked from the in-list (O(degree)).\n * @param v - the node index\n * @returns the live edge indices in ascending order\n */\n inEdges(v) {\n const out = [];\n for (let e = this.firstIn.get(v); e !== INVALID_INDEX; e = this.nextIn.get(e)) {\n if (this.edgeAlive.get(e)) {\n out.push(e);\n }\n }\n return Uint32Array.from(out).sort();\n }\n /**\n * Live edges incident to a node in either orientation (the undirected outEdgesOf / inEdgesOf,\n * design section 6.6 and invariant I7): both lists walked, a self-loop listed once (O(degree)).\n * @param u - the node index\n * @returns the live edge indices in ascending order\n */\n incidentEdges(u) {\n const out = [];\n for (let e = this.firstOut.get(u); e !== INVALID_INDEX; e = this.nextOut.get(e)) {\n if (this.edgeAlive.get(e)) {\n out.push(e);\n }\n }\n for (let e = this.firstIn.get(u); e !== INVALID_INDEX; e = this.nextIn.get(e)) {\n if (this.edgeAlive.get(e) && this.src.get(e) !== u) {\n out.push(e);\n }\n }\n return Uint32Array.from(out).sort();\n }\n /**\n * Bytes of typed staging held (capacity, not length), for `byteLength()`.\n * @returns the byte count\n */\n byteLength() {\n let bytes = this.firstOut.array.byteLength + this.firstIn.array.byteLength + this.src.array.byteLength + this.dst.array.byteLength + this.nextOut.array.byteLength + this.nextIn.array.byteLength + bitmapWordCount(this.nodeAlive.length) * 4 + bitmapWordCount(this.edgeAlive.length) * 4;\n if (this.weight !== null) {\n bytes += this.weight.array.byteLength;\n }\n if (this.weightSet !== null) {\n bytes += bitmapWordCount(this.weightSet.length) * 4;\n }\n for (const column of this.nodeColumns) {\n bytes += column.byteLength();\n }\n for (const column of this.edgeColumns) {\n bytes += column.byteLength();\n }\n for (const table of this.extensions) {\n for (const column of table.columns) {\n bytes += column.byteLength();\n }\n }\n return bytes;\n }\n allocateWeights(capacity) {\n const { resizable } = this.options;\n return this.options.weightDtype === \"f64\" ? new GrowableTypedArray(Float64Array, { capacity, resizable }) : new GrowableTypedArray(Float32Array, { capacity, resizable });\n }\n /**\n * Allocate the weightSet bitmap over `edge + 1` bits: every earlier edge gets `earlier`, `edge`\n * itself the opposite.\n * @param earlier - the value of every edge before `edge`\n * @param edge - the first disagreeing edge\n * @returns the new bitmap\n */\n allocateWeightSet(earlier, edge) {\n const bitmap = new GrowableBitmap({ capacity: edge + 1, resizable: this.options.resizable });\n bitmap.resize(edge, earlier);\n bitmap.push(!earlier);\n this.weightSet = bitmap;\n this.weightMode = \"mixed\";\n return bitmap;\n }\n}\nfunction remapKeepingBits(bound, keep) {\n const remap = new Uint32Array(bound);\n let count = 0;\n for (let i = 0; i < bound; i++) {\n if ((keep[i >>> 5] >>> (i & 31) & 1) === 1) {\n remap[i] = count++;\n } else {\n remap[i] = INVALID_INDEX;\n }\n }\n const origin = new Uint32Array(count);\n for (let i = 0; i < bound; i++) {\n const mapped = remap[i];\n if (mapped !== INVALID_INDEX) {\n origin[mapped] = i;\n }\n }\n return { remap, origin, count };\n}\nfunction remapSurvivors(survivorOf) {\n const bound = survivorOf.length;\n const remap = new Uint32Array(bound);\n let count = 0;\n for (let e = 0; e < bound; e++) {\n if (survivorOf[e] === e) {\n remap[e] = count++;\n } else {\n remap[e] = INVALID_INDEX;\n }\n }\n const origin = new Uint32Array(count);\n for (let e = 0; e < bound; e++) {\n const mapped = remap[e];\n if (mapped !== INVALID_INDEX) {\n origin[mapped] = e;\n }\n }\n return { remap, origin, count };\n}\nfunction linkEdgeRange(src, dst, first, end, firstOut, firstIn, nextOut, nextIn) {\n let loops = 0;\n for (let e = first; e < end; e++) {\n const u = src[e];\n const v = dst[e];\n nextOut[e] = firstOut[u];\n firstOut[u] = e;\n nextIn[e] = firstIn[v];\n firstIn[v] = e;\n if (u === v) {\n loops++;\n }\n }\n return loops;\n}\nfunction gatherEdges(src, dst, origin, nodeRemap, outSrc, outDst, firstOut, firstIn, nextOut, nextIn) {\n const edgeCount = origin.length;\n let loops = 0;\n for (let e = 0; e < edgeCount; e++) {\n const old = origin[e];\n const u = nodeRemap[src[old]];\n const v = nodeRemap[dst[old]];\n outSrc[e] = u;\n outDst[e] = v;\n nextOut[e] = firstOut[u];\n firstOut[u] = e;\n nextIn[e] = firstIn[v];\n firstIn[v] = e;\n if (u === v) {\n loops++;\n }\n }\n return loops;\n}\nfunction gatherValues(values, origin, out) {\n const count = origin.length;\n for (let i = 0; i < count; i++) {\n out[i] = values[origin[i]];\n }\n}\nfunction applyMergedWeights(merged, stored, weights, edgeCount) {\n for (let e = 0; e < edgeCount; e++) {\n if (bitmapGet(stored, e)) {\n weights[e] = merged[e];\n }\n }\n}\nfunction compactStaging(source, plan) {\n const { nodes, edges } = plan;\n const out = new Staging({\n ...source.options,\n weighted: source.weight !== null || plan.mergedWeights !== null,\n expectedNodes: nodes.count,\n expectedEdges: edges.count\n });\n out.nodeAlive.resize(nodes.count, true);\n out.firstOut.resize(nodes.count, INVALID_INDEX);\n out.firstIn.resize(nodes.count, INVALID_INDEX);\n out.liveNodeCount = nodes.count;\n if (source.ids !== null) {\n const ids = new Array(nodes.count);\n const map = /* @__PURE__ */ new Map();\n for (let i = 0; i < nodes.count; i++) {\n const id = source.ids[nodes.origin[i]];\n ids[i] = id;\n map.set(id, i);\n }\n out.ids = ids;\n out.idToIndex = map;\n }\n const { remap: nodeRemap } = nodes;\n const edgeCount = edges.count;\n const { origin } = edges;\n out.weightMode = source.weightMode;\n if (source.weightSet !== null || plan.mergedWeightSet !== null) {\n out.weightSet = new GrowableBitmap({ capacity: edgeCount, resizable: source.options.resizable });\n out.weightMode = \"mixed\";\n }\n out.src.resize(edgeCount);\n out.dst.resize(edgeCount);\n out.nextOut.resize(edgeCount);\n out.nextIn.resize(edgeCount);\n out.edgeAlive.resize(edgeCount, true);\n out.liveEdgeCount = edgeCount;\n out.selfLoopCount = gatherEdges(\n source.src.array,\n source.dst.array,\n origin,\n nodeRemap,\n out.src.array,\n out.dst.array,\n out.firstOut.array,\n out.firstIn.array,\n out.nextOut.array,\n out.nextIn.array\n );\n if (out.weight !== null) {\n out.weight.resize(edgeCount);\n const weights = out.weight.array;\n if (source.weight === null) {\n weights.fill(1, 0, edgeCount);\n } else {\n gatherValues(source.weight.array, origin, weights);\n }\n if (plan.mergedWeights !== null && plan.mergedWeightStored !== null) {\n applyMergedWeights(plan.mergedWeights, plan.mergedWeightStored, weights, edgeCount);\n }\n }\n if (out.weightSet !== null) {\n out.weightSet.resize(edgeCount, false);\n for (let e = 0; e < edgeCount; e++) {\n let explicit = source.weightExplicit(origin[e]);\n if (plan.mergedWeightSet !== null && bitmapGet(plan.mergedWeightSet, e)) {\n explicit = true;\n }\n if (explicit) {\n out.weightSet.set(e, true);\n }\n }\n }\n const refs = { node: nodeRemap, edge: plan.edgeValues ?? edges.remap };\n out.nodeColumns = source.nodeColumns.map((column) => column.gather(nodes.origin, valueRemapFor$1(column, refs)));\n out.edgeColumns = source.edgeColumns.map((column) => column.gather(edges.origin, valueRemapFor$1(column, refs)));\n out.extensions = source.extensions.map((table) => ({\n name: table.name,\n rowCount: table.rowCount,\n columns: table.columns.map((column) => column.gather(null, valueRemapFor$1(column, refs)))\n }));\n return out;\n}\nfunction valueRemapFor$1(column, refs) {\n switch (column.meta.refersTo) {\n case \"node\":\n return refs.node;\n case \"edge\":\n return refs.edge;\n default:\n return null;\n }\n}\nfunction isTypedArrayData$1(data) {\n return data instanceof Uint32Array || data instanceof Int32Array || data instanceof Float32Array || data instanceof Float64Array || data instanceof Uint8Array;\n}\nfunction isColumn(data) {\n if (typeof data !== \"object\" || data === null || Array.isArray(data) || isTypedArrayData$1(data)) {\n return false;\n }\n const candidate = data;\n return typeof candidate.dtype === \"string\" && typeof candidate.meta === \"object\" && typeof candidate.length === \"number\";\n}\nfunction columnSetVersion(table) {\n return table.mutations;\n}\nfunction claimColumn(column) {\n claimHolder(column);\n for (const buffer of columnBuffers(column)) {\n claimHolder(buffer);\n }\n}\nclass AttributeTable {\n /**\n * Create a table from wrapped columns (the constructor the freeze pipeline, fromCsr and the wire\n * reader use). Every column must have the table's row count and domain, names must be unique and\n * at most one column may hold each role.\n * @param parts - the domain, the row count and the columns in declaration order\n * @internal\n */\n constructor(parts) {\n this.mutations = 0;\n const { domain, rowCount } = parts;\n if (!(Number.isInteger(rowCount) && rowCount >= 0)) {\n throw new GraphFormatError(\"E_COLUMN_LENGTH\", `invalid row count ${rowCount} for a ${domain} table`, {\n domain,\n found: rowCount\n });\n }\n this.domain = domain;\n this.rowCount = rowCount;\n this.columns = /* @__PURE__ */ new Map();\n for (const column of parts.columns) {\n const { name } = column.meta;\n if (this.columns.has(name)) {\n throw new GraphFormatError(\"E_COLUMN_EXISTS\", `column \"${name}\" is declared twice`, { column: name });\n }\n this.checkColumn(name, column);\n this.checkRole(name, column.meta.role, false);\n this.columns.set(name, column);\n claimColumn(column);\n }\n }\n /**\n * Column names in declaration order.\n * @returns a fresh array of the names\n */\n names() {\n return [...this.columns.keys()];\n }\n /**\n * Whether a column exists.\n * @param name - the column name\n * @returns true when present\n */\n has(name) {\n return this.columns.has(name);\n }\n /**\n * Total lookup by name.\n * @param name - the column name\n * @returns the column, or null when absent\n */\n get(name) {\n return this.columns.get(name) ?? null;\n }\n /**\n * Checked lookup by name.\n * @param name - the column name\n * @returns the column; E_UNKNOWN_COLUMN when absent\n */\n require(name) {\n const column = this.columns.get(name);\n if (column === void 0) {\n throw new GraphFormatError(\"E_UNKNOWN_COLUMN\", `no ${this.domain} column named \"${name}\"`, {\n column: name,\n domain: this.domain\n });\n }\n return column;\n }\n /**\n * Total lookup by name and dtype.\n * @param name - the column name\n * @param dtype - the expected dtype\n * @returns the column, or null when absent or of another dtype\n */\n typed(name, dtype) {\n const column = this.columns.get(name);\n if (column === void 0 || column.dtype !== dtype) {\n return null;\n }\n return column;\n }\n /**\n * Checked lookup by name and dtype.\n * @param name - the column name\n * @param dtype - the expected dtype\n * @returns the column; E_UNKNOWN_COLUMN when absent, E_COLUMN_TYPE when of another dtype\n */\n requireTyped(name, dtype) {\n const column = this.require(name);\n if (column.dtype !== dtype) {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `column \"${name}\" is ${column.dtype}, expected ${dtype}`, {\n column: name,\n expected: dtype,\n found: column.dtype\n });\n }\n return column;\n }\n /**\n * The column holding a role (at most one per table).\n * @param role - the role\n * @returns the column, or null when no column has the role\n */\n byRole(role) {\n for (const column of this.columns.values()) {\n if (column.meta.role === role) {\n return column;\n }\n }\n return null;\n }\n /**\n * Typed read of one cell honouring the column's declared default.\n * @param name - the column name; E_UNKNOWN_COLUMN when absent\n * @param row - the row index; E_INDEX_RANGE when out of range\n * @returns the value, the default for an unset row, or undefined for an unset row without a default\n */\n value(name, row) {\n return this.require(name).value(row);\n }\n /**\n * Whether one cell holds a value.\n * @param name - the column name; E_UNKNOWN_COLUMN when absent\n * @param row - the row index (false when out of range)\n * @returns true when set\n */\n isSet(name, row) {\n return this.require(name).isSet(row);\n }\n /**\n * Attach a column (design section 5.7). A typed array is adopted by reference after its length is\n * checked (E_COLUMN_LENGTH); a u8 array from which no padded u32 view is constructible is copied\n * unless opts.adopt is \"strict\" (E_COLUMN_ALIGNMENT); a view over a SharedArrayBuffer or a\n * resizable buffer is E_UNSUPPORTED (decision D-SAB, invariant I10); a JS array builds a column of\n * the declared dtype, or of the dtype inferred from the values (design section 5.1) when the\n * patch names none; a Column object is moved in when its row count matches. Replaces a column of\n * the same name. E_DUPLICATE_ROLE when the declared role is held by another column and\n * opts.replaceRole is not set; with replaceRole the previous holder is removed.\n * @param name - the column name\n * @param data - a Column, a typed array, or a JS array of values\n * @param decl - declaration fields to apply (dtype is inferred from a typed array when omitted)\n * @param opts - role replacement and u8 adoption options\n * @returns the attached column (`column.data !== data` only when a u8 array was copied)\n */\n set(name, data, decl, opts) {\n const patch = decl ?? {};\n let column;\n if (isTypedArrayData$1(data)) {\n const adopt = assertOneOf(\"adopt\", opts?.adopt, [\"copy\", \"strict\"]) ?? \"copy\";\n column = columnFromTypedArray(this.domain, this.rowCount, name, data, patch, adopt);\n } else if (Array.isArray(data)) {\n column = columnFromValues(this.domain, this.rowCount, name, data, patch);\n } else if (isColumn(data)) {\n if (!isPackageColumn(data)) {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `column \"${name}\": not a Column of this package`, {\n column: name,\n reason: \"foreign column\"\n });\n }\n column = this.adoptColumn(name, data, decl);\n if (column !== data && holderCount(data) > 0) {\n noteShared(column);\n }\n } else {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `column \"${name}\": unsupported data (${typeof data})`, {\n column: name,\n found: typeof data\n });\n }\n this.checkRole(name, column.meta.role, opts?.replaceRole ?? false);\n const previous = this.columns.get(name);\n if (previous !== column) {\n claimHolder(column);\n if (previous !== data) {\n for (const buffer of columnBuffers(column)) {\n claimHolder(buffer);\n }\n }\n }\n this.columns.set(name, column);\n this.mutations++;\n return column;\n }\n /**\n * Remove a column.\n * @param name - the column name\n * @returns true when a column was removed\n */\n remove(name) {\n const removed = this.columns.delete(name);\n if (removed) {\n this.mutations++;\n }\n return removed;\n }\n /**\n * Rename a column in place (declaration order kept). The Column object is re-wrapped under the new\n * name; its storage is shared with the previous object.\n * @param from - the current name; E_UNKNOWN_COLUMN when absent\n * @param to - the new name; E_COLUMN_EXISTS when another column has it\n */\n rename(from, to) {\n const column = this.require(from);\n if (from === to) {\n return;\n }\n if (this.columns.has(to)) {\n throw new GraphFormatError(\"E_COLUMN_EXISTS\", `cannot rename \"${from}\": a column named \"${to}\" exists`, {\n column: to\n });\n }\n const renamed = rewrapColumn(column, resolveColumnMeta(to, this.domain, metaToDecl(column.meta)));\n claimHolder(renamed);\n if (isShared(column)) {\n noteShared(renamed);\n }\n const entries = [...this.columns.entries()];\n this.columns.clear();\n for (const [name, existing] of entries) {\n if (name === from) {\n this.columns.set(to, renamed);\n } else {\n this.columns.set(name, existing);\n }\n }\n this.mutations++;\n }\n /**\n * The array a GPU binds for a column (design section 10.4): its own data for the direct dtypes,\n * the padded u32 view for u8, the packed words for bool, the codes for dict, and a cached f32 copy\n * for f64.\n * @param name - the column name; E_UNKNOWN_COLUMN when absent\n * @returns the bindable array; E_GPU_INELIGIBLE for string / list / json\n */\n gpuView(name) {\n return gpuViewOf(this.require(name));\n }\n /**\n * A new table with the same columns: the Column objects are shared, the set is independent.\n * @returns the cloned table\n */\n clone() {\n return new AttributeTable({\n domain: this.domain,\n rowCount: this.rowCount,\n columns: [...this.columns.values()]\n });\n }\n /**\n * Iterate the columns in declaration order.\n * @returns an iterator over the columns\n */\n [Symbol.iterator]() {\n return this.columns.values();\n }\n /**\n * Move a Column object in: checked for row count and re-wrapped when its name, domain or\n * declaration differ from the target slot.\n * @param name - the target name\n * @param column - the column\n * @param decl - an optional declaration patch\n * @returns the column to store (the same object when nothing changes)\n */\n adoptColumn(name, column, decl) {\n this.checkColumn(name, column);\n const { meta } = column;\n const unchanged = decl === void 0 && meta.name === name && meta.domain === this.domain;\n if (unchanged) {\n return column;\n }\n const merged = { ...metaToDecl(meta), ...decl };\n if (decl?.fill === void 0) {\n merged.fill = meta.fill;\n }\n return rewrapColumn(column, resolveColumnMeta(name, this.domain, merged));\n }\n checkColumn(name, column) {\n if (column.length !== this.rowCount) {\n throw new GraphFormatError(\n \"E_COLUMN_LENGTH\",\n `column \"${name}\" has ${column.length} rows; the ${this.domain} table has ${this.rowCount}`,\n { column: name, expected: this.rowCount, found: column.length }\n );\n }\n }\n /**\n * Enforce \"at most one column per role\": E_DUPLICATE_ROLE when another column holds the role,\n * unless replaceRole, in which case that column is removed.\n * @param name - the column being attached (a column may keep its own role)\n * @param role - the role being attached, or null\n * @param replaceRole - whether to evict the previous holder\n */\n checkRole(name, role, replaceRole) {\n if (role === null) {\n return;\n }\n for (const [otherName, other] of this.columns) {\n if (otherName !== name && other.meta.role === role) {\n if (!replaceRole) {\n throw new GraphFormatError(\n \"E_DUPLICATE_ROLE\",\n `role \"${role}\" is already held by column \"${otherName}\" in the ${this.domain} table`,\n { role, column: name, holder: otherName }\n );\n }\n this.columns.delete(otherName);\n return;\n }\n }\n }\n}\nfunction createTable(domain, rowCount) {\n return new AttributeTable({ domain, rowCount, columns: [] });\n}\nfunction tableWithColumns(table, columns) {\n const out = table.clone();\n for (const name of Object.keys(columns)) {\n const input = columns[name];\n if (isTypedArrayData$1(input)) {\n out.set(name, input);\n } else {\n out.set(name, input.data, input.decl);\n }\n }\n return out;\n}\nfunction uniqueKey(column, row) {\n const { dtype } = column;\n switch (dtype) {\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\":\n if (column.meta.components === 1) {\n return column.data[row];\n }\n return Array.from(\n column.data.subarray(row * column.meta.components, (row + 1) * column.meta.components)\n ).join(\",\");\n case \"bool\":\n return bitmapGet(column.data, row);\n case \"dict\":\n return column.codes[row];\n case \"string\":\n return column.valueAt(row);\n case \"list\":\n return JSON.stringify(column.sliceOf(row));\n case \"json\":\n return JSON.stringify(column.values[row]);\n default: {\n const name = dtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${name}`, { dtype: name });\n }\n }\n}\nfunction verifyUniqueColumn(column) {\n if (!column.meta.unique) {\n return;\n }\n const seen = /* @__PURE__ */ new Map();\n for (let row = 0; row < column.length; row++) {\n if (!column.isSet(row)) {\n continue;\n }\n const key = uniqueKey(column, row);\n const first = seen.get(key);\n if (first !== void 0) {\n const code = column.meta.domain === \"edge\" ? \"E_DUPLICATE_EDGE_ID\" : \"E_DUPLICATE_ID\";\n throw new GraphFormatError(\n code,\n `column \"${column.meta.name}\" is unique but rows ${first} and ${row} hold the same value`,\n {\n column: column.meta.name,\n domain: column.meta.domain,\n rows: [first, row],\n value: column.value(row)\n }\n );\n }\n seen.set(key, row);\n }\n}\nfunction verifyUniqueColumns(table) {\n for (const column of table) {\n verifyUniqueColumn(column);\n }\n}\nfunction unsupportedDtype(column) {\n return new GraphFormatError(\n \"E_COLUMN_TYPE\",\n `column ${JSON.stringify(column.meta.name)} of dtype ${column.dtype} cannot hold edge ids`,\n { column: column.meta.name, dtype: column.dtype, reason: \"edge id dtype\" }\n );\n}\nfunction edgeIdOfRow(column, row) {\n switch (column.dtype) {\n case \"string\":\n return column.valueAt(row);\n case \"dict\":\n return column.dictionary[column.codes[row]];\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\":\n return column.data[row * column.meta.components];\n case \"bool\":\n case \"list\":\n case \"json\":\n throw unsupportedDtype(column);\n default:\n throw unsupportedDtype(column);\n }\n}\nfunction canHoldEdgeIds(column) {\n switch (column.dtype) {\n case \"string\":\n case \"dict\":\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\":\n return true;\n case \"bool\":\n case \"list\":\n case \"json\":\n return false;\n default:\n return false;\n }\n}\nfunction buildEdgeIdMap(column) {\n if (!canHoldEdgeIds(column)) {\n throw unsupportedDtype(column);\n }\n const map = /* @__PURE__ */ new Map();\n const rows = column.length;\n for (let e = 0; e < rows; e++) {\n if (!column.isSet(e)) {\n continue;\n }\n const id = edgeIdOfRow(column, e);\n if (!map.has(id)) {\n map.set(id, e);\n }\n }\n return map;\n}\nclass EdgeIdIndex {\n /**\n * Wrap an edge id column; nothing is built until the first lookup.\n * @param column - the edge column with role \"id\"; E_COLUMN_TYPE when its dtype cannot hold ids\n */\n constructor(column) {\n if (!canHoldEdgeIds(column)) {\n throw unsupportedDtype(column);\n }\n this.column = column;\n this.map = null;\n this.builtVersion = -1;\n }\n /**\n * Whether the map has been built (and is current).\n * @returns true when the next lookup will not build\n */\n get built() {\n return this.map !== null && this.builtVersion === this.column.version;\n }\n /**\n * Number of distinct ids over the set rows; builds the map.\n * @returns the id count\n */\n get size() {\n return this.ensure().size;\n }\n /**\n * The logical edge index of an id.\n * @param id - the edge id\n * @returns the edge index, or INVALID_INDEX on a miss\n */\n indexOf(id) {\n const index = this.ensure().get(id);\n return index === void 0 ? INVALID_INDEX : index;\n }\n /**\n * Whether an id is present.\n * @param id - the edge id\n * @returns true when some set row holds it\n */\n has(id) {\n return this.ensure().has(id);\n }\n /**\n * The map, built on first use and rebuilt after the column's version changed.\n * @returns the id -> edge index map\n */\n ensure() {\n const { version } = this.column;\n if (this.map === null || this.builtVersion !== version) {\n this.map = buildEdgeIdMap(this.column);\n this.builtVersion = version;\n }\n return this.map;\n }\n}\nconst CORE_ORDER = [\"rowPtr\", \"colIdx\", \"weights\", \"arcToEdge\", \"edgeToArc\"];\nfunction byteLengthsOf(shape) {\n const permArcs = shape.identity ? 0 : shape.arcCount;\n const permEdges = shape.identity ? 0 : shape.edgeCount;\n return [\n 4 * (shape.nodeCount + 1),\n 4 * shape.arcCount,\n shape.weighted ? 4 * shape.arcCount : 0,\n 4 * permArcs,\n 4 * permEdges\n ];\n}\nfunction allocateSeparateCore(shape) {\n return {\n rowPtr: new Uint32Array(shape.nodeCount + 1),\n colIdx: new Uint32Array(shape.arcCount),\n weights: shape.weighted ? new Float32Array(shape.arcCount) : null,\n arcToEdge: shape.identity ? null : new Uint32Array(shape.arcCount),\n edgeToArc: shape.identity ? null : new Uint32Array(shape.edgeCount),\n arena: null\n };\n}\nfunction allocateArenaCore(shape) {\n const byteLengths = byteLengthsOf(shape);\n const layout = layoutSegments(byteLengths, ALIGNMENT);\n const buffer = new ArrayBuffer(layout.byteLength);\n const segments = {\n rowPtr: null,\n colIdx: null,\n weights: null,\n arcToEdge: null,\n edgeToArc: null\n };\n let hotByteLength = 0;\n for (let i = 0; i < CORE_ORDER.length; i++) {\n const offset = layout.offsets[i];\n if (offset === null) {\n continue;\n }\n const segment = Object.freeze({ byteOffset: offset, byteLength: byteLengths[i] });\n segments[CORE_ORDER[i]] = segment;\n if (i <= 2) {\n hotByteLength = offset + byteLengths[i];\n }\n }\n const u32 = (name, length) => {\n const segment = segments[name];\n return segment === null ? new Uint32Array(0) : new Uint32Array(buffer, segment.byteOffset, length);\n };\n let weights = null;\n if (shape.weighted) {\n const segment = segments.weights;\n weights = segment === null ? new Float32Array(0) : new Float32Array(buffer, segment.byteOffset, shape.arcCount);\n }\n const arena = Object.freeze({\n buffer,\n byteOffset: 0,\n byteLength: layout.byteLength,\n alignment: ALIGNMENT,\n segments: Object.freeze(segments),\n hotByteLength\n });\n return {\n rowPtr: u32(\"rowPtr\", shape.nodeCount + 1),\n colIdx: u32(\"colIdx\", shape.arcCount),\n weights,\n arcToEdge: shape.identity ? null : u32(\"arcToEdge\", shape.arcCount),\n edgeToArc: shape.identity ? null : u32(\"edgeToArc\", shape.edgeCount),\n arena\n };\n}\nfunction allocateCoreArrays(shape, useArena) {\n return useArena ? allocateArenaCore(shape) : allocateSeparateCore(shape);\n}\nfunction shapeOfCore(core) {\n return {\n nodeCount: core.rowPtr.length - 1,\n arcCount: core.colIdx.length,\n edgeCount: core.edgeToArc === null ? core.colIdx.length : core.edgeToArc.length,\n weighted: core.weights !== null,\n identity: core.arcToEdge === null\n };\n}\nfunction copyCoreIntoArena(core) {\n const out = allocateArenaCore(shapeOfCore(core));\n out.rowPtr.set(core.rowPtr);\n out.colIdx.set(core.colIdx);\n if (out.weights !== null && core.weights !== null) {\n out.weights.set(core.weights);\n }\n if (out.arcToEdge !== null && core.arcToEdge !== null) {\n out.arcToEdge.set(core.arcToEdge);\n }\n if (out.edgeToArc !== null && core.edgeToArc !== null) {\n out.edgeToArc.set(core.edgeToArc);\n }\n return out;\n}\nfunction lowerBound(colIdx, lo, hi, v) {\n let low = lo;\n let high = hi;\n while (low < high) {\n const mid = low + Math.floor((high - low) / 2);\n if (colIdx[mid] < v) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return low;\n}\nfunction upperBound(colIdx, lo, hi, v) {\n let low = lo;\n let high = hi;\n while (low < high) {\n const mid = low + Math.floor((high - low) / 2);\n if (colIdx[mid] <= v) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return low;\n}\nfunction findArcIn(rowPtr, colIdx, u, v) {\n const hi = rowPtr[u + 1];\n const at = lowerBound(colIdx, rowPtr[u], hi, v);\n return at < hi && colIdx[at] === v ? at : INVALID_INDEX;\n}\nfunction arcRangeIn(rowPtr, colIdx, u, v) {\n const start = rowPtr[u];\n const end = rowPtr[u + 1];\n const lo = lowerBound(colIdx, start, end, v);\n const hi = upperBound(colIdx, lo, end, v);\n return [lo, hi];\n}\nfunction multiplicityIn(rowPtr, colIdx, u, v) {\n const start = rowPtr[u];\n const end = rowPtr[u + 1];\n const lo = lowerBound(colIdx, start, end, v);\n return upperBound(colIdx, lo, end, v) - lo;\n}\nfunction arcSourceIn(rowPtr, a) {\n let low = 0;\n let high = rowPtr.length;\n while (low < high) {\n const mid = low + Math.floor((high - low) / 2);\n if (rowPtr[mid] <= a) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return low - 1;\n}\nfunction selfLoopsAtIn(rowPtr, colIdx, u) {\n return multiplicityIn(rowPtr, colIdx, u, u);\n}\nconst DEGREE_TIER_HIGH = 1024;\nconst DEGREE_TIER_MID = 32;\nconst DEGREE_TIER_LOW = 1;\nfunction identityPermutation(length) {\n const out = new Uint32Array(length);\n for (let i = 0; i < length; i++) {\n out[i] = i;\n }\n return out;\n}\nclass ReverseAdjacency {\n /**\n * Wrap the reverse arrays. Used by `computeReverse()`; not meant to be constructed elsewhere.\n * @param source - the snapshot the view belongs to\n * @param rowPtr - the reverse row offsets\n * @param colIdx - the reverse targets (forward sources)\n * @param weights - the gathered weights, or null when unweighted\n * @param fwdArc - the reverse arc -> forward arc map, or null when it is the identity (undirected)\n */\n constructor(source, rowPtr, colIdx, weights, fwdArc) {\n this.source = source;\n this.directed = source.directed;\n this.nodeCount = source.nodeCount;\n this.arcCount = source.arcCount;\n this.rowPtr = rowPtr;\n this.colIdx = colIdx;\n this.weights = weights;\n this.fwdArcCache = fwdArc;\n this.fwdArcIsIdentity = fwdArc === null;\n this.arcToEdgeCache = null;\n this.arcToEdgeOwned = false;\n }\n /**\n * Reverse arc k -> forward arc index; the identity for an undirected snapshot, materialised on first\n * read outside any arena.\n * @returns the map, arcCount entries\n */\n get fwdArc() {\n this.fwdArcCache ??= identityPermutation(this.arcCount);\n return this.fwdArcCache;\n }\n /**\n * Logical edge of every reverse arc: `source.arcToEdge[fwdArc[k]]`, materialised on first read.\n * Aliases `source.arcToEdge` when undirected and `fwdArc` when the forward permutation is the\n * identity.\n * @returns the map, arcCount entries\n */\n get arcToEdge() {\n if (this.arcToEdgeCache === null) {\n if (this.fwdArcIsIdentity) {\n this.arcToEdgeCache = this.source.arcToEdge;\n } else if (this.source.flags.arcToEdgeIsIdentity) {\n this.arcToEdgeCache = this.fwdArc;\n } else {\n const { fwdArc } = this;\n const forward = this.source.arcToEdge;\n const out = new Uint32Array(this.arcCount);\n for (let k = 0; k < out.length; k++) {\n out[k] = forward[fwdArc[k]];\n }\n this.arcToEdgeCache = out;\n this.arcToEdgeOwned = true;\n }\n }\n return this.arcToEdgeCache;\n }\n /**\n * Bytes owned by this view (not shared with the snapshot's core): the reverse arrays when directed,\n * a materialised identity `fwdArc`, and a gathered `arcToEdge`.\n * @returns the byte count\n */\n get ownedByteLength() {\n let bytes = 0;\n if (this.directed) {\n bytes += this.rowPtr.byteLength + this.colIdx.byteLength;\n if (this.weights !== null) {\n bytes += this.weights.byteLength;\n }\n }\n if (this.fwdArcCache !== null) {\n bytes += this.fwdArcCache.byteLength;\n }\n if (this.arcToEdgeOwned && this.arcToEdgeCache !== null) {\n bytes += this.arcToEdgeCache.byteLength;\n }\n return bytes;\n }\n /**\n * The arrays this view has materialised so far, for checksums and byte accounting.\n * @returns the arrays, keyed by member name\n */\n materialised() {\n const out = {\n rowPtr: this.rowPtr,\n colIdx: this.colIdx\n };\n if (this.weights !== null) {\n out.weights = this.weights;\n }\n if (this.fwdArcCache !== null) {\n out.fwdArc = this.fwdArcCache;\n }\n if (this.arcToEdgeCache !== null) {\n out.arcToEdge = this.arcToEdgeCache;\n }\n return out;\n }\n}\nfunction computeReverse(snapshot) {\n const { nodeCount, arcCount, rowPtr, colIdx, weights } = snapshot;\n if (!snapshot.directed) {\n return new ReverseAdjacency(snapshot, rowPtr, colIdx, weights, null);\n }\n const revPtr = new Uint32Array(nodeCount + 1);\n for (let a = 0; a < arcCount; a++) {\n revPtr[colIdx[a] + 1]++;\n }\n for (let v = 0; v < nodeCount; v++) {\n revPtr[v + 1] += revPtr[v];\n }\n const revIdx = new Uint32Array(arcCount);\n const fwdArc = new Uint32Array(arcCount);\n const revWeights = weights === null ? null : new Float32Array(arcCount);\n const cursor = revPtr.slice(0, nodeCount);\n for (let u = 0; u < nodeCount; u++) {\n const end = rowPtr[u + 1];\n for (let a = rowPtr[u]; a < end; a++) {\n const v = colIdx[a];\n const k = cursor[v]++;\n revIdx[k] = u;\n fwdArc[k] = a;\n if (revWeights !== null && weights !== null) {\n revWeights[k] = weights[a];\n }\n }\n }\n return new ReverseAdjacency(snapshot, revPtr, revIdx, revWeights, fwdArc);\n}\nfunction expandRowPtr(rowPtr, nodeCount, arcCount) {\n const src = new Uint32Array(arcCount);\n for (let u = 0; u < nodeCount; u++) {\n const end = rowPtr[u + 1];\n for (let a = rowPtr[u]; a < end; a++) {\n src[a] = u;\n }\n }\n return src;\n}\nfunction computeCoo(snapshot) {\n return cooViewOf(snapshot, expandRowPtr(snapshot.rowPtr, snapshot.nodeCount, snapshot.arcCount));\n}\nfunction cooViewOf(snapshot, src) {\n return Object.freeze({\n src,\n dst: snapshot.colIdx,\n weights: snapshot.weights,\n get arcToEdge() {\n return snapshot.arcToEdge;\n }\n });\n}\nfunction computeEdgeList(snapshot) {\n const { nodeCount, edgeCount, arcCount, rowPtr, colIdx, weights } = snapshot;\n if (snapshot.flags.arcToEdgeIsIdentity) {\n return edgeListViewOf(snapshot, expandRowPtr(rowPtr, nodeCount, arcCount), colIdx, weights);\n }\n const { arcToEdge, edgeToArc } = snapshot;\n const src = new Uint32Array(edgeCount);\n const dst = new Uint32Array(edgeCount);\n for (let u = 0; u < nodeCount; u++) {\n const end = rowPtr[u + 1];\n for (let a = rowPtr[u]; a < end; a++) {\n const e = arcToEdge[a];\n if (edgeToArc[e] === a) {\n src[e] = u;\n dst[e] = colIdx[a];\n }\n }\n }\n let edgeWeights = null;\n if (weights !== null) {\n edgeWeights = new Float32Array(edgeCount);\n for (let e = 0; e < edgeCount; e++) {\n edgeWeights[e] = weights[edgeToArc[e]];\n }\n }\n return edgeListViewOf(snapshot, src, dst, edgeWeights);\n}\nfunction edgeListViewOf(snapshot, src, dst, weights) {\n return Object.freeze({\n src,\n dst,\n weights,\n get arc() {\n return snapshot.edgeToArc;\n }\n });\n}\nfunction rowLengths(rowPtr, nodeCount) {\n const out = new Uint32Array(nodeCount);\n for (let u = 0; u < nodeCount; u++) {\n out[u] = rowPtr[u + 1] - rowPtr[u];\n }\n return out;\n}\nfunction sumDegrees(outDegree, inOrLoops) {\n const out = new Uint32Array(outDegree.length);\n for (let u = 0; u < out.length; u++) {\n out[u] = outDegree[u] + inOrLoops[u];\n }\n return out;\n}\nfunction rowWeightSums(rowPtr, weights, nodeCount) {\n const out = new Float64Array(nodeCount);\n for (let u = 0; u < nodeCount; u++) {\n const end = rowPtr[u + 1];\n let sum = 0;\n for (let a = rowPtr[u]; a < end; a++) {\n sum += weights[a];\n }\n out[u] = sum;\n }\n return out;\n}\nfunction widenToF64(counts) {\n return new Float64Array(counts);\n}\nfunction sumF64(a, b) {\n const out = new Float64Array(a.length);\n for (let i = 0; i < out.length; i++) {\n out[i] = a[i] + b[i];\n }\n return out;\n}\nfunction computeTotalWeight(snapshot) {\n const { weights, edgeCount } = snapshot;\n if (weights === null) {\n return edgeCount;\n }\n let sum = 0;\n if (snapshot.flags.arcToEdgeIsIdentity) {\n for (let a = 0; a < weights.length; a++) {\n sum += weights[a];\n }\n return sum;\n }\n const { edgeToArc } = snapshot;\n for (let e = 0; e < edgeCount; e++) {\n sum += weights[edgeToArc[e]];\n }\n return sum;\n}\nfunction computeSelfLoops(snapshot) {\n const { nodeCount, rowPtr, colIdx, selfLoopCount } = snapshot;\n const perNode = new Uint32Array(nodeCount);\n const arcs = new Uint32Array(selfLoopCount);\n let at = 0;\n for (let u = 0; u < nodeCount; u++) {\n const [lo, hi] = arcRangeIn(rowPtr, colIdx, u, u);\n perNode[u] = hi - lo;\n for (let a = lo; a < hi && at < selfLoopCount; a++) {\n arcs[at++] = a;\n }\n }\n return { selfLoopArcs: arcs, selfLoopsPerNode: perNode };\n}\nfunction computeSelfLoopWeight(snapshot, loops) {\n const { weights, nodeCount, rowPtr, colIdx } = snapshot;\n if (weights === null) {\n return widenToF64(loops.selfLoopsPerNode);\n }\n const out = new Float64Array(nodeCount);\n for (let u = 0; u < nodeCount; u++) {\n if (loops.selfLoopsPerNode[u] === 0) {\n continue;\n }\n const [lo, hi] = arcRangeIn(rowPtr, colIdx, u, u);\n let sum = 0;\n for (let a = lo; a < hi; a++) {\n sum += weights[a];\n }\n out[u] = sum;\n }\n return out;\n}\nfunction pairingError(u, v, arc) {\n return new GraphFormatError(\n \"E_INVALID_SNAPSHOT\",\n `invariant I7 violated: arc ${arc} in row ${u} targeting ${v} has no mate in row ${v}`,\n { invariant: \"I7\", row: u, arc, target: v }\n );\n}\nfunction computeMate(snapshot) {\n if (snapshot.directed) {\n throw new GraphFormatError(\"E_DIRECTED\", \"mate() is defined for undirected snapshots only\", {\n directed: true\n });\n }\n const { nodeCount, arcCount, rowPtr, colIdx } = snapshot;\n const mate = new Uint32Array(arcCount);\n const cursor = rowPtr.slice(0, nodeCount);\n for (let u = 0; u < nodeCount; u++) {\n const end = rowPtr[u + 1];\n let a = cursor[u];\n while (a < end) {\n const v = colIdx[a];\n let g = a + 1;\n while (g < end && colIdx[g] === v) {\n g++;\n }\n const k = g - a;\n if (v === u) {\n for (let i = 0; i < k; i++) {\n mate[a + i] = a + i;\n }\n } else {\n const b = cursor[v];\n if (v < u || b + k > rowPtr[v + 1] || colIdx[b] !== u || colIdx[b + k - 1] !== u) {\n throw pairingError(u, v, a);\n }\n for (let i = 0; i < k; i++) {\n mate[a + i] = b + i;\n mate[b + i] = a + i;\n }\n cursor[v] = b + k;\n }\n a = g;\n }\n cursor[u] = end;\n }\n return mate;\n}\nfunction computeDegreeOrder(rowPtr, nodeCount) {\n const degree = rowLengths(rowPtr, nodeCount);\n let maxDegree = 0;\n for (let u = 0; u < nodeCount; u++) {\n if (degree[u] > maxDegree) {\n maxDegree = degree[u];\n }\n }\n const start = new Uint32Array(maxDegree + 1);\n for (let u = 0; u < nodeCount; u++) {\n start[degree[u]]++;\n }\n let run = 0;\n for (let d = maxDegree; d >= 0; d--) {\n const count = start[d];\n start[d] = run;\n run += count;\n }\n const perm = new Uint32Array(nodeCount);\n let hi = 0;\n let mid = 0;\n let low = 0;\n for (let u = 0; u < nodeCount; u++) {\n const d = degree[u];\n perm[start[d]++] = u;\n if (d >= DEGREE_TIER_HIGH) {\n hi++;\n } else if (d >= DEGREE_TIER_MID) {\n mid++;\n } else if (d >= DEGREE_TIER_LOW) {\n low++;\n }\n }\n const segmentOffsets = new Uint32Array([0, hi, hi + mid, hi + mid + low, nodeCount]);\n return Object.freeze({ perm, segmentOffsets });\n}\nfunction computeSymmetric(snapshot, reverse) {\n if (!snapshot.directed) {\n return true;\n }\n const { nodeCount, arcCount, rowPtr, colIdx, weights } = snapshot;\n for (let v = 0; v <= nodeCount; v++) {\n if (rowPtr[v] !== reverse.rowPtr[v]) {\n return false;\n }\n }\n const revIdx = reverse.colIdx;\n for (let a2 = 0; a2 < arcCount; a2++) {\n if (colIdx[a2] !== revIdx[a2]) {\n return false;\n }\n }\n const revWeights = reverse.weights;\n if (weights === null || revWeights === null) {\n return true;\n }\n if (!snapshot.flags.multigraph) {\n for (let a2 = 0; a2 < arcCount; a2++) {\n if (weights[a2] !== revWeights[a2]) {\n return false;\n }\n }\n return true;\n }\n let a = 0;\n while (a < arcCount) {\n let b = a + 1;\n while (b < arcCount && colIdx[b] === colIdx[a] && b < rowPtr[rowOf(rowPtr, nodeCount, a) + 1]) {\n b++;\n }\n if (b - a === 1) {\n if (weights[a] !== revWeights[a]) {\n return false;\n }\n } else if (!sameWeightMultiset(weights, revWeights, a, b)) {\n return false;\n }\n a = b;\n }\n return true;\n}\nfunction rowOf(rowPtr, nodeCount, a) {\n let lo = 0;\n let hi = nodeCount;\n while (hi - lo > 1) {\n const mid = lo + hi >>> 1;\n if (rowPtr[mid] <= a) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n return lo;\n}\nfunction sameWeightMultiset(x, y, start, end) {\n const p = x.slice(start, end).sort();\n const q = y.slice(start, end).sort();\n for (let i = 0; i < p.length; i++) {\n if (p[i] !== q[i] && !(Number.isNaN(p[i]) && Number.isNaN(q[i]))) {\n return false;\n }\n }\n return true;\n}\nfunction viewByteLength(snapshot, name, value) {\n switch (name) {\n case \"reverse\":\n return value instanceof ReverseAdjacency ? value.ownedByteLength : 0;\n case \"coo\": {\n const coo = value;\n return coo.src.byteLength;\n }\n case \"edgeList\": {\n const list = value;\n let bytes = list.src.byteLength;\n if (list.dst !== snapshot.colIdx) {\n bytes += list.dst.byteLength;\n }\n if (list.weights !== null && list.weights !== snapshot.weights) {\n bytes += list.weights.byteLength;\n }\n return bytes;\n }\n case \"outDegree\":\n case \"inDegree\":\n case \"degree\":\n case \"weightedOutDegree\":\n case \"weightedInDegree\":\n case \"weightedDegree\":\n case \"selfLoopWeight\":\n case \"selfLoopArcs\":\n case \"selfLoopsPerNode\":\n case \"mate\":\n return value.byteLength;\n case \"degreeOrder\":\n case \"reverseDegreeOrder\": {\n const order = value;\n return order.perm.byteLength + order.segmentOffsets.byteLength;\n }\n case \"totalWeight\":\n case \"symmetric\":\n return 0;\n default: {\n const unknown = name;\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown view ${String(unknown)}`, { view: unknown });\n }\n }\n}\nfunction viewArrays(snapshot, name, value) {\n switch (name) {\n case \"reverse\":\n return value instanceof ReverseAdjacency ? value.materialised() : {};\n case \"coo\": {\n const coo = value;\n return { src: coo.src };\n }\n case \"edgeList\": {\n const list = value;\n const out = { src: list.src };\n if (list.dst !== snapshot.colIdx) {\n out.dst = list.dst;\n }\n if (list.weights !== null && list.weights !== snapshot.weights) {\n out.weights = list.weights;\n }\n return out;\n }\n case \"outDegree\":\n case \"inDegree\":\n case \"degree\":\n case \"weightedOutDegree\":\n case \"weightedInDegree\":\n case \"weightedDegree\":\n case \"selfLoopWeight\":\n case \"selfLoopArcs\":\n case \"selfLoopsPerNode\":\n case \"mate\":\n return { data: value };\n case \"degreeOrder\":\n case \"reverseDegreeOrder\": {\n const order = value;\n return { perm: order.perm, segmentOffsets: order.segmentOffsets };\n }\n case \"totalWeight\":\n case \"symmetric\":\n return {};\n default: {\n const unknown = name;\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown view ${String(unknown)}`, { view: unknown });\n }\n }\n}\nfunction allocVector(like, length) {\n if (like instanceof Float64Array) {\n return new Float64Array(length);\n }\n if (like instanceof Float32Array) {\n return new Float32Array(length);\n }\n if (like instanceof Int32Array) {\n return new Int32Array(length);\n }\n return new Uint32Array(length);\n}\nfunction foldArcs(snapshot, perArc, reducer, out) {\n const { edgeCount, arcCount } = snapshot;\n assertOneOf(\"reducer\", reducer, [\"first\", \"sum\", \"max\", \"min\"]);\n if (perArc.length !== arcCount) {\n throw new GraphFormatError(\"E_COLUMN_LENGTH\", `perArc has ${perArc.length} entries, expected ${arcCount}`, {\n expected: arcCount,\n found: perArc.length\n });\n }\n if (snapshot.flags.arcToEdgeIsIdentity) {\n if (out === void 0) {\n return perArc;\n }\n out.set(perArc);\n return out;\n }\n const result = out ?? allocVector(perArc, edgeCount);\n const { edgeToArc, arcToEdge } = snapshot;\n for (let e = 0; e < edgeCount; e++) {\n result[e] = perArc[edgeToArc[e]];\n }\n switch (reducer) {\n case \"first\":\n break;\n case \"sum\":\n for (let a = 0; a < arcCount; a++) {\n const e = arcToEdge[a];\n if (edgeToArc[e] !== a) {\n result[e] += perArc[a];\n }\n }\n break;\n case \"max\":\n for (let a = 0; a < arcCount; a++) {\n const e = arcToEdge[a];\n if (perArc[a] > result[e]) {\n result[e] = perArc[a];\n }\n }\n break;\n case \"min\":\n for (let a = 0; a < arcCount; a++) {\n const e = arcToEdge[a];\n if (perArc[a] < result[e]) {\n result[e] = perArc[a];\n }\n }\n break;\n default: {\n const unknown = reducer;\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown reducer ${String(unknown)}`, { reducer: unknown });\n }\n }\n return result;\n}\nfunction expandEdges(snapshot, perEdge, out) {\n const { edgeCount, arcCount } = snapshot;\n if (perEdge.length !== edgeCount) {\n throw new GraphFormatError(\"E_COLUMN_LENGTH\", `perEdge has ${perEdge.length} entries, expected ${edgeCount}`, {\n expected: edgeCount,\n found: perEdge.length\n });\n }\n if (snapshot.flags.arcToEdgeIsIdentity) {\n if (out === void 0) {\n return perEdge;\n }\n out.set(perEdge);\n return out;\n }\n const result = out ?? allocVector(perEdge, arcCount);\n const { arcToEdge } = snapshot;\n for (let a = 0; a < arcCount; a++) {\n result[a] = perEdge[arcToEdge[a]];\n }\n return result;\n}\nfunction invariantViolation(invariant, message, details = {}) {\n return new GraphFormatError(\"E_INVALID_SNAPSHOT\", `invariant ${invariant} violated: ${message}`, {\n invariant,\n ...details\n });\n}\nfunction hasParallelArcs(rowPtr, colIdx, nodeCount) {\n for (let u = 0; u < nodeCount; u++) {\n const end = rowPtr[u + 1];\n for (let a = rowPtr[u] + 1; a < end; a++) {\n if (colIdx[a] === colIdx[a - 1]) {\n return true;\n }\n }\n }\n return false;\n}\nfunction countLoopArcs(rowPtr, colIdx, nodeCount) {\n let loops = 0;\n for (let u = 0; u < nodeCount; u++) {\n const end = rowPtr[u + 1];\n for (let a = rowPtr[u]; a < end; a++) {\n if (colIdx[a] === u) {\n loops++;\n }\n }\n }\n return loops;\n}\nfunction isIdentity(perm) {\n for (let i = 0; i < perm.length; i++) {\n if (perm[i] !== i) {\n return false;\n }\n }\n return true;\n}\nfunction computeFlags(core) {\n const { directed, nodeCount, rowPtr, colIdx, weights, arcToEdge } = core;\n let allWeightsOne = true;\n let nonNegativeWeights = true;\n let finiteWeights = true;\n if (weights !== null) {\n for (let a = 0; a < weights.length; a++) {\n const w = weights[a];\n if (w !== 1) {\n allWeightsOne = false;\n }\n if (!(w >= 0)) {\n nonNegativeWeights = false;\n }\n if (!Number.isFinite(w)) {\n finiteWeights = false;\n }\n }\n }\n return {\n multigraph: hasParallelArcs(rowPtr, colIdx, nodeCount),\n hasSelfLoops: core.selfLoopCount > 0,\n arcToEdgeIsIdentity: directed && (arcToEdge === null || isIdentity(arcToEdge)),\n weighted: weights !== null,\n allWeightsOne,\n nonNegativeWeights,\n finiteWeights\n };\n}\nfunction checkI1(s) {\n const { rowPtr, colIdx, nodeCount, arcCount } = s;\n if (rowPtr.length !== nodeCount + 1) {\n throw invariantViolation(\"I1\", `rowPtr has ${rowPtr.length} entries, expected ${nodeCount + 1}`, {\n expected: nodeCount + 1,\n found: rowPtr.length\n });\n }\n if (rowPtr[0] !== 0) {\n throw invariantViolation(\"I1\", `rowPtr[0] is ${rowPtr[0]}, expected 0`, { row: 0, found: rowPtr[0] });\n }\n for (let u = 0; u < nodeCount; u++) {\n if (rowPtr[u + 1] < rowPtr[u]) {\n throw invariantViolation(\"I1\", `rowPtr decreases at row ${u}: ${rowPtr[u]} -> ${rowPtr[u + 1]}`, {\n row: u\n });\n }\n }\n if (rowPtr[nodeCount] !== arcCount || colIdx.length !== arcCount) {\n throw invariantViolation(\n \"I1\",\n `rowPtr[${nodeCount}] = ${rowPtr[nodeCount]}, colIdx.length = ${colIdx.length}, arcCount = ${arcCount}`,\n { row: nodeCount, found: rowPtr[nodeCount], expected: arcCount, colIdxLength: colIdx.length }\n );\n }\n}\nfunction checkI2(s) {\n const { colIdx, nodeCount } = s;\n for (let a = 0; a < colIdx.length; a++) {\n if (colIdx[a] >= nodeCount) {\n throw invariantViolation(\"I2\", `colIdx[${a}] = ${colIdx[a]} is not below nodeCount ${nodeCount}`, {\n arc: a,\n found: colIdx[a]\n });\n }\n }\n}\nfunction checkI3(s) {\n const counts = [\n [\"nodeCount\", s.nodeCount],\n [\"edgeCount\", s.edgeCount],\n [\"arcCount\", s.arcCount],\n [\"selfLoopCount\", s.selfLoopCount]\n ];\n for (const [name, value] of counts) {\n if (!Number.isInteger(value) || value < 0 || value > MAX_COUNT) {\n throw invariantViolation(\"I3\", `${name} = ${value} is not an integer in [0, MAX_COUNT]`, {\n count: name,\n found: value\n });\n }\n }\n if (s.edgeCount > s.arcCount) {\n throw invariantViolation(\"I3\", `edgeCount ${s.edgeCount} exceeds arcCount ${s.arcCount}`, {\n edgeCount: s.edgeCount,\n arcCount: s.arcCount\n });\n }\n if (s.selfLoopCount > s.edgeCount) {\n throw invariantViolation(\"I3\", `selfLoopCount ${s.selfLoopCount} exceeds edgeCount ${s.edgeCount}`, {\n selfLoopCount: s.selfLoopCount,\n edgeCount: s.edgeCount\n });\n }\n}\nfunction checkI4(s) {\n const { rowPtr, colIdx, nodeCount } = s;\n const identity = s.flags.arcToEdgeIsIdentity;\n const arcToEdge = identity ? null : s.arcToEdge;\n for (let u = 0; u < nodeCount; u++) {\n const end = rowPtr[u + 1];\n for (let a = rowPtr[u] + 1; a < end; a++) {\n if (colIdx[a] < colIdx[a - 1]) {\n throw invariantViolation(\"I4\", `row ${u} is not sorted at arc ${a}`, { row: u, arc: a });\n }\n if (colIdx[a] === colIdx[a - 1] && arcToEdge !== null && arcToEdge[a] <= arcToEdge[a - 1]) {\n throw invariantViolation(\"I4\", `parallel arcs ${a - 1} and ${a} in row ${u} are not in edge order`, {\n row: u,\n arc: a\n });\n }\n }\n }\n}\nfunction checkI5Ranges(s) {\n const { arcCount, edgeCount } = s;\n if (s.flags.arcToEdgeIsIdentity) {\n if (!s.directed || arcCount !== edgeCount) {\n throw invariantViolation(\"I5\", \"identity permutation claimed on a snapshot where it cannot hold\", {\n directed: s.directed,\n arcCount,\n edgeCount\n });\n }\n return;\n }\n const { arcToEdge, edgeToArc } = s;\n if (arcToEdge.length !== arcCount) {\n throw invariantViolation(\"I5\", `arcToEdge has ${arcToEdge.length} entries, expected ${arcCount}`, {\n expected: arcCount,\n found: arcToEdge.length\n });\n }\n if (edgeToArc.length !== edgeCount) {\n throw invariantViolation(\"I5\", `edgeToArc has ${edgeToArc.length} entries, expected ${edgeCount}`, {\n expected: edgeCount,\n found: edgeToArc.length\n });\n }\n for (let a = 0; a < arcCount; a++) {\n if (arcToEdge[a] >= edgeCount) {\n throw invariantViolation(\"I5\", `arcToEdge[${a}] = ${arcToEdge[a]} is not below edgeCount ${edgeCount}`, {\n arc: a,\n found: arcToEdge[a]\n });\n }\n }\n for (let e = 0; e < edgeCount; e++) {\n if (edgeToArc[e] >= arcCount) {\n throw invariantViolation(\"I5\", `edgeToArc[${e}] = ${edgeToArc[e]} is not below arcCount ${arcCount}`, {\n edge: e,\n found: edgeToArc[e]\n });\n }\n }\n}\nfunction checkI5Orientation(s) {\n if (s.flags.arcToEdgeIsIdentity) {\n return;\n }\n const { arcToEdge, edgeToArc, edgeCount } = s;\n for (let e = 0; e < edgeCount; e++) {\n if (arcToEdge[edgeToArc[e]] !== e) {\n throw invariantViolation(\"I5\", `arcToEdge[edgeToArc[${e}]] = ${arcToEdge[edgeToArc[e]]}, expected ${e}`, {\n edge: e,\n arc: edgeToArc[e]\n });\n }\n }\n}\nfunction checkI6(s, full) {\n if (!s.directed) {\n return;\n }\n const { arcCount, edgeCount } = s;\n if (arcCount !== edgeCount) {\n throw invariantViolation(\"I6\", `directed snapshot has arcCount ${arcCount} but edgeCount ${edgeCount}`, {\n arcCount,\n edgeCount\n });\n }\n if (!full || s.flags.arcToEdgeIsIdentity) {\n return;\n }\n const { arcToEdge } = s;\n const seen = new Uint8Array(edgeCount);\n for (let a = 0; a < arcCount; a++) {\n const e = arcToEdge[a];\n if (e >= edgeCount || seen[e] === 1) {\n throw invariantViolation(\"I6\", `edge ${e} appears more than once in arcToEdge (arc ${a})`, {\n arc: a,\n edge: e\n });\n }\n seen[e] = 1;\n }\n}\nfunction checkI7Counts(s) {\n if (s.directed) {\n return;\n }\n const expected = 2 * s.edgeCount - s.selfLoopCount;\n if (s.arcCount !== expected) {\n throw invariantViolation(\n \"I7\",\n `undirected snapshot has arcCount ${s.arcCount}, expected 2 * ${s.edgeCount} - ${s.selfLoopCount} = ${expected}`,\n { arcCount: s.arcCount, expected }\n );\n }\n}\nfunction checkI7Pairing(s) {\n if (s.directed) {\n return;\n }\n const { nodeCount, arcCount, edgeCount, rowPtr, colIdx, weights, arcToEdge } = s;\n const occurrences = new Uint8Array(edgeCount);\n for (let a = 0; a < arcCount; a++) {\n const e = arcToEdge[a];\n if (occurrences[e] === 2) {\n throw invariantViolation(\"I7\", `edge ${e} appears more than twice in arcToEdge (arc ${a})`, {\n arc: a,\n edge: e\n });\n }\n occurrences[e]++;\n }\n const cursor = rowPtr.slice(0, nodeCount);\n for (let u = 0; u < nodeCount; u++) {\n const end = rowPtr[u + 1];\n let a = cursor[u];\n if (a < rowPtr[u] || a > end) {\n throw invariantViolation(\"I7\", `row ${u} was over-consumed by mates from earlier rows`, { row: u });\n }\n while (a < end) {\n const v = colIdx[a];\n let g = a + 1;\n while (g < end && colIdx[g] === v) {\n g++;\n }\n const k = g - a;\n if (v === u) {\n for (let i = a; i < g; i++) {\n if (occurrences[arcToEdge[i]] !== 1) {\n throw invariantViolation(\"I7\", `self-loop edge ${arcToEdge[i]} has more than one arc`, {\n row: u,\n arc: i,\n edge: arcToEdge[i]\n });\n }\n }\n } else {\n if (v < u) {\n throw invariantViolation(\"I7\", `arc ${a} in row ${u} targets ${v} but row ${v} holds no mate`, {\n row: u,\n arc: a,\n target: v\n });\n }\n const b = cursor[v];\n const rowEnd = rowPtr[v + 1];\n for (let i = 0; i < k; i++) {\n const arc = a + i;\n const mate = b + i;\n if (mate >= rowEnd || colIdx[mate] !== u) {\n throw invariantViolation(\n \"I7\",\n `arc ${arc} in row ${u} targeting ${v} has no mate in row ${v}`,\n {\n row: u,\n arc,\n target: v\n }\n );\n }\n if (arcToEdge[mate] !== arcToEdge[arc]) {\n throw invariantViolation(\n \"I7\",\n `arcs ${arc} and ${mate} should share a logical edge but hold ${arcToEdge[arc]} and ${arcToEdge[mate]}`,\n { row: u, arc, mate }\n );\n }\n if (occurrences[arcToEdge[arc]] !== 2) {\n throw invariantViolation(\"I7\", `edge ${arcToEdge[arc]} of arc ${arc} does not have two arcs`, {\n row: u,\n arc,\n edge: arcToEdge[arc]\n });\n }\n if (weights !== null && weights[arc] !== weights[mate]) {\n throw invariantViolation(\n \"I7\",\n `arcs ${arc} and ${mate} carry different weights ${weights[arc]} and ${weights[mate]}`,\n { row: u, arc, mate }\n );\n }\n }\n if (b + k < rowEnd && colIdx[b + k] === u) {\n throw invariantViolation(\"I7\", `row ${v} holds more arcs to ${u} than row ${u} holds to ${v}`, {\n row: v,\n arc: b + k,\n target: u\n });\n }\n cursor[v] = b + k;\n }\n a = g;\n }\n cursor[u] = end;\n }\n}\nfunction checkI8Length(s) {\n const { weights, arcCount } = s;\n if (weights !== null && weights.length !== arcCount) {\n throw invariantViolation(\"I8\", `weights has ${weights.length} entries, expected ${arcCount}`, {\n expected: arcCount,\n found: weights.length\n });\n }\n}\nfunction checkI8NaN(s) {\n const { weights } = s;\n if (weights === null) {\n return;\n }\n for (let a = 0; a < weights.length; a++) {\n if (Number.isNaN(weights[a])) {\n throw invariantViolation(\"I8\", `weights[${a}] is NaN`, { arc: a });\n }\n }\n}\nfunction checkI9(s) {\n const loopArcs = countLoopArcs(s.rowPtr, s.colIdx, s.nodeCount);\n if (loopArcs !== s.selfLoopCount) {\n throw invariantViolation(\"I9\", `selfLoopCount is ${s.selfLoopCount} but ${loopArcs} loop arcs exist`, {\n reason: \"selfLoopCount\",\n expected: loopArcs,\n found: s.selfLoopCount\n });\n }\n const recomputed = computeFlags({\n directed: s.directed,\n nodeCount: s.nodeCount,\n rowPtr: s.rowPtr,\n colIdx: s.colIdx,\n weights: s.weights,\n arcToEdge: s.flags.arcToEdgeIsIdentity ? null : s.arcToEdge,\n selfLoopCount: s.selfLoopCount\n });\n const names = [\n \"multigraph\",\n \"hasSelfLoops\",\n \"arcToEdgeIsIdentity\",\n \"weighted\",\n \"allWeightsOne\",\n \"nonNegativeWeights\",\n \"finiteWeights\"\n ];\n for (const name of names) {\n if (s.flags[name] !== recomputed[name]) {\n throw invariantViolation(\"I9\", `flag ${name} is ${s.flags[name]} but the arrays say ${recomputed[name]}`, {\n flag: name,\n found: s.flags[name],\n expected: recomputed[name]\n });\n }\n }\n}\nfunction checkSegment(arena, name, array) {\n const segment = arena.segments[name];\n if (segment === null) {\n return;\n }\n if (array === null) {\n throw invariantViolation(\"I10\", `arena names a segment for absent core array ${name}`, { array: name });\n }\n const relative = segment.byteOffset - arena.byteOffset;\n if (relative < 0 || relative % ALIGNMENT !== 0 || relative + segment.byteLength > arena.byteLength) {\n throw invariantViolation(\n \"I10\",\n `arena segment ${name} at ${segment.byteOffset} is not 256-aligned inside the arena`,\n {\n array: name,\n byteOffset: segment.byteOffset\n }\n );\n }\n if (array.buffer !== arena.buffer || array.byteOffset !== segment.byteOffset || array.byteLength !== segment.byteLength) {\n throw invariantViolation(\"I10\", `core array ${name} is not the view its arena segment describes`, {\n array: name,\n byteOffset: array.byteOffset,\n byteLength: array.byteLength\n });\n }\n}\nfunction checkI10(s) {\n const identity = s.flags.arcToEdgeIsIdentity;\n const arrays = [\n [\"rowPtr\", s.rowPtr],\n [\"colIdx\", s.colIdx],\n [\"weights\", s.weights],\n [\"arcToEdge\", identity ? null : s.arcToEdge],\n [\"edgeToArc\", identity ? null : s.edgeToArc]\n ];\n for (const [name, array] of arrays) {\n if (array === null) {\n continue;\n }\n if (!isFourByteAligned(array)) {\n throw invariantViolation(\"I10\", `core array ${name} is not 4-byte aligned`, {\n array: name,\n byteOffset: array.byteOffset,\n byteLength: array.byteLength\n });\n }\n if (!isOverPlainBuffer(array)) {\n throw invariantViolation(\"I10\", `core array ${name} is not a view over a plain ArrayBuffer`, {\n array: name,\n reason: \"buffer\"\n });\n }\n }\n const { arena } = s;\n if (arena === null) {\n return;\n }\n const { alignment } = arena;\n if (alignment !== ALIGNMENT) {\n throw invariantViolation(\"I10\", `arena alignment is ${alignment}, expected ${ALIGNMENT}`, {\n found: alignment\n });\n }\n for (const [name, array] of arrays) {\n checkSegment(arena, name, array);\n }\n let hotEnd = 0;\n for (const name of [\"rowPtr\", \"colIdx\", \"weights\"]) {\n const segment = arena.segments[name];\n if (segment !== null) {\n hotEnd = segment.byteOffset + segment.byteLength - arena.byteOffset;\n }\n }\n if (arena.hotByteLength !== hotEnd) {\n throw invariantViolation(\"I10\", `arena.hotByteLength is ${arena.hotByteLength}, expected ${hotEnd}`, {\n reason: \"hotByteLength\",\n found: arena.hotByteLength,\n expected: hotEnd\n });\n }\n}\nfunction checkI11Size(s) {\n if (s.ids.size !== s.nodeCount) {\n throw invariantViolation(\"I11\", `ids.size is ${s.ids.size}, expected nodeCount ${s.nodeCount}`, {\n expected: s.nodeCount,\n found: s.ids.size\n });\n }\n}\nfunction checkI11Bijection(s) {\n const { ids, nodeCount } = s;\n for (let i = 0; i < nodeCount; i++) {\n const id = ids.idOf(i);\n if (typeof id === \"number\" && Number.isNaN(id)) {\n throw invariantViolation(\"I11\", `id of node ${i} is NaN`, { index: i });\n }\n const back = ids.indexOf(id);\n if (back !== i) {\n throw invariantViolation(\"I11\", `ids.indexOf(ids.idOf(${i})) is ${back}`, { index: i, found: back });\n }\n }\n}\nfunction columnViolation(table, column, message, details = {}) {\n return invariantViolation(\"I12\", `column \"${column.meta.name}\" of table ${table}: ${message}`, {\n table,\n column: column.meta.name,\n ...details\n });\n}\nfunction checkOffsets(table, column, offsets, rows, end) {\n if (offsets.length !== rows + 1) {\n throw columnViolation(table, column, `offsets has ${offsets.length} entries, expected ${rows + 1}`, {\n expected: rows + 1,\n found: offsets.length\n });\n }\n if (offsets[0] !== 0) {\n throw columnViolation(table, column, `offsets[0] is ${offsets[0]}`, { row: 0 });\n }\n for (let r = 0; r < rows; r++) {\n if (offsets[r + 1] < offsets[r]) {\n throw columnViolation(table, column, `offsets decrease at row ${r}`, { row: r });\n }\n }\n if (offsets[rows] !== end) {\n throw columnViolation(table, column, `offsets[${rows}] is ${offsets[rows]}, expected ${end}`, {\n row: rows,\n found: offsets[rows],\n expected: end\n });\n }\n}\nfunction checkReferences(table, column, values, components, bound, rowValidity) {\n for (let i = 0; i < values.length; i++) {\n const value = values[i];\n if (value === INVALID_INDEX) {\n const row = Math.floor(i / components);\n if (rowValidity !== void 0 && (rowValidity === null || bitmapGet(rowValidity, row))) {\n throw columnViolation(table, column, `row ${row} is set but holds INVALID_INDEX`, { row });\n }\n continue;\n }\n if (value >= bound) {\n throw columnViolation(table, column, `value ${value} at ${i} is not below ${bound}`, {\n row: Math.floor(i / components),\n found: value,\n expected: bound\n });\n }\n }\n}\nfunction checkColumnReferences(table, column, bound) {\n switch (column.dtype) {\n case \"u32\":\n checkReferences(table, column, column.data, column.meta.components, bound, column.validity);\n return;\n case \"list\": {\n const { child } = column;\n if (child.dtype !== \"u32\") {\n throw columnViolation(table, column, `refersTo list requires a u32 child, found ${child.dtype}`);\n }\n checkReferences(table, column, child.data, 1, bound, void 0);\n return;\n }\n default:\n throw columnViolation(table, column, `refersTo requires dtype u32, found ${column.dtype}`);\n }\n}\nfunction columnArrays(column) {\n switch (column.dtype) {\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\":\n case \"bool\":\n return [\n [\"data\", column.data],\n [\"validity\", column.validity]\n ];\n case \"dict\":\n return [\n [\"codes\", column.codes],\n [\"validity\", column.validity]\n ];\n case \"string\":\n return [\n [\"offsets\", column.offsets],\n [\"utf8\", column.utf8],\n [\"validity\", column.validity]\n ];\n case \"list\":\n return [\n [\"offsets\", column.offsets],\n [\"validity\", column.validity],\n ...columnArrays(column.child).map(([name, array]) => [\n `child.${name}`,\n array\n ])\n ];\n case \"json\":\n return [[\"validity\", column.validity]];\n default: {\n const unknown = column;\n throw invariantViolation(\"I12\", `unknown dtype ${unknown.dtype}`);\n }\n }\n}\nfunction checkColumnRules(table, column, rows, s) {\n if (column.length !== rows) {\n throw columnViolation(table, column, `has ${column.length} rows, expected ${rows}`, {\n expected: rows,\n found: column.length\n });\n }\n const { validity, meta } = column;\n const validityWords = Math.ceil(rows / 32);\n if (validity !== null && validity.length !== validityWords) {\n throw columnViolation(table, column, `validity has ${validity.length} words, expected ${validityWords}`, {\n expected: validityWords,\n found: validity.length\n });\n }\n const nullCount = validity === null ? 0 : rows - bitmapCount(validity, rows);\n if (column.nullCount !== nullCount) {\n throw columnViolation(\n table,\n column,\n `nullCount is ${column.nullCount}, the validity bitmap says ${nullCount}`,\n {\n expected: nullCount,\n found: column.nullCount,\n reason: \"nullCount\"\n }\n );\n }\n for (const [name, array] of columnArrays(column)) {\n if (array !== null && !isOverPlainBuffer(array)) {\n throw columnViolation(table, column, `${name} is not a view over a plain ArrayBuffer`, {\n array: name,\n reason: \"buffer\"\n });\n }\n }\n const refBound = meta.refersTo === \"node\" ? s.nodeCount : s.edgeCount;\n const { dtype } = column;\n switch (dtype) {\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\": {\n const expected = rows * meta.components;\n if (column.data.length !== expected) {\n throw columnViolation(table, column, `data has ${column.data.length} values, expected ${expected}`, {\n expected,\n found: column.data.length\n });\n }\n if (meta.refersTo !== null) {\n checkColumnReferences(table, column, refBound);\n }\n break;\n }\n case \"bool\":\n if (column.data.length !== validityWords) {\n throw columnViolation(\n table,\n column,\n `bool data has ${column.data.length} words, expected ${validityWords}`,\n {\n expected: validityWords,\n found: column.data.length\n }\n );\n }\n break;\n case \"dict\": {\n if (column.codes.length !== rows) {\n throw columnViolation(table, column, `codes has ${column.codes.length} entries, expected ${rows}`, {\n expected: rows,\n found: column.codes.length\n });\n }\n const size = column.dictionary.length;\n for (let r = 0; r < rows; r++) {\n if (column.codes[r] >= size && (validity === null || bitmapGet(validity, r))) {\n throw columnViolation(table, column, `code ${column.codes[r]} at row ${r} is not below ${size}`, {\n row: r,\n found: column.codes[r]\n });\n }\n }\n break;\n }\n case \"string\":\n checkOffsets(table, column, column.offsets, rows, column.utf8.length);\n break;\n case \"list\": {\n const { child } = column;\n checkOffsets(table, column, column.offsets, rows, child.length);\n if (child.validity !== null) {\n throw columnViolation(table, column, \"list child column has a validity bitmap\");\n }\n if (meta.refersTo !== null) {\n checkColumnReferences(table, column, refBound);\n }\n break;\n }\n case \"json\":\n if (column.values.length !== rows) {\n throw columnViolation(table, column, `values has ${column.values.length} entries, expected ${rows}`, {\n expected: rows,\n found: column.values.length\n });\n }\n break;\n default: {\n const unknown = dtype;\n throw columnViolation(table, column, `unknown dtype ${String(unknown)}`);\n }\n }\n}\nfunction checkTable(name, table, rows, s) {\n for (const column of table) {\n checkColumnRules(name, column, rows, s);\n }\n}\nfunction checkI12(s) {\n const tables = [\n [\"nodes\", s.nodes, s.nodeCount],\n [\"edges\", s.edges, s.edgeCount],\n [\"graph\", s.graph, 1]\n ];\n for (const [name, table, rows] of tables) {\n if (table.rowCount !== rows) {\n throw invariantViolation(\"I12\", `table ${name} has ${table.rowCount} rows, expected ${rows}`, {\n table: name,\n expected: rows,\n found: table.rowCount\n });\n }\n checkTable(name, table, rows, s);\n }\n for (const [name, table] of s.extensions) {\n checkTable(`extensions[${name}]`, table, table.rowCount, s);\n }\n}\nfunction checkI13(s) {\n if (s.edges.rowCount !== s.edgeCount) {\n throw invariantViolation(\"I13\", `edge table has ${s.edges.rowCount} rows, expected edgeCount ${s.edgeCount}`, {\n expected: s.edgeCount,\n found: s.edges.rowCount\n });\n }\n}\nfunction validateStructure(s) {\n checkI3(s);\n checkI1(s);\n checkI2(s);\n checkI5Ranges(s);\n checkI6(s, false);\n checkI7Counts(s);\n checkI8Length(s);\n checkI10(s);\n checkI11Size(s);\n checkI13(s);\n checkI12(s);\n}\nfunction validateFull(s) {\n validateStructure(s);\n checkI4(s);\n checkI5Orientation(s);\n checkI6(s, true);\n checkI8NaN(s);\n checkI7Pairing(s);\n checkI9(s);\n checkI11Bijection(s);\n const tables = [\n [\"nodes\", s.nodes],\n [\"edges\", s.edges],\n [\"graph\", s.graph],\n ...[...s.extensions].map(([name, table]) => [`extensions[${name}]`, table])\n ];\n for (const [name, table] of tables) {\n for (const column of table) {\n checkUniqueColumn(name, column);\n }\n }\n}\nfunction checkUniqueColumn(table, column) {\n try {\n verifyUniqueColumn(column);\n } catch (err) {\n if (err instanceof GraphFormatError && (err.code === \"E_DUPLICATE_ID\" || err.code === \"E_DUPLICATE_EDGE_ID\")) {\n throw columnViolation(table, column, err.message, { ...err.details, reason: \"unique\", cause: err.code });\n }\n throw err;\n }\n}\nclass CoreFacts {\n /**\n * Expand the core once.\n * @param snapshot - the snapshot\n */\n constructor(snapshot) {\n const { nodeCount, arcCount, rowPtr, colIdx, directed } = snapshot;\n const arcRow = new Uint32Array(arcCount);\n const loops = new Uint32Array(nodeCount);\n const inDegree = directed ? new Uint32Array(nodeCount) : rowLengths(rowPtr, nodeCount);\n for (let u = 0; u < nodeCount; u++) {\n const end = rowPtr[u + 1];\n for (let a = rowPtr[u]; a < end; a++) {\n arcRow[a] = u;\n const v = colIdx[a];\n if (v === u) {\n loops[u]++;\n }\n if (directed) {\n inDegree[v]++;\n }\n }\n }\n this.arcRow = arcRow;\n this.loops = loops;\n this.inDegree = inDegree;\n }\n /**\n * The exclusive prefix sum of the in-degrees (the reverse rowPtr).\n * @returns nodeCount + 1 offsets\n */\n inDegreePrefix() {\n const n = this.inDegree.length;\n const out = new Uint32Array(n + 1);\n for (let u = 0; u < n; u++) {\n out[u + 1] = out[u] + this.inDegree[u];\n }\n return out;\n }\n}\nfunction viewError(view, member, index, invariant) {\n return invariantViolation(invariant, `carried view ${view}.${member} disagrees with the core at ${index}`, {\n view,\n member,\n index,\n reason: \"view\"\n });\n}\nfunction expectSame(view, member, found, expected, invariant) {\n for (let i = 0; i < expected.length; i++) {\n if (!Object.is(found[i], expected[i]) && found[i] !== expected[i]) {\n throw viewError(view, member, i, invariant);\n }\n }\n}\nfunction expectPermutation(view, member, perm) {\n const seen = new Uint8Array(perm.length);\n for (let i = 0; i < perm.length; i++) {\n const p = perm[i];\n if (p >= perm.length || seen[p] === 1) {\n throw viewError(view, member, i, \"I2\");\n }\n seen[p] = 1;\n }\n}\nfunction checkOutDegree(snapshot, data) {\n expectSame(\"outDegree\", \"data\", data, rowLengths(snapshot.rowPtr, snapshot.nodeCount), \"I2\");\n}\nfunction checkInDegree(facts, data) {\n expectSame(\"inDegree\", \"data\", data, facts.inDegree, \"I2\");\n}\nfunction checkDegree(snapshot, facts, data) {\n const out = rowLengths(snapshot.rowPtr, snapshot.nodeCount);\n const add = snapshot.directed ? facts.inDegree : facts.loops;\n for (let u = 0; u < out.length; u++) {\n if (data[u] !== out[u] + add[u]) {\n throw viewError(\"degree\", \"data\", u, \"I2\");\n }\n }\n}\nfunction checkSelfLoopsPerNode(facts, data) {\n expectSame(\"selfLoopsPerNode\", \"data\", data, facts.loops, \"I2\");\n}\nfunction checkSelfLoopArcs(snapshot, facts, data) {\n const { colIdx, arcCount } = snapshot;\n for (let i = 0; i < data.length; i++) {\n const a = data[i];\n if (a >= arcCount || colIdx[a] !== facts.arcRow[a] || i > 0 && a <= data[i - 1]) {\n throw viewError(\"selfLoopArcs\", \"data\", i, \"I2\");\n }\n }\n}\nfunction checkCooSrc(facts, src) {\n expectSame(\"coo\", \"src\", src, facts.arcRow, \"I2\");\n}\nfunction checkEdgeList(snapshot, facts, src, dst, weights) {\n const { edgeCount, edgeToArc, colIdx, arcCount } = snapshot;\n const forward = snapshot.weights;\n for (let e = 0; e < edgeCount; e++) {\n const a = edgeToArc[e];\n if (a >= arcCount || src[e] !== facts.arcRow[a]) {\n throw viewError(\"edgeList\", \"src\", e, \"I2\");\n }\n if (dst !== null && dst[e] !== colIdx[a]) {\n throw viewError(\"edgeList\", \"dst\", e, \"I2\");\n }\n if (weights !== null && forward !== null && !Object.is(weights[e], forward[a])) {\n throw viewError(\"edgeList\", \"weights\", e, \"I17\");\n }\n }\n}\nfunction checkMate(snapshot, facts, mate) {\n const { arcCount, arcToEdge, colIdx } = snapshot;\n for (let a = 0; a < arcCount; a++) {\n const m = mate[a];\n const loop = colIdx[a] === facts.arcRow[a];\n if (m >= arcCount || mate[m] !== a || arcToEdge[m] !== arcToEdge[a] || m === a !== loop) {\n throw viewError(\"mate\", \"data\", a, \"I2\");\n }\n }\n}\nfunction checkDegreeOrder(name, degree, perm, segmentOffsets) {\n expectPermutation(name, \"perm\", perm);\n let hi = 0;\n let mid = 0;\n let low = 0;\n for (let i = 0; i < perm.length; i++) {\n const d = degree[perm[i]];\n if (i > 0) {\n const previous = degree[perm[i - 1]];\n if (d > previous || d === previous && perm[i] < perm[i - 1]) {\n throw viewError(name, \"perm\", i, \"I2\");\n }\n }\n if (d >= DEGREE_TIER_HIGH) {\n hi++;\n } else if (d >= DEGREE_TIER_MID) {\n mid++;\n } else if (d >= 1) {\n low++;\n }\n }\n const expected = [0, hi, hi + mid, hi + mid + low, perm.length];\n expectSame(name, \"segmentOffsets\", segmentOffsets, expected, \"I2\");\n}\nfunction checkReverse(snapshot, facts, reverse) {\n const { nodeCount, arcCount, colIdx } = snapshot;\n const forward = snapshot.weights;\n const { rowPtr, fwdArc } = reverse;\n const revIdx = reverse.colIdx;\n const revWeights = reverse.weights;\n if (rowPtr[0] !== 0 || rowPtr[nodeCount] !== arcCount) {\n throw viewError(\"reverse\", \"rowPtr\", 0, \"I2\");\n }\n expectSame(\"reverse\", \"rowPtr\", rowPtr, facts.inDegreePrefix(), \"I2\");\n expectPermutation(\"reverse\", \"fwdArc\", fwdArc);\n for (let v = 0; v < nodeCount; v++) {\n const end = rowPtr[v + 1];\n for (let k = rowPtr[v]; k < end; k++) {\n const a = fwdArc[k];\n const source = facts.arcRow[a];\n if (colIdx[a] !== v || revIdx[k] !== source) {\n throw viewError(\"reverse\", \"colIdx\", k, \"I2\");\n }\n if (k > rowPtr[v]) {\n const previous = fwdArc[k - 1];\n const previousSource = facts.arcRow[previous];\n if (source < previousSource || source === previousSource && a <= previous) {\n throw viewError(\"reverse\", \"fwdArc\", k, \"I2\");\n }\n }\n if (revWeights !== null && forward !== null && !Object.is(revWeights[k], forward[a])) {\n throw viewError(\"reverse\", \"weights\", k, \"I17\");\n }\n }\n }\n}\nfunction checkF64View(name, found, expected) {\n expectSame(name, \"data\", found, expected, \"I17\");\n}\nconst WIRE_PRODUCER = `@graphty/graph-format@${\"c6f1e85fa20d\"}`;\nconst SCALAR_VIEWS = /* @__PURE__ */ new Set([\"totalWeight\", \"symmetric\"]);\nconst encoder = new TextEncoder();\nfunction assertLittleEndianHost(littleEndian = IS_LITTLE_ENDIAN) {\n if (!littleEndian) {\n throw new GraphFormatError(\"E_UNSUPPORTED\", \"the wire format cannot be written on a big-endian host\", {\n reason: \"big-endian host\"\n });\n }\n}\nconst NUM_TAG$1 = \"$num\";\nconst ESC_TAG$1 = \"$esc\";\nfunction encodeJsonValue(value) {\n if (typeof value === \"number\") {\n if (Number.isNaN(value)) {\n return { [NUM_TAG$1]: \"NaN\" };\n }\n if (value === Infinity) {\n return { [NUM_TAG$1]: \"Infinity\" };\n }\n if (value === -Infinity) {\n return { [NUM_TAG$1]: \"-Infinity\" };\n }\n if (Object.is(value, -0)) {\n return { [NUM_TAG$1]: \"-0\" };\n }\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => encodeJsonValue(item));\n }\n if (isPlainObject(value)) {\n const keys = Object.keys(value);\n const out = {};\n for (const key of keys) {\n defineJsonKey(out, key, encodeJsonValue(value[key]));\n }\n if (keys.length === 1 && (keys[0] === NUM_TAG$1 || keys[0] === ESC_TAG$1)) {\n return { [ESC_TAG$1]: out };\n }\n return out;\n }\n return value;\n}\nfunction defineJsonKey(target, key, value) {\n Object.defineProperty(target, key, { value, enumerable: true, writable: true, configurable: true });\n}\nclass WireLayout {\n /**\n * Create a collector.\n * @param mode - reference (toWire) or container (toBytes)\n * @param transfer - reference mode only: copy shared buffers so the others can be transferred\n */\n constructor(mode, transfer = false) {\n this.buffers = [];\n this.copied = [];\n this.segments = [];\n this.bufferIndex = /* @__PURE__ */ new Map();\n this.placed = /* @__PURE__ */ new Map();\n this.cursor = 0;\n this.mode = mode;\n this.transfer = transfer;\n }\n /**\n * Container mode: the padded byte length of the region (every segment padded to 256 bytes).\n * @returns the region length\n */\n get regionLength() {\n return alignUp(this.cursor, ALIGNMENT);\n }\n /**\n * Reference mode: the index a buffer was assigned, or null when no array over it was placed.\n * @param buffer - the buffer\n * @returns the index into `buffers`, or null\n */\n indexOf(buffer) {\n return this.bufferIndex.get(buffer) ?? null;\n }\n /**\n * Place a typed array and return its reference. The same byte range is placed once. When the\n * holder of the array (its column, table or id map) is shared, the buffer is recorded as shared\n * so `finalise()` copies it under `transfer` (design section 9.1).\n * @param view - the array\n * @param dtype - its wire dtype (\"utf8\" for byte stores, \"u8\" for u8 columns and tags)\n * @param sharedHolder - whether the object holding the array is held by more than one snapshot or table\n * @returns the reference\n */\n ref(view, dtype, sharedHolder = false) {\n if (sharedHolder) {\n noteShared(view.buffer);\n }\n if (this.mode === \"reference\") {\n return {\n buffer: this.bufferIndexOf(view.buffer),\n byteOffset: view.byteOffset,\n byteLength: view.byteLength,\n dtype,\n length: view.length\n };\n }\n const key = `${this.bufferIndexOf(view.buffer)}:${view.byteOffset}:${view.byteLength}:${dtype}`;\n const existing = this.placed.get(key);\n if (existing !== void 0) {\n return existing;\n }\n const byteOffset = alignUp(this.cursor, ALIGNMENT);\n this.cursor = byteOffset + view.byteLength;\n const ref = { buffer: 0, byteOffset, byteLength: view.byteLength, dtype, length: view.length };\n this.placed.set(key, ref);\n this.segments.push({ view, ref });\n return ref;\n }\n /**\n * Reference mode with `transfer`: replace every buffer recorded as shared by a copy and list its\n * index in `copied` (design section 9.1). Called once after every array was placed, so the\n * decision does not depend on the order in which shared holders were met.\n */\n finalise() {\n if (this.mode !== \"reference\" || !this.transfer) {\n return;\n }\n for (let i = 0; i < this.buffers.length; i++) {\n const buffer = this.buffers[i];\n if (isShared(buffer)) {\n this.buffers[i] = buffer.slice(0);\n this.copied.push(i);\n }\n }\n }\n /**\n * The index of a backing buffer, assigning the next one on first sight.\n * @param buffer - the buffer\n * @returns the index\n */\n bufferIndexOf(buffer) {\n const known = this.bufferIndex.get(buffer);\n if (known !== void 0) {\n return known;\n }\n const index = this.buffers.length;\n this.bufferIndex.set(buffer, index);\n this.buffers.push(buffer);\n return index;\n }\n}\nfunction wireDtypeOf(view) {\n if (view instanceof Uint32Array) {\n return \"u32\";\n }\n if (view instanceof Int32Array) {\n return \"i32\";\n }\n if (view instanceof Float32Array) {\n return \"f32\";\n }\n if (view instanceof Float64Array) {\n return \"f64\";\n }\n return \"u8\";\n}\nconst DICTIONARY_CACHE = /* @__PURE__ */ new WeakMap();\nconst JSON_TEXT_CACHE = /* @__PURE__ */ new WeakMap();\nfunction cacheUsable(encoded, rows) {\n return encoded.offsets.length === rows + 1;\n}\nfunction encodedDictionary(dictionary) {\n const cached = DICTIONARY_CACHE.get(dictionary);\n if (cached !== void 0 && cacheUsable(cached, dictionary.length)) {\n return cached;\n }\n const encoded = encodeUtf8Rows(dictionary, dictionary.length);\n DICTIONARY_CACHE.set(dictionary, encoded);\n return encoded;\n}\nfunction encodedJsonText(column) {\n const cached = JSON_TEXT_CACHE.get(column);\n if (cached !== void 0 && cached.version === column.version && cacheUsable(cached.encoded, column.length)) {\n return cached.encoded;\n }\n const texts = new Array(column.length);\n for (let row = 0; row < column.length; row++) {\n const value = column.values[row];\n texts[row] = value === void 0 || !column.isSet(row) ? \"\" : JSON.stringify(encodeJsonValue(value));\n }\n const encoded = encodeUtf8Rows(texts, texts.length);\n JSON_TEXT_CACHE.set(column, { version: column.version, encoded });\n return encoded;\n}\nfunction utf8Ref(layout, encoded, shared) {\n return { offsets: layout.ref(encoded.offsets, \"u32\", shared), utf8: layout.ref(encoded.utf8, \"utf8\", shared) };\n}\nfunction encodeColumnMeta(meta) {\n return {\n name: meta.name,\n domain: meta.domain,\n dtype: meta.dtype,\n components: meta.components,\n itemDtype: meta.itemDtype,\n itemComponents: meta.itemComponents,\n nullable: meta.nullable,\n mutable: meta.mutable,\n role: meta.role,\n refersTo: meta.refersTo,\n unique: meta.unique,\n default: encodeJsonValue(meta.default),\n fill: encodeJsonValue(meta.fill),\n options: meta.options === null ? null : encodeJsonValue(meta.options),\n origin: meta.origin === null ? null : { ...meta.origin },\n dynamic: meta.dynamic,\n extra: encodeJsonValue(meta.extra)\n };\n}\nfunction encodeColumn(layout, column, tableShared) {\n const shared = tableShared || isShared(column);\n const base = {\n meta: encodeColumnMeta(column.meta),\n data: null,\n validity: column.validity === null ? null : layout.ref(column.validity, \"u32\", shared),\n nullCount: column.nullCount,\n dictionary: null,\n strings: null,\n offsets: null,\n child: null,\n jsonText: null\n };\n const { dtype } = column;\n switch (dtype) {\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\":\n base.data = layout.ref(column.data, dtype, shared);\n break;\n case \"bool\":\n base.data = layout.ref(column.data, \"u32\", shared);\n break;\n case \"dict\":\n base.data = layout.ref(column.codes, \"u32\", shared);\n base.dictionary = utf8Ref(layout, encodedDictionary(column.dictionary), shared);\n break;\n case \"string\":\n base.strings = {\n offsets: layout.ref(column.offsets, \"u32\", shared),\n utf8: layout.ref(column.utf8, \"utf8\", shared)\n };\n break;\n case \"list\":\n base.offsets = layout.ref(column.offsets, \"u32\", shared);\n base.child = encodeColumn(layout, column.child, shared);\n break;\n case \"json\":\n base.jsonText = utf8Ref(layout, encodedJsonText(column), shared);\n break;\n default: {\n const name = dtype;\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown dtype ${name}`, { dtype: name });\n }\n }\n return base;\n}\nfunction encodeTable(layout, table) {\n const out = [];\n const tableShared = isShared(table);\n for (const column of table) {\n out.push(encodeColumn(layout, column, tableShared));\n }\n return out;\n}\nfunction encodeIds(layout, snapshot) {\n const { ids } = snapshot;\n if (!(ids instanceof NodeIdMap)) {\n throw new GraphFormatError(\"E_UNSUPPORTED\", \"the snapshot's id map is not a NodeIdMap of this package\", {\n reason: \"foreign id map\"\n });\n }\n const typed = nodeIdMapToTyped(ids);\n const shared = isShared(ids);\n return {\n kind: typed.kind,\n size: typed.size,\n offset: typed.offset,\n values: typed.values === null ? null : layout.ref(typed.values, wireDtypeOf(typed.values), shared),\n tags: typed.tags === null ? null : layout.ref(typed.tags, \"u8\", shared),\n numbers: typed.numbers === null ? null : layout.ref(typed.numbers, \"f64\", shared),\n offsets: typed.offsets === null ? null : layout.ref(typed.offsets, \"u32\", shared),\n utf8: typed.utf8 === null ? null : layout.ref(typed.utf8, \"utf8\", shared)\n };\n}\nfunction encodeGraphMeta(meta) {\n return {\n name: meta.name,\n description: meta.description,\n creator: meta.creator,\n created: meta.created,\n modified: meta.modified,\n keywords: [...meta.keywords],\n sourceFormat: meta.sourceFormat,\n sourceVersion: meta.sourceVersion,\n idType: meta.idType,\n timeFormat: meta.timeFormat,\n timeRepresentation: meta.timeRepresentation,\n mode: meta.mode,\n declaredMultigraph: meta.declaredMultigraph,\n weightOrigin: meta.weightOrigin === null ? null : { ...meta.weightOrigin },\n extra: encodeJsonValue(meta.extra)\n };\n}\nfunction encodeViews(layout, snapshot, names) {\n if (names === void 0 || names.length === 0) {\n return null;\n }\n const out = {};\n let count = 0;\n for (const name of new Set(names)) {\n if (SCALAR_VIEWS.has(name)) {\n continue;\n }\n const value = peekView(snapshot, name);\n if (value === null) {\n continue;\n }\n const members = {};\n let any = false;\n for (const [member, array] of Object.entries(viewArrays(snapshot, name, value))) {\n const view = array;\n members[member] = layout.ref(view, wireDtypeOf(view));\n any = true;\n }\n if (any) {\n out[name] = members;\n count++;\n }\n }\n return count === 0 ? null : out;\n}\nfunction collectWire(snapshot, layout, includeViews, includeColumns = true) {\n assertLittleEndianHost();\n const identity = snapshot.flags.arcToEdgeIsIdentity;\n const coreArrays = {\n rowPtr: snapshot.rowPtr,\n colIdx: snapshot.colIdx,\n weights: snapshot.weights,\n arcToEdge: identity ? null : snapshot.arcToEdge,\n edgeToArc: identity ? null : snapshot.edgeToArc\n };\n const coreRefs = {\n rowPtr: null,\n colIdx: null,\n weights: null,\n arcToEdge: null,\n edgeToArc: null\n };\n const rowPtrRef = layout.ref(snapshot.rowPtr, \"u32\");\n coreRefs.rowPtr = rowPtrRef;\n for (const name of CORE_ORDER) {\n const array = coreArrays[name];\n if (name !== \"rowPtr\" && array !== null && array.length > 0) {\n coreRefs[name] = layout.ref(array, wireDtypeOf(array));\n }\n }\n const arena = encodeArena(snapshot, layout, coreRefs);\n const ids = encodeIds(layout, snapshot);\n const nodeColumns = includeColumns ? encodeTable(layout, snapshot.nodes) : [];\n const edgeColumns = includeColumns ? encodeTable(layout, snapshot.edges) : [];\n const graphColumns = includeColumns ? encodeTable(layout, snapshot.graph) : [];\n const extensions = [];\n if (includeColumns) {\n for (const [name, table] of snapshot.extensions) {\n extensions.push({ name, rowCount: table.rowCount, columns: encodeTable(layout, table) });\n }\n }\n const views = encodeViews(layout, snapshot, includeViews);\n layout.finalise();\n const manifest = {\n format: WIRE_FORMAT,\n wire: [WIRE_MAJOR, WIRE_MINOR],\n producer: WIRE_PRODUCER,\n formatVersion: FORMAT_VERSION,\n directed: snapshot.directed,\n counts: {\n nodes: snapshot.nodeCount,\n edges: snapshot.edgeCount,\n arcs: snapshot.arcCount,\n selfLoops: snapshot.selfLoopCount\n },\n flags: { ...snapshot.flags },\n core: {\n rowPtr: rowPtrRef,\n colIdx: coreRefs.colIdx,\n weights: coreRefs.weights,\n arcToEdge: coreRefs.arcToEdge,\n edgeToArc: coreRefs.edgeToArc\n },\n arena,\n ids,\n nodeColumns,\n edgeColumns,\n graphColumns,\n extensions,\n meta: encodeGraphMeta(snapshot.meta),\n views,\n copied: layout.copied,\n label: snapshot.label\n };\n return { manifest, layout };\n}\nfunction encodeArena(snapshot, layout, coreRefs) {\n if (layout.mode === \"container\") {\n let end = 0;\n let hotByteLength = 0;\n for (const name of CORE_ORDER) {\n const ref = coreRefs[name];\n if (ref === null) {\n continue;\n }\n end = ref.byteOffset + ref.byteLength;\n if (name === \"rowPtr\" || name === \"colIdx\" || name === \"weights\") {\n hotByteLength = end;\n }\n }\n return { buffer: 0, byteOffset: 0, byteLength: end, hotByteLength };\n }\n const { arena } = snapshot;\n if (arena === null) {\n return null;\n }\n const buffer = layout.indexOf(arena.buffer);\n if (buffer === null) {\n return null;\n }\n return { buffer, byteOffset: arena.byteOffset, byteLength: arena.byteLength, hotByteLength: arena.hotByteLength };\n}\nfunction toWire(snapshot, options = {}) {\n const transfer = options.transfer === true;\n const layout = new WireLayout(\"reference\", transfer);\n const { manifest } = collectWire(snapshot, layout, options.includeViews, options.includeColumns !== false);\n if (transfer) {\n TRANSFER_LISTS.set(snapshot, [...layout.buffers]);\n }\n return { manifest, buffers: layout.buffers };\n}\nconst TRANSFER_LISTS = /* @__PURE__ */ new WeakMap();\nfunction transferables(snapshot) {\n const recorded = TRANSFER_LISTS.get(snapshot);\n if (recorded !== void 0) {\n return [...recorded];\n }\n const layout = new WireLayout(\"reference\", false);\n collectWire(snapshot, layout, void 0, true);\n return layout.buffers.filter((buffer) => !isShared(buffer));\n}\nfunction encodeManifest(manifest) {\n return encoder.encode(JSON.stringify(manifest));\n}\nconst WIRE_DTYPES = /* @__PURE__ */ new Set([\"u32\", \"i32\", \"f32\", \"f64\", \"u8\", \"utf8\"]);\nconst COLUMN_DTYPES = /* @__PURE__ */ new Set([\n \"f32\",\n \"f64\",\n \"i32\",\n \"u32\",\n \"u8\",\n \"bool\",\n \"dict\",\n \"string\",\n \"list\",\n \"json\"\n]);\nconst ID_MAP_KINDS = /* @__PURE__ */ new Set([\"identity\", \"dense\", \"numeric\", \"string\", \"mixed\"]);\nconst ID_TYPES = /* @__PURE__ */ new Set([\"string\", \"integer\", \"mixed\"]);\nconst TIME_FORMATS = /* @__PURE__ */ new Set([\n \"integer\",\n \"double\",\n \"date\",\n \"dateTime\"\n]);\nconst TIME_REPRESENTATIONS = /* @__PURE__ */ new Set([\n \"interval\",\n \"timestamp\"\n]);\nconst MODES = /* @__PURE__ */ new Set([\"static\", \"dynamic\", \"slice\"]);\nconst FORBIDDEN_KEYS = /* @__PURE__ */ new Set([\"__proto__\", \"constructor\", \"prototype\"]);\nconst NUM_TAG = \"$num\";\nconst ESC_TAG = \"$esc\";\nconst MAX_JSON_DEPTH = 256;\nfunction describe(value) {\n if (typeof value === \"string\") {\n return JSON.stringify(value.length > 40 ? `${value.slice(0, 37)}...` : value);\n }\n if (typeof value === \"number\" || typeof value === \"boolean\" || value === null) {\n return String(value);\n }\n return value === void 0 ? \"undefined\" : `a ${typeof value}`;\n}\nconst SKIPPED_COLUMNS_KEY = \"graphty.skippedColumns\";\nfunction badWire(ref, reason, details = {}) {\n return new GraphFormatError(\"E_BAD_SERIALIZATION\", `${ref}: ${reason}`, { ref, reason, ...details });\n}\nfunction asObject(value, path) {\n if (!isPlainObject(value)) {\n throw badWire(path, \"expected an object\");\n }\n return value;\n}\nfunction asArray(value, path) {\n if (!Array.isArray(value)) {\n throw badWire(path, \"expected an array\");\n }\n return value;\n}\nfunction asString(value, path) {\n if (typeof value !== \"string\") {\n throw badWire(path, \"expected a string\");\n }\n return value;\n}\nfunction asStringOrNull(value, path) {\n if (value === void 0 || value === null) {\n return null;\n }\n return asString(value, path);\n}\nfunction asBoolean(value, path) {\n if (typeof value !== \"boolean\") {\n throw badWire(path, \"expected a boolean\");\n }\n return value;\n}\nfunction asBooleanOrNull(value, path) {\n if (value === void 0 || value === null) {\n return null;\n }\n return asBoolean(value, path);\n}\nfunction asCount(value, path) {\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < 0 || value > MAX_COUNT) {\n throw badWire(path, `expected an integer in [0, ${MAX_COUNT}]`, { found: value });\n }\n return value === 0 ? 0 : value;\n}\nfunction asEnum(value, path, allowed) {\n if (value === void 0 || value === null) {\n return null;\n }\n if (typeof value !== \"string\" || !allowed.has(value)) {\n throw badWire(path, `unexpected value ${describe(value)}`, { found: value });\n }\n return value;\n}\nfunction isKnownDtype(value) {\n return typeof value === \"string\" && COLUMN_DTYPES.has(value);\n}\nfunction decodeJsonValue(value, path, depth = 0) {\n if (depth > MAX_JSON_DEPTH) {\n throw badWire(path, `JSON nesting deeper than ${MAX_JSON_DEPTH}`, { reason: \"nesting\" });\n }\n if (Array.isArray(value)) {\n return value.map((item, i) => decodeJsonValue(item, `${path}[${i}]`, depth + 1));\n }\n if (!isPlainObject(value)) {\n return value;\n }\n const keys = Object.keys(value);\n if (keys.length === 1 && keys[0] === NUM_TAG) {\n const tag = value[NUM_TAG];\n switch (tag) {\n case \"NaN\":\n return Number.NaN;\n case \"Infinity\":\n return Infinity;\n case \"-Infinity\":\n return -Infinity;\n case \"-0\":\n return -0;\n default:\n throw badWire(path, `unknown number tag ${describe(tag)}`, { found: tag });\n }\n }\n if (keys.length === 1 && keys[0] === ESC_TAG) {\n const inner = value[ESC_TAG];\n if (!isPlainObject(inner)) {\n throw badWire(path, \"an escaped object must hold a plain object\", { found: typeof inner });\n }\n return decodeJsonObject(inner, path, depth);\n }\n return decodeJsonObject(value, path, depth);\n}\nfunction decodeJsonObject(value, path, depth) {\n const out = {};\n for (const key of Object.keys(value)) {\n if (FORBIDDEN_KEYS.has(key)) {\n throw badWire(path, `forbidden key \"${key}\"`, { key });\n }\n defineJsonKey(out, key, decodeJsonValue(value[key], `${path}.${key}`, depth + 1));\n }\n return out;\n}\nfunction guardReviver(key, value) {\n if (FORBIDDEN_KEYS.has(key)) {\n throw badWire(\"manifest\", `forbidden key \"${key}\"`, { key });\n }\n return value;\n}\nfunction parseGuardedJson(text, path) {\n try {\n return JSON.parse(text, guardReviver);\n } catch (err) {\n if (err instanceof GraphFormatError) {\n throw err;\n }\n throw badWire(path, `not valid JSON (${err instanceof Error ? err.message : String(err)})`);\n }\n}\nfunction resolveFromWireOptions(options, defaultLevel) {\n const level = options?.validate ?? defaultLevel;\n if (level !== \"none\" && level !== \"structure\" && level !== \"full\") {\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown validation level ${String(level)}`, {\n option: \"validate\",\n found: level\n });\n }\n const unknownColumns = options?.unknownColumns ?? \"error\";\n if (unknownColumns !== \"error\" && unknownColumns !== \"skip\") {\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown unknownColumns policy ${String(unknownColumns)}`, {\n option: \"unknownColumns\",\n found: unknownColumns\n });\n }\n const copy = options?.copy ?? false;\n if (typeof copy !== \"boolean\") {\n throw new GraphFormatError(\"E_UNSUPPORTED\", \"copy must be a boolean\", { option: \"copy\", found: copy });\n }\n return { level, copy, unknownColumns };\n}\nfunction bufferRegion(buffer, base, byteLength) {\n return {\n byteLength,\n locate(byteOffset) {\n return { buffer, byteOffset: base + byteOffset };\n },\n read(byteOffset, length) {\n const out = new Uint8Array(new ArrayBuffer(padTo4(length)), 0, length);\n out.set(new Uint8Array(buffer, base + byteOffset, length));\n return out;\n }\n };\n}\nfunction copyBuffer(buffer) {\n const out = new ArrayBuffer(buffer.byteLength);\n new Uint8Array(out).set(new Uint8Array(buffer));\n return out;\n}\nfunction isSharedArrayBuffer(value) {\n return typeof SharedArrayBuffer !== \"undefined\" && value instanceof SharedArrayBuffer;\n}\nfunction wireElementSize(dtype) {\n switch (dtype) {\n case \"u32\":\n case \"i32\":\n case \"f32\":\n return 4;\n case \"f64\":\n return 8;\n case \"u8\":\n case \"utf8\":\n return 1;\n default: {\n const name = dtype;\n throw badWire(\"dtype\", `unknown wire dtype ${name}`, { dtype: name });\n }\n }\n}\nfunction buildArray(dtype, buffer, byteOffset, length) {\n switch (dtype) {\n case \"u32\":\n return new Uint32Array(buffer, byteOffset, length);\n case \"i32\":\n return new Int32Array(buffer, byteOffset, length);\n case \"f32\":\n return new Float32Array(buffer, byteOffset, length);\n case \"f64\":\n return new Float64Array(buffer, byteOffset, length);\n case \"u8\":\n case \"utf8\":\n return new Uint8Array(buffer, byteOffset, length);\n default: {\n const name = dtype;\n throw badWire(\"dtype\", `unknown wire dtype ${name}`, { dtype: name });\n }\n }\n}\nfunction readRef(value, path) {\n const o = asObject(value, path);\n const { dtype } = o;\n if (typeof dtype !== \"string\" || !WIRE_DTYPES.has(dtype)) {\n throw badWire(path, `unknown wire dtype ${describe(dtype)}`, { found: dtype });\n }\n const fields = [\"buffer\", \"byteOffset\", \"byteLength\", \"length\"];\n for (const field of fields) {\n const v = o[field];\n if (typeof v !== \"number\" || !Number.isInteger(v) || v < 0) {\n throw badWire(`${path}.${field}`, \"expected a non-negative integer\", { found: v });\n }\n }\n return {\n buffer: o.buffer,\n byteOffset: o.byteOffset,\n byteLength: o.byteLength,\n dtype,\n length: o.length\n };\n}\nfunction asWireError(err, path) {\n if (err instanceof GraphFormatError && (err.code.startsWith(\"E_COLUMN\") || err.code === \"E_DUPLICATE_ROLE\")) {\n return new GraphFormatError(\"E_BAD_SERIALIZATION\", `${path}: ${err.message}`, {\n ref: path,\n reason: err.message,\n cause: err.code,\n ...err.details\n });\n }\n if (err instanceof Error) {\n return err;\n }\n return badWire(path, String(err));\n}\nclass WireDecoder {\n /**\n * Create a decoder.\n * @param regions - one region per buffer index\n * @param options - the resolved options\n */\n constructor(regions, options) {\n this.ranges = [];\n this.skipped = [];\n this.regions = regions;\n this.options = options;\n }\n /**\n * Whether the level includes the structure checks.\n * @returns true for \"structure\" and \"full\"\n */\n get structure() {\n return this.options.level !== \"none\";\n }\n /**\n * Whether the level is \"full\".\n * @returns true for \"full\"\n */\n get full() {\n return this.options.level === \"full\";\n }\n /**\n * Check a reference against its region (design section 9.5) and build the typed array over the\n * referenced bytes, adopting them when they are contiguous and aligned and copying otherwise.\n * @param value - the manifest member holding the reference\n * @param path - its manifest path\n * @param expected - the wire dtype the slot requires\n * @param kind - who the range belongs to\n * @returns the typed array\n */\n array(value, path, expected, kind) {\n const ref = readRef(value, path);\n if (ref.dtype !== expected) {\n throw badWire(path, `expected dtype ${expected}, found ${ref.dtype}`, {\n expected,\n found: ref.dtype\n });\n }\n const region = this.regions[ref.buffer];\n if (region === void 0) {\n throw badWire(path, `buffer index ${ref.buffer} is out of range (${this.regions.length} buffers)`, {\n found: ref.buffer,\n buffers: this.regions.length\n });\n }\n const elementSize = wireElementSize(ref.dtype);\n if (ref.byteOffset % elementSize !== 0) {\n throw badWire(path, `byteOffset ${ref.byteOffset} is not a multiple of ${elementSize}`, {\n byteOffset: ref.byteOffset,\n elementSize\n });\n }\n if (ref.byteLength !== ref.length * elementSize) {\n throw badWire(path, `byteLength ${ref.byteLength} is not length ${ref.length} * ${elementSize}`, {\n byteLength: ref.byteLength,\n length: ref.length,\n elementSize\n });\n }\n if (ref.byteOffset + ref.byteLength > region.byteLength) {\n throw badWire(path, `range [${ref.byteOffset}, ${ref.byteOffset + ref.byteLength}) exceeds the buffer`, {\n byteOffset: ref.byteOffset,\n byteLength: ref.byteLength,\n bufferByteLength: region.byteLength\n });\n }\n const located = region.locate(ref.byteOffset, ref.byteLength);\n if (located !== null && located.byteOffset % elementSize === 0) {\n this.ranges.push({\n buffer: located.buffer,\n start: located.byteOffset,\n end: located.byteOffset + ref.byteLength,\n kind,\n path\n });\n return buildArray(ref.dtype, located.buffer, located.byteOffset, ref.length);\n }\n const copy = region.read(ref.byteOffset, ref.byteLength);\n return buildArray(ref.dtype, copy.buffer, 0, ref.length);\n }\n /**\n * A u32 array slot.\n * @param value - the manifest member\n * @param path - its path\n * @param kind - the range owner\n * @returns the array\n */\n u32(value, path, kind) {\n return this.array(value, path, \"u32\", kind);\n }\n /**\n * A Utf8 store slot (offsets + utf8), its layout checked at the structure level and its bytes at\n * the full level.\n * @param value - the manifest member (a WireUtf8)\n * @param path - its path\n * @param rows - the row count the store must have, or null to take it from the offsets (a dictionary)\n * @param kind - the range owner\n * @param always - check the layout at every level (stores decoded eagerly)\n * @returns the offsets and bytes\n */\n utf8(value, path, rows, kind, always = false) {\n const o = asObject(value, path);\n const offsets = this.u32(o.offsets, `${path}.offsets`, kind);\n const utf8 = this.array(o.utf8, `${path}.utf8`, \"utf8\", kind);\n if (offsets.length === 0) {\n throw badWire(`${path}.offsets`, \"a Utf8 store needs at least one offset\");\n }\n if (this.structure || always) {\n checkUtf8Layout(offsets, utf8, rows ?? offsets.length - 1, path);\n }\n if (this.full) {\n const bad = Utf8Store.fromEncoded(offsets, utf8).firstMalformedRow();\n if (bad !== -1) {\n throw badWire(path, `malformed UTF-8 in row ${bad}`, { row: bad });\n }\n }\n return { offsets, utf8 };\n }\n /**\n * Enforce the overlap rule of design section 9.5: no byte overlap between a mutable column and\n * any core or immutable segment.\n */\n checkOverlaps() {\n const fixed = this.ranges.filter((r) => (r.kind === \"core\" || r.kind === \"immutable\") && r.end > r.start);\n for (const range of this.ranges) {\n if (range.kind !== \"mutable\" || range.end === range.start) {\n continue;\n }\n for (const other of fixed) {\n if (other.buffer === range.buffer && range.start < other.end && other.start < range.end) {\n throw badWire(range.path, `mutable column overlaps ${other.path}`, { overlaps: other.path });\n }\n }\n }\n }\n // ---------------------------------------------------------------- columns\n /**\n * Decode one column (design section 9.1), or drop it under unknownColumns: \"skip\".\n * @param value - the WireColumn\n * @param domain - the table's domain\n * @param table - the extension table name, or null\n * @param rows - the row count\n * @param path - the manifest path\n * @returns the column, or null when skipped\n */\n column(value, domain, table, rows, path) {\n const w = asObject(value, path);\n const metaRaw = asObject(w.meta, `${path}.meta`);\n const name = asString(metaRaw.name, `${path}.meta.name`);\n const { dtype, itemDtype } = metaRaw;\n const unknown = !isKnownDtype(dtype) || dtype === \"list\" && !isKnownDtype(itemDtype);\n if (unknown) {\n const found = dtype === \"list\" ? itemDtype : dtype;\n if (this.options.unknownColumns === \"skip\") {\n this.skipped.push({ domain, table, name, dtype: String(found) });\n return null;\n }\n throw new GraphFormatError(\"E_UNSUPPORTED\", `column \"${name}\" has unknown dtype ${String(found)}`, {\n dtype: found,\n column: name,\n ref: path\n });\n }\n const meta = this.columnMeta(metaRaw, name, domain, path);\n const kind = meta.mutable ? \"mutable\" : \"immutable\";\n const parts = emptyParts(\n meta,\n rows,\n w.validity === null || w.validity === void 0 ? null : this.u32(w.validity, `${path}.validity`, kind)\n );\n const declaredNullCount = w.nullCount;\n switch (meta.dtype) {\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n parts.data = this.array(w.data, `${path}.data`, meta.dtype, kind);\n break;\n case \"u8\": {\n const data = this.array(w.data, `${path}.data`, \"u8\", kind);\n parts.data = canViewAsPaddedU32(data) ? data : copyToPaddedStore(data);\n break;\n }\n case \"bool\":\n parts.data = this.u32(w.data, `${path}.data`, kind);\n break;\n case \"dict\": {\n parts.data = this.u32(w.data, `${path}.data`, kind);\n const dict = this.utf8(w.dictionary, `${path}.dictionary`, null, kind, true);\n parts.dictionary = decodeUtf8Rows(dict.utf8, dict.offsets, 0, dict.offsets.length - 1);\n break;\n }\n case \"string\": {\n const store = this.utf8(w.strings, `${path}.strings`, rows, kind);\n parts.offsets = store.offsets;\n parts.utf8 = store.utf8;\n break;\n }\n case \"list\": {\n const offsets = this.u32(w.offsets, `${path}.offsets`, kind);\n if (offsets.length !== rows + 1) {\n throw badWire(`${path}.offsets`, `expected ${rows + 1} offsets, found ${offsets.length}`, {\n expected: rows + 1,\n found: offsets.length\n });\n }\n parts.offsets = offsets;\n const child = this.column(w.child, domain, table, offsets[rows], `${path}.child`);\n if (child === null || child.dtype === \"list\") {\n throw badWire(`${path}.child`, \"a list column needs a non-list child column\");\n }\n parts.child = child;\n break;\n }\n case \"json\":\n parts.values = this.jsonRows(w.jsonText, rows, `${path}.jsonText`, kind);\n break;\n default: {\n const dtypeName = meta.dtype;\n throw badWire(`${path}.meta.dtype`, `unknown dtype ${dtypeName}`, { dtype: dtypeName });\n }\n }\n let column;\n try {\n column = createColumn(parts);\n } catch (err) {\n throw asWireError(err, path);\n }\n if (this.structure && column.nullCount !== declaredNullCount) {\n throw badWire(\n `${path}.nullCount`,\n `manifest says ${String(declaredNullCount)}, the bitmap says ${column.nullCount}`,\n {\n expected: column.nullCount,\n found: declaredNullCount\n }\n );\n }\n return column;\n }\n /**\n * Resolve a column's metadata from its manifest form: the tagged JSON fields decoded, then the\n * declaration resolver of the column module applied so every rule of design section 5.5 holds.\n * @param raw - the manifest meta\n * @param name - the column name\n * @param domain - the table's domain\n * @param path - the column's manifest path\n * @returns the resolved metadata\n */\n columnMeta(raw, name, domain, path) {\n const metaPath = `${path}.meta`;\n const optional = (key, check) => {\n const v = raw[key];\n return v === void 0 || v === null ? void 0 : check(v, `${metaPath}.${key}`);\n };\n const numberOf = (v, p) => {\n if (typeof v !== \"number\") {\n throw badWire(p, \"expected a number\", { found: v });\n }\n return v;\n };\n const decl = {\n name,\n dtype: raw.dtype,\n components: optional(\"components\", numberOf),\n itemDtype: optional(\"itemDtype\", (v) => v),\n itemComponents: optional(\"itemComponents\", numberOf),\n nullable: optional(\"nullable\", asBoolean),\n mutable: optional(\"mutable\", asBoolean),\n role: optional(\"role\", asString),\n refersTo: optional(\"refersTo\", (v) => v),\n unique: optional(\"unique\", asBoolean),\n default: decodeJsonValue(raw.default, `${metaPath}.default`),\n fill: decodeJsonValue(raw.fill, `${metaPath}.fill`),\n options: optional(\"options\", (v, p) => decodeJsonValue(v, p)),\n origin: optional(\"origin\", (v) => v),\n dynamic: optional(\"dynamic\", asBoolean),\n extra: optional(\"extra\", (v, p) => decodeJsonValue(v, p))\n };\n try {\n return resolveColumnMeta(name, domain, decl);\n } catch (err) {\n throw asWireError(err, path);\n }\n }\n /**\n * The values of a json column from its JSON text store: empty text is an unset row (undefined),\n * every other row is parsed with the guarding reviver and untagged.\n * @param value - the WireUtf8\n * @param rows - the row count\n * @param path - the manifest path\n * @param kind - the range owner\n * @returns one value per row\n */\n jsonRows(value, rows, path, kind) {\n const store = this.utf8(value, path, rows, kind, true);\n const texts = decodeUtf8Rows(store.utf8, store.offsets, 0, rows);\n const values = new Array(rows);\n for (let row = 0; row < rows; row++) {\n const text = texts[row];\n values[row] = text === \"\" ? void 0 : decodeJsonValue(parseGuardedJson(text, `${path}[${row}]`), `${path}[${row}]`);\n }\n return values;\n }\n /**\n * Decode a table's columns in declaration order.\n * @param value - the WireColumn array\n * @param domain - the domain\n * @param table - the extension table name, or null\n * @param rows - the row count\n * @param path - the manifest path\n * @returns the table\n */\n table(value, domain, table, rows, path) {\n const list = asArray(value, path);\n const columns = [];\n const names = /* @__PURE__ */ new Set();\n for (let i = 0; i < list.length; i++) {\n const column = this.column(list[i], domain, table, rows, `${path}[${i}]`);\n if (column === null) {\n continue;\n }\n if (names.has(column.meta.name)) {\n throw badWire(`${path}[${i}].meta.name`, `column \"${column.meta.name}\" is declared twice`, {\n column: column.meta.name\n });\n }\n names.add(column.meta.name);\n columns.push(column);\n }\n try {\n return new AttributeTable({ domain, rowCount: rows, columns });\n } catch (err) {\n throw asWireError(err, path);\n }\n }\n // ---------------------------------------------------------------- id map\n /**\n * Decode the id map (design section 4.5). An unknown kind is E_UNSUPPORTED with details.kind.\n * @param value - the WireIdMap\n * @returns the map\n */\n ids(value) {\n const o = asObject(value, \"ids\");\n const kindRaw = o.kind;\n if (typeof kindRaw !== \"string\" || !ID_MAP_KINDS.has(kindRaw)) {\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown id map kind ${describe(kindRaw)}`, {\n kind: kindRaw,\n ref: \"ids.kind\"\n });\n }\n const kind = kindRaw;\n const size = asCount(o.size, \"ids.size\");\n const offsetRaw = o.offset ?? 0;\n if (typeof offsetRaw !== \"number\") {\n throw badWire(\"ids.offset\", \"expected a number\", { found: offsetRaw });\n }\n const parts = {\n kind,\n size,\n offset: kind === \"identity\" ? offsetRaw : 0,\n values: null,\n tags: null,\n numbers: null,\n offsets: null,\n utf8: null\n };\n const typed = parts;\n switch (kind) {\n case \"identity\":\n break;\n case \"dense\":\n typed.values = this.u32(o.values, \"ids.values\", \"immutable\");\n break;\n case \"numeric\":\n typed.values = this.array(o.values, \"ids.values\", \"f64\", \"immutable\");\n break;\n case \"string\": {\n typed.offsets = this.u32(o.offsets, \"ids.offsets\", \"immutable\");\n typed.utf8 = this.array(o.utf8, \"ids.utf8\", \"utf8\", \"immutable\");\n break;\n }\n case \"mixed\": {\n typed.tags = this.array(o.tags, \"ids.tags\", \"u8\", \"immutable\");\n typed.numbers = this.array(o.numbers, \"ids.numbers\", \"f64\", \"immutable\");\n typed.offsets = this.u32(o.offsets, \"ids.offsets\", \"immutable\");\n typed.utf8 = this.array(o.utf8, \"ids.utf8\", \"utf8\", \"immutable\");\n break;\n }\n default: {\n const name = kind;\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown id map kind ${name}`, { kind: name });\n }\n }\n return nodeIdMapFromTyped(typed, this.options.level);\n }\n // ---------------------------------------------------------------- views\n /**\n * Resolve the member arrays of the carried views (design section 9.1): every reference is\n * checked like any other, and the arrays are installed on the snapshot by `installViews()`.\n * @param value - the manifest views member\n * @returns the member arrays per view name (unknown names included; they are ignored later)\n */\n views(value) {\n const out = /* @__PURE__ */ new Map();\n if (value === null || value === void 0) {\n return out;\n }\n const views = asObject(value, \"views\");\n for (const name of Object.keys(views)) {\n const members = asObject(views[name], `views.${name}`);\n const arrays = /* @__PURE__ */ new Map();\n for (const member of Object.keys(members)) {\n const path = `views.${name}.${member}`;\n const ref = readRef(members[member], path);\n arrays.set(member, this.array(ref, path, ref.dtype, \"view\"));\n }\n out.set(name, arrays);\n }\n return out;\n }\n}\nfunction viewMember(members, view, member, ctor, length, required) {\n const path = `views.${view}.${member}`;\n const array = members.get(member);\n if (array === void 0) {\n if (required) {\n throw badWire(path, \"the carried view is missing this member\");\n }\n return null;\n }\n if (!(array instanceof ctor)) {\n throw badWire(path, `expected ${ctor.name}, found ${array.constructor.name}`, {\n expected: ctor.name,\n found: array.constructor.name\n });\n }\n if (array.length !== length) {\n throw badWire(path, `expected ${length} entries, found ${array.length}`, {\n expected: length,\n found: array.length\n });\n }\n return array;\n}\nfunction dataMember(members, view, ctor, length) {\n return viewMember(members, view, \"data\", ctor, length, true);\n}\nfunction installViews(snapshot, carried, verify) {\n const { directed, nodeCount, edgeCount, arcCount, selfLoopCount } = snapshot;\n let facts = null;\n const factsOf = () => {\n facts ??= new CoreFacts(snapshot);\n return facts;\n };\n const seedF64 = (name) => {\n const data = dataMember(\n carried.get(name),\n name,\n Float64Array,\n nodeCount\n );\n if (verify) {\n checkF64View(name, data, snapshot[name]());\n return;\n }\n seedView(snapshot, name, data);\n };\n for (const [name, members] of carried) {\n switch (name) {\n case \"reverse\": {\n if (!directed) {\n break;\n }\n const rowPtr = viewMember(members, name, \"rowPtr\", Uint32Array, nodeCount + 1, true);\n const colIdx = viewMember(members, name, \"colIdx\", Uint32Array, arcCount, true);\n const fwdArc = viewMember(members, name, \"fwdArc\", Uint32Array, arcCount, true);\n const weights = viewMember(members, name, \"weights\", Float32Array, arcCount, snapshot.weights !== null);\n if (weights !== null && snapshot.weights === null) {\n throw badWire(`views.${name}.weights`, \"weights carried for an unweighted snapshot\");\n }\n const reverse = new ReverseAdjacency(snapshot, rowPtr, colIdx, weights, fwdArc);\n if (verify) {\n checkReverse(snapshot, factsOf(), reverse);\n }\n seedView(snapshot, \"reverse\", reverse);\n break;\n }\n case \"coo\": {\n const src = viewMember(members, name, \"src\", Uint32Array, arcCount, true);\n if (verify) {\n checkCooSrc(factsOf(), src);\n }\n seedView(snapshot, \"coo\", cooViewOf(snapshot, src));\n break;\n }\n case \"edgeList\": {\n const identity = snapshot.flags.arcToEdgeIsIdentity;\n const src = viewMember(members, name, \"src\", Uint32Array, edgeCount, true);\n const dst = viewMember(members, name, \"dst\", Uint32Array, edgeCount, !identity);\n const weights = viewMember(\n members,\n name,\n \"weights\",\n Float32Array,\n edgeCount,\n snapshot.weights !== null && !identity\n );\n if (weights !== null && snapshot.weights === null) {\n throw badWire(`views.${name}.weights`, \"weights carried for an unweighted snapshot\");\n }\n if (verify) {\n checkEdgeList(snapshot, factsOf(), src, dst, weights);\n }\n seedView(\n snapshot,\n \"edgeList\",\n edgeListViewOf(snapshot, src, dst ?? snapshot.colIdx, weights ?? snapshot.weights)\n );\n break;\n }\n case \"outDegree\": {\n const data = dataMember(members, name, Uint32Array, nodeCount);\n if (verify) {\n checkOutDegree(snapshot, data);\n }\n seedView(snapshot, name, data);\n break;\n }\n case \"degree\": {\n const data = dataMember(members, name, Uint32Array, nodeCount);\n if (verify) {\n checkDegree(snapshot, factsOf(), data);\n }\n seedView(snapshot, name, data);\n break;\n }\n case \"selfLoopsPerNode\": {\n const data = dataMember(members, name, Uint32Array, nodeCount);\n if (verify) {\n checkSelfLoopsPerNode(factsOf(), data);\n }\n seedView(snapshot, name, data);\n break;\n }\n case \"inDegree\":\n if (directed) {\n const data = dataMember(members, name, Uint32Array, nodeCount);\n if (verify) {\n checkInDegree(factsOf(), data);\n }\n seedView(snapshot, name, data);\n }\n break;\n case \"weightedOutDegree\":\n case \"weightedDegree\":\n case \"selfLoopWeight\":\n seedF64(name);\n break;\n case \"weightedInDegree\":\n if (directed) {\n seedF64(name);\n }\n break;\n case \"selfLoopArcs\": {\n const data = dataMember(members, name, Uint32Array, selfLoopCount);\n if (verify) {\n checkSelfLoopArcs(snapshot, factsOf(), data);\n }\n seedView(snapshot, name, data);\n break;\n }\n case \"mate\":\n if (!directed) {\n const data = dataMember(members, name, Uint32Array, arcCount);\n if (verify) {\n checkMate(snapshot, factsOf(), data);\n }\n seedView(snapshot, name, data);\n }\n break;\n case \"degreeOrder\":\n case \"reverseDegreeOrder\": {\n if (name === \"reverseDegreeOrder\" && !directed) {\n break;\n }\n const perm = viewMember(members, name, \"perm\", Uint32Array, nodeCount, true);\n const segmentOffsets = viewMember(members, name, \"segmentOffsets\", Uint32Array, 5, true);\n if (verify) {\n const degree = name === \"degreeOrder\" ? rowLengths(snapshot.rowPtr, nodeCount) : factsOf().inDegree;\n checkDegreeOrder(name, degree, perm, segmentOffsets);\n }\n seedView(snapshot, name, Object.freeze({ perm, segmentOffsets }));\n break;\n }\n }\n }\n}\nfunction readCoreRefs(value) {\n const core = asObject(value, \"core\");\n const optionalRef = (name) => {\n const v = core[name];\n return v === null || v === void 0 ? null : readRef(v, `core.${name}`);\n };\n return {\n rowPtr: readRef(core.rowPtr, \"core.rowPtr\"),\n colIdx: optionalRef(\"colIdx\"),\n weights: optionalRef(\"weights\"),\n arcToEdge: optionalRef(\"arcToEdge\"),\n edgeToArc: optionalRef(\"edgeToArc\")\n };\n}\nfunction decodeCore(decoder2, refs, counts, flags) {\n const rowPtr = decoder2.u32(refs.rowPtr, \"core.rowPtr\", \"core\");\n let colIdx;\n if (refs.colIdx === null) {\n if (counts.arcs !== 0) {\n throw badWire(\"core.colIdx\", `null although counts.arcs is ${counts.arcs}`);\n }\n colIdx = new Uint32Array(0);\n } else {\n colIdx = decoder2.u32(refs.colIdx, \"core.colIdx\", \"core\");\n }\n let weights = null;\n if (refs.weights !== null) {\n if (!flags.weighted) {\n throw badWire(\"core.weights\", \"present although flags.weighted is false\");\n }\n weights = decoder2.array(refs.weights, \"core.weights\", \"f32\", \"core\");\n } else if (flags.weighted) {\n if (counts.arcs !== 0) {\n throw badWire(\"core.weights\", `null although flags.weighted is true and counts.arcs is ${counts.arcs}`);\n }\n weights = new Float32Array(0);\n }\n const identity = flags.arcToEdgeIsIdentity;\n const permutation = (ref, name, count) => {\n if (ref !== null) {\n if (identity) {\n throw badWire(`core.${name}`, \"present although flags.arcToEdgeIsIdentity is true\");\n }\n return decoder2.u32(ref, `core.${name}`, \"core\");\n }\n if (identity) {\n return null;\n }\n if (count !== 0) {\n throw badWire(\n `core.${name}`,\n `null although the permutation is not the identity and the count is ${count}`\n );\n }\n return new Uint32Array(0);\n };\n return {\n rowPtr,\n colIdx,\n weights,\n arcToEdge: permutation(refs.arcToEdge, \"arcToEdge\", counts.arcs),\n edgeToArc: permutation(refs.edgeToArc, \"edgeToArc\", counts.edges)\n };\n}\nfunction decodeArena(value, regions, refs, arrays, structure) {\n if (value === null || value === void 0) {\n return null;\n }\n const a = asObject(value, \"arena\");\n const buffer = asCount(a.buffer, \"arena.buffer\");\n const byteOffset = asCount(a.byteOffset, \"arena.byteOffset\");\n const byteLength = asCount(a.byteLength, \"arena.byteLength\");\n const region = regions[buffer];\n if (region === void 0) {\n throw badWire(\"arena.buffer\", `buffer index ${buffer} is out of range`, { found: buffer });\n }\n if (byteOffset + byteLength > region.byteLength) {\n throw badWire(\"arena\", `range [${byteOffset}, ${byteOffset + byteLength}) exceeds the buffer`, {\n byteOffset,\n byteLength,\n bufferByteLength: region.byteLength\n });\n }\n const located = region.locate(byteOffset, byteLength);\n if (located === null) {\n return null;\n }\n const segments = {\n rowPtr: null,\n colIdx: null,\n weights: null,\n arcToEdge: null,\n edgeToArc: null\n };\n let hotByteLength = 0;\n const names = CORE_ORDER;\n for (const name of names) {\n const ref = refs[name];\n const array = arrays[name];\n if (ref === null || array === null || array.length === 0) {\n continue;\n }\n const inside = ref.buffer === buffer && ref.byteOffset >= byteOffset && ref.byteOffset + ref.byteLength <= byteOffset + byteLength;\n if (!inside) {\n continue;\n }\n const relative = ref.byteOffset - byteOffset;\n if (relative % ALIGNMENT !== 0) {\n throw badWire(`core.${name}`, `inside the arena at offset ${relative}, not a multiple of ${ALIGNMENT}`, {\n byteOffset: relative\n });\n }\n if (array.buffer !== located.buffer || array.byteOffset !== located.byteOffset + relative) {\n throw badWire(`core.${name}`, \"the arena describes a segment the array is not a view of\");\n }\n segments[name] = Object.freeze({ byteOffset: located.byteOffset + relative, byteLength: ref.byteLength });\n if (name === \"rowPtr\" || name === \"colIdx\" || name === \"weights\") {\n hotByteLength = relative + ref.byteLength;\n }\n }\n if (structure && a.hotByteLength !== hotByteLength) {\n throw badWire(\n \"arena.hotByteLength\",\n `manifest says ${String(a.hotByteLength)}, the segments say ${hotByteLength}`,\n {\n expected: hotByteLength,\n found: a.hotByteLength\n }\n );\n }\n return Object.freeze({\n buffer: located.buffer,\n byteOffset: located.byteOffset,\n byteLength,\n alignment: ALIGNMENT,\n segments: Object.freeze(segments),\n hotByteLength\n });\n}\nfunction readFlags(value) {\n const o = asObject(value, \"flags\");\n const flag = (name) => asBoolean(o[name], `flags.${name}`);\n return {\n multigraph: flag(\"multigraph\"),\n hasSelfLoops: flag(\"hasSelfLoops\"),\n arcToEdgeIsIdentity: flag(\"arcToEdgeIsIdentity\"),\n weighted: flag(\"weighted\"),\n allWeightsOne: flag(\"allWeightsOne\"),\n nonNegativeWeights: flag(\"nonNegativeWeights\"),\n finiteWeights: flag(\"finiteWeights\")\n };\n}\nfunction readOrigin(value, path) {\n if (value === null || value === void 0) {\n return null;\n }\n const o = asObject(value, path);\n const field = (key) => asStringOrNull(o[key], `${path}.${key}`);\n return {\n format: field(\"format\"),\n id: field(\"id\"),\n title: field(\"title\"),\n type: field(\"type\"),\n namespace: field(\"namespace\")\n };\n}\nfunction readGraphMeta(value) {\n const o = asObject(value, \"meta\");\n const keywordsRaw = o.keywords ?? [];\n const keywords = asArray(keywordsRaw, \"meta.keywords\").map((k, i) => asString(k, `meta.keywords[${i}]`));\n const extraRaw = decodeJsonValue(o.extra ?? {}, \"meta.extra\");\n if (!isPlainObject(extraRaw)) {\n throw badWire(\"meta.extra\", \"expected an object\");\n }\n return Object.freeze({\n name: asStringOrNull(o.name, \"meta.name\"),\n description: asStringOrNull(o.description, \"meta.description\"),\n creator: asStringOrNull(o.creator, \"meta.creator\"),\n created: asStringOrNull(o.created, \"meta.created\"),\n modified: asStringOrNull(o.modified, \"meta.modified\"),\n keywords: Object.freeze(keywords),\n sourceFormat: asStringOrNull(o.sourceFormat, \"meta.sourceFormat\"),\n sourceVersion: asStringOrNull(o.sourceVersion, \"meta.sourceVersion\"),\n idType: asEnum(o.idType, \"meta.idType\", ID_TYPES),\n timeFormat: asEnum(o.timeFormat, \"meta.timeFormat\", TIME_FORMATS),\n timeRepresentation: asEnum(o.timeRepresentation, \"meta.timeRepresentation\", TIME_REPRESENTATIONS),\n mode: asEnum(o.mode, \"meta.mode\", MODES),\n declaredMultigraph: asBooleanOrNull(o.declaredMultigraph, \"meta.declaredMultigraph\"),\n weightOrigin: readOrigin(o.weightOrigin, \"meta.weightOrigin\"),\n extra: Object.freeze(extraRaw)\n });\n}\nfunction checkManifestVersions(manifest) {\n if (manifest.format !== WIRE_FORMAT) {\n throw badWire(\"format\", `expected \"${WIRE_FORMAT}\", found ${describe(manifest.format)}`, {\n found: manifest.format\n });\n }\n const wire = asArray(manifest.wire, \"wire\");\n const major = wire[0];\n const minor = wire[1];\n if (typeof major !== \"number\" || typeof minor !== \"number\" || !Number.isInteger(major) || !Number.isInteger(minor)) {\n throw badWire(\"wire\", \"expected [major, minor] integers\", { found: manifest.wire });\n }\n if (major !== WIRE_MAJOR) {\n throw new GraphFormatError(\n \"E_UNSUPPORTED_VERSION\",\n `wire major ${major} is not supported (reader: ${WIRE_MAJOR})`,\n {\n kind: \"wire\",\n found: major,\n supported: WIRE_MAJOR\n }\n );\n }\n if (manifest.formatVersion !== FORMAT_VERSION) {\n throw new GraphFormatError(\n \"E_UNSUPPORTED_VERSION\",\n `formatVersion ${describe(manifest.formatVersion)} is not supported (reader: ${FORMAT_VERSION})`,\n { kind: \"format\", found: manifest.formatVersion, supported: FORMAT_VERSION }\n );\n }\n return [major, minor];\n}\nfunction decodeManifest(manifestRaw, regions, options, honourArena) {\n const manifest = asObject(manifestRaw, \"manifest\");\n checkManifestVersions(manifest);\n const decoder2 = new WireDecoder(regions, options);\n const directed = asBoolean(manifest.directed, \"directed\");\n const countsRaw = asObject(manifest.counts, \"counts\");\n const counts = {\n nodes: asCount(countsRaw.nodes, \"counts.nodes\"),\n edges: asCount(countsRaw.edges, \"counts.edges\"),\n arcs: asCount(countsRaw.arcs, \"counts.arcs\"),\n selfLoops: asCount(countsRaw.selfLoops, \"counts.selfLoops\")\n };\n const flags = readFlags(manifest.flags);\n if (flags.arcToEdgeIsIdentity && (!directed || counts.arcs !== counts.edges)) {\n throw badWire(\"flags.arcToEdgeIsIdentity\", \"set on an undirected graph or with arcs !== edges\");\n }\n const coreRefs = readCoreRefs(manifest.core);\n const core = decodeCore(decoder2, coreRefs, counts, flags);\n const arena = honourArena ? decodeArena(manifest.arena, regions, coreRefs, core, decoder2.structure) : null;\n const ids = decoder2.ids(manifest.ids);\n const nodes = decoder2.table(manifest.nodeColumns ?? [], \"node\", null, counts.nodes, \"nodeColumns\");\n const edges = decoder2.table(manifest.edgeColumns ?? [], \"edge\", null, counts.edges, \"edgeColumns\");\n const graph = decoder2.table(manifest.graphColumns ?? [], \"graph\", null, 1, \"graphColumns\");\n const extensions = /* @__PURE__ */ new Map();\n const extensionsRaw = asArray(manifest.extensions ?? [], \"extensions\");\n for (let i = 0; i < extensionsRaw.length; i++) {\n const path = `extensions[${i}]`;\n const ext = asObject(extensionsRaw[i], path);\n const name = asString(ext.name, `${path}.name`);\n if (extensions.has(name)) {\n throw badWire(`${path}.name`, `extension table \"${name}\" appears twice`, { table: name });\n }\n const rowCount = asCount(ext.rowCount, `${path}.rowCount`);\n extensions.set(name, decoder2.table(ext.columns, \"extension\", name, rowCount, `${path}.columns`));\n }\n let meta = readGraphMeta(manifest.meta ?? {});\n if (decoder2.skipped.length > 0) {\n const skipped = Object.freeze(decoder2.skipped.map((s) => Object.freeze({ ...s })));\n meta = Object.freeze({ ...meta, extra: Object.freeze({ ...meta.extra, [SKIPPED_COLUMNS_KEY]: skipped }) });\n }\n const carried = decoder2.views(manifest.views);\n if (decoder2.structure) {\n decoder2.checkOverlaps();\n }\n const parts = {\n label: asStringOrNull(manifest.label, \"label\"),\n serial: null,\n directed,\n nodeCount: counts.nodes,\n edgeCount: counts.edges,\n arcCount: counts.arcs,\n selfLoopCount: counts.selfLoops,\n rowPtr: core.rowPtr,\n colIdx: core.colIdx,\n weights: core.weights,\n arcToEdge: core.arcToEdge,\n edgeToArc: core.edgeToArc,\n flags,\n ids,\n nodes,\n edges,\n graph,\n extensions,\n meta,\n arena,\n checksum: false\n };\n const snapshot = createSnapshot(parts);\n if (options.level === \"full\") {\n snapshot.validate({ level: \"full\" });\n } else if (options.level === \"structure\") {\n snapshot.validate({ level: \"structure\" });\n }\n if (options.level !== \"full\") {\n installViews(snapshot, carried, options.level === \"structure\");\n }\n return snapshot;\n}\nfunction fromWire(wire, options) {\n const resolved = resolveFromWireOptions(options, \"structure\");\n const w = asObject(wire, \"wire\");\n const buffersRaw = asArray(w.buffers, \"wire.buffers\");\n const regions = [];\n for (let i = 0; i < buffersRaw.length; i++) {\n const b = buffersRaw[i];\n let buffer;\n if (b instanceof ArrayBuffer) {\n buffer = resolved.copy ? copyBuffer(b) : b;\n } else if (isSharedArrayBuffer(b)) {\n buffer = copyBuffer(b);\n } else {\n throw badWire(`wire.buffers[${i}]`, \"expected an ArrayBuffer\");\n }\n regions.push(bufferRegion(buffer, 0, buffer.byteLength));\n }\n return decodeManifest(w.manifest, regions, resolved, true);\n}\nconst CONTAINER_HEADER_BYTES = 16;\nconst fatalDecoder = new TextDecoder(\"utf-8\", { fatal: true });\nfunction planContainer(snapshot, options) {\n const layout = new WireLayout(\"container\");\n const { manifest } = collectWire(snapshot, layout, options.includeViews, true);\n const manifestBytes = encodeManifest(manifest);\n return {\n manifestBytes,\n regionStart: alignUp(CONTAINER_HEADER_BYTES + manifestBytes.byteLength, ALIGNMENT),\n segments: layout.segments,\n regionLength: layout.regionLength\n };\n}\nfunction writeHeader(out, manifestLength) {\n out.set(CONTAINER_MAGIC, 0);\n const view = new DataView(out.buffer, out.byteOffset, out.byteLength);\n view.setUint16(4, WIRE_MAJOR, true);\n view.setUint16(6, WIRE_MINOR, true);\n new Uint32Array(out.buffer, out.byteOffset + 8, 1)[0] = ENDIAN_PROBE;\n view.setUint32(12, manifestLength, true);\n}\nfunction bytesOf(view) {\n return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n}\nfunction toBytes(snapshot, options = {}) {\n const plan = planContainer(snapshot, options);\n const out = new Uint8Array(plan.regionStart + plan.regionLength);\n writeHeader(out, plan.manifestBytes.byteLength);\n out.set(plan.manifestBytes, CONTAINER_HEADER_BYTES);\n for (const segment of plan.segments) {\n out.set(bytesOf(segment.view), plan.regionStart + segment.ref.byteOffset);\n }\n return out;\n}\nfunction* chunksOf(plan) {\n const head = new Uint8Array(plan.regionStart);\n writeHeader(head, plan.manifestBytes.byteLength);\n head.set(plan.manifestBytes, CONTAINER_HEADER_BYTES);\n yield head;\n for (const segment of plan.segments) {\n if (segment.ref.byteLength === 0) {\n continue;\n }\n const chunk = new Uint8Array(alignUp(segment.ref.byteLength, ALIGNMENT));\n chunk.set(bytesOf(segment.view));\n yield chunk;\n }\n}\nfunction toByteChunks(snapshot, options = {}) {\n return chunksOf(planContainer(snapshot, options));\n}\nfunction readHeader(head, totalLength) {\n if (totalLength < CONTAINER_HEADER_BYTES) {\n throw badWire(\"header\", `truncated: ${totalLength} bytes, expected at least ${CONTAINER_HEADER_BYTES}`, {\n byteLength: totalLength\n });\n }\n for (let i = 0; i < CONTAINER_MAGIC.length; i++) {\n if (head[i] !== CONTAINER_MAGIC[i]) {\n throw badWire(\"magic\", \"not a GSNP container\", { found: Array.from(head.subarray(0, 4)) });\n }\n }\n const view = new DataView(head.buffer, head.byteOffset, head.byteLength);\n const major = view.getUint16(4, true);\n const minor = view.getUint16(6, true);\n if (major !== WIRE_MAJOR) {\n throw new GraphFormatError(\n \"E_UNSUPPORTED_VERSION\",\n `wire major ${major} is not supported (reader: ${WIRE_MAJOR})`,\n {\n kind: \"wire\",\n found: major,\n supported: WIRE_MAJOR\n }\n );\n }\n const probe = view.getUint32(8, IS_LITTLE_ENDIAN);\n if (probe !== ENDIAN_PROBE) {\n throw badWire(\n \"endianness\",\n `probe reads 0x${probe.toString(16)}; the container was written on another endianness`,\n {\n found: probe,\n expected: ENDIAN_PROBE\n }\n );\n }\n const manifestLength = view.getUint32(12, true);\n if (CONTAINER_HEADER_BYTES + manifestLength > totalLength) {\n throw badWire(\n \"manifest\",\n `truncated: ${manifestLength} manifest bytes declared, ${totalLength} bytes in total`,\n {\n manifestLength,\n byteLength: totalLength\n }\n );\n }\n return { major, minor, manifestLength };\n}\nfunction readManifest(bytes, header) {\n let text;\n try {\n text = fatalDecoder.decode(bytes);\n } catch {\n throw badWire(\"manifest\", \"not valid UTF-8\");\n }\n const manifest = parseGuardedJson(text, \"manifest\");\n if (typeof manifest !== \"object\" || manifest === null || Array.isArray(manifest)) {\n throw badWire(\"manifest\", \"expected an object\");\n }\n const record = manifest;\n const [major, minor] = checkManifestVersions(record);\n if (major !== header.major || minor !== header.minor) {\n throw badWire(\n \"wire\",\n `manifest says [${major}, ${minor}], the header says [${header.major}, ${header.minor}]`,\n {\n found: [major, minor],\n header: [header.major, header.minor]\n }\n );\n }\n return record;\n}\nfunction fromBytes(bytes, options) {\n const resolved = resolveFromWireOptions(options, \"full\");\n const view = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n const header = readHeader(view, view.byteLength);\n const manifest = readManifest(\n view.subarray(CONTAINER_HEADER_BYTES, CONTAINER_HEADER_BYTES + header.manifestLength),\n header\n );\n const regionStart = alignUp(CONTAINER_HEADER_BYTES + header.manifestLength, ALIGNMENT);\n const regionLength = Math.max(0, view.byteLength - regionStart);\n const { buffer } = view;\n let region;\n if (!resolved.copy && !isSharedArrayBuffer(buffer) && view.byteOffset % 8 === 0) {\n region = bufferRegion(buffer, view.byteOffset + regionStart, regionLength);\n } else {\n const copy = new Uint8Array(alignUp(regionLength, ALIGNMENT));\n if (regionLength > 0) {\n copy.set(view.subarray(regionStart));\n }\n region = bufferRegion(copy.buffer, 0, regionLength);\n }\n return decodeManifest(manifest, [region], resolved, true);\n}\nclass ChunkedBytes {\n /**\n * Wrap the chunks.\n * @param chunks - the chunks in order\n */\n constructor(chunks) {\n this.chunks = chunks;\n this.starts = [];\n let total = 0;\n for (const chunk of chunks) {\n this.starts.push(total);\n total += chunk.byteLength;\n }\n this.byteLength = total;\n }\n /**\n * The chunk index holding an absolute offset (the last chunk starting at or before it).\n * @param offset - the absolute offset\n * @returns the index, or -1 when there is no chunk\n */\n chunkAt(offset) {\n let lo = 0;\n let hi = this.starts.length - 1;\n let found = -1;\n while (lo <= hi) {\n const mid = lo + hi >>> 1;\n if (this.starts[mid] <= offset) {\n found = mid;\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return found;\n }\n /**\n * Find a range inside one chunk over a plain ArrayBuffer.\n * @param offset - the absolute start\n * @param length - the byte length\n * @returns the buffer and absolute offset, or null when the range spans chunks or a SharedArrayBuffer\n */\n locate(offset, length) {\n const i = this.chunkAt(offset);\n if (i < 0) {\n return null;\n }\n const chunk = this.chunks[i];\n const start = this.starts[i];\n if (offset + length > start + chunk.byteLength || isSharedArrayBuffer(chunk.buffer)) {\n return null;\n }\n return { buffer: chunk.buffer, byteOffset: chunk.byteOffset + (offset - start) };\n }\n /**\n * Copy a range out of the stream.\n * @param offset - the absolute start\n * @param length - the byte length\n * @returns a fresh Uint8Array of `length` bytes at offset 0 of a padded buffer\n */\n read(offset, length) {\n if (offset + length > this.byteLength) {\n throw badWire(\"chunks\", `range [${offset}, ${offset + length}) exceeds the ${this.byteLength} bytes given`);\n }\n const out = new Uint8Array(new ArrayBuffer(padTo4(length)), 0, length);\n let written = 0;\n let i = this.chunkAt(offset);\n while (written < length && i < this.chunks.length) {\n const chunk = this.chunks[i];\n const start = this.starts[i];\n const from = offset + written - start;\n const take = Math.min(length - written, chunk.byteLength - from);\n out.set(chunk.subarray(from, from + take), written);\n written += take;\n i++;\n }\n return out;\n }\n /**\n * A view when the range lies inside one chunk, a copy otherwise.\n * @param offset - the absolute start\n * @param length - the byte length\n * @returns the bytes\n */\n span(offset, length) {\n const i = this.chunkAt(offset);\n if (i >= 0) {\n const chunk = this.chunks[i];\n const start = this.starts[i];\n if (offset + length <= start + chunk.byteLength) {\n return chunk.subarray(offset - start, offset - start + length);\n }\n }\n return this.read(offset, length);\n }\n /**\n * The stream from `base` onward as a decoder region.\n * @param base - the absolute offset of the region's start\n * @returns the region\n */\n region(base) {\n return {\n byteLength: Math.max(0, this.byteLength - base),\n locate: (byteOffset, byteLength) => this.locate(base + byteOffset, byteLength),\n read: (byteOffset, byteLength) => this.read(base + byteOffset, byteLength)\n };\n }\n}\nfunction fromByteChunks(chunks, options) {\n const resolved = resolveFromWireOptions(options, \"full\");\n const list = [];\n for (const chunk of chunks) {\n if (!(chunk instanceof Uint8Array)) {\n throw badWire(`chunks[${list.length}]`, \"expected a Uint8Array\");\n }\n list.push(resolved.copy ? chunk.slice() : chunk);\n }\n const bytes = new ChunkedBytes(list);\n const header = readHeader(bytes.span(0, Math.min(CONTAINER_HEADER_BYTES, bytes.byteLength)), bytes.byteLength);\n const manifest = readManifest(bytes.span(CONTAINER_HEADER_BYTES, header.manifestLength), header);\n const regionStart = alignUp(CONTAINER_HEADER_BYTES + header.manifestLength, ALIGNMENT);\n return decodeManifest(manifest, [bytes.region(regionStart)], resolved, false);\n}\nfunction isSortedEdgeList(src, dst, edgeCount) {\n for (let e = 1; e < edgeCount; e++) {\n const u = src[e];\n const prev = src[e - 1];\n if (u < prev || u === prev && dst[e] < dst[e - 1]) {\n return false;\n }\n }\n return true;\n}\nfunction nanWeight(e, w) {\n return new GraphFormatError(\"E_INVALID_WEIGHT\", `edge ${e} has a NaN weight`, { edge: e, weight: w });\n}\nfunction scanStoredWeights(edgeWeights, edgeCount, bounds) {\n let min = Infinity;\n let max = -Infinity;\n for (let e = 0; e < edgeCount; e++) {\n const w = Math.fround(edgeWeights[e]);\n if (w !== w) {\n throw nanWeight(e, edgeWeights[e]);\n }\n if (w < min) {\n min = w;\n bounds[0] = w;\n }\n if (w > max) {\n max = w;\n bounds[1] = w;\n }\n }\n}\nfunction countDirectedArcs(src, dst, edgeCount, targetCount, rowCount) {\n let loops = 0;\n for (let e = 0; e < edgeCount; e++) {\n const u = src[e];\n const v = dst[e];\n targetCount[v + 1]++;\n rowCount[u + 1]++;\n if (u === v) {\n loops++;\n }\n }\n return loops;\n}\nfunction countUndirectedArcs(src, dst, edgeCount, targetCount, rowCount) {\n let loops = 0;\n for (let e = 0; e < edgeCount; e++) {\n const u = src[e];\n const v = dst[e];\n targetCount[v + 1]++;\n rowCount[u + 1]++;\n if (u === v) {\n loops++;\n } else {\n targetCount[u + 1]++;\n rowCount[v + 1]++;\n }\n }\n return loops;\n}\nfunction prefixSum(counts, nodeCount) {\n for (let v = 0; v < nodeCount; v++) {\n counts[v + 1] += counts[v];\n }\n}\nfunction copySortedTargets(src, dst, edgeCount, colIdx) {\n let multigraph = false;\n for (let e = 0; e < edgeCount; e++) {\n const v = dst[e];\n colIdx[e] = v;\n if (e > 0 && src[e] === src[e - 1] && dst[e - 1] === v) {\n multigraph = true;\n }\n }\n return multigraph;\n}\nfunction scatterDirectedByTarget(src, dst, edgeCount, cursor, byTarget) {\n for (let e = 0; e < edgeCount; e++) {\n const p = 2 * cursor[dst[e]]++;\n byTarget[p] = src[e];\n byTarget[p + 1] = e;\n }\n}\nfunction scatterUndirectedByTarget(src, dst, edgeCount, cursor, byTarget, declared) {\n for (let e = 0; e < edgeCount; e++) {\n const u = src[e];\n const v = dst[e];\n const p = cursor[v]++;\n byTarget[2 * p] = u;\n byTarget[2 * p + 1] = e;\n declared[p >>> 5] |= 1 << (p & 31);\n if (u !== v) {\n const q = 2 * cursor[u]++;\n byTarget[q] = v;\n byTarget[q + 1] = e;\n }\n }\n}\nfunction scatterDirectedBySource(nodeCount, targetStart, byTarget, cursor, colIdx, arcToEdge) {\n for (let v = 0; v < nodeCount; v++) {\n const end = 2 * targetStart[v + 1];\n for (let p = 2 * targetStart[v]; p < end; p += 2) {\n const a = cursor[byTarget[p]]++;\n colIdx[a] = v;\n arcToEdge[a] = byTarget[p + 1];\n }\n }\n}\nfunction scatterUndirectedBySource(nodeCount, targetStart, byTarget, declared, cursor, colIdx, arcToEdge, edgeToArc) {\n for (let v = 0; v < nodeCount; v++) {\n const end = targetStart[v + 1];\n for (let p = targetStart[v]; p < end; p++) {\n const e = byTarget[2 * p + 1];\n const a = cursor[byTarget[2 * p]]++;\n colIdx[a] = v;\n arcToEdge[a] = e;\n if ((declared[p >>> 5] >>> (p & 31) & 1) === 1) {\n edgeToArc[e] = a;\n }\n }\n }\n}\nfunction invertPermutation(arcToEdge, edgeToArc) {\n const arcCount = arcToEdge.length;\n for (let a = 0; a < arcCount; a++) {\n edgeToArc[arcToEdge[a]] = a;\n }\n}\nfunction gatherWeights(arcToEdge, edgeWeights, weights) {\n const arcCount = arcToEdge.length;\n for (let a = 0; a < arcCount; a++) {\n weights[a] = edgeWeights[arcToEdge[a]];\n }\n}\nfunction hasAdjacentParallels(rowPtr, colIdx, nodeCount) {\n for (let u = 0; u < nodeCount; u++) {\n const end = rowPtr[u + 1];\n for (let a = rowPtr[u] + 1; a < end; a++) {\n if (colIdx[a] === colIdx[a - 1]) {\n return true;\n }\n }\n }\n return false;\n}\nfunction sortIntoCore(input, useArena) {\n const { directed, nodeCount, edgeCount, src, dst } = input;\n const edgeWeights = input.weights;\n let allOne = true;\n let nonNegative = true;\n let finite = true;\n if (edgeWeights !== null && edgeCount > 0) {\n const bounds = new Float64Array([Infinity, -Infinity]);\n scanStoredWeights(edgeWeights, edgeCount, bounds);\n const min = bounds[0];\n const max = bounds[1];\n allOne = min === 1 && max === 1;\n nonNegative = min >= 0;\n finite = min > -Infinity && max < Infinity;\n }\n const targetStart = new Uint32Array(nodeCount + 1);\n const rowCount = new Uint32Array(nodeCount + 1);\n const selfLoopCount = directed ? countDirectedArcs(src, dst, edgeCount, targetStart, rowCount) : countUndirectedArcs(src, dst, edgeCount, targetStart, rowCount);\n const arcCount = directed ? edgeCount : 2 * edgeCount - selfLoopCount;\n const identity = directed && isSortedEdgeList(src, dst, edgeCount);\n const core = allocateCoreArrays(\n { nodeCount, arcCount, edgeCount, weighted: edgeWeights !== null, identity },\n useArena\n );\n const { rowPtr, colIdx, weights, arcToEdge, edgeToArc } = core;\n prefixSum(rowCount, nodeCount);\n rowPtr.set(rowCount);\n let multigraph;\n if (identity) {\n multigraph = copySortedTargets(src, dst, edgeCount, colIdx);\n if (weights !== null && edgeWeights !== null) {\n weights.set(edgeWeights.subarray(0, edgeCount));\n }\n } else if (arcToEdge !== null && edgeToArc !== null) {\n prefixSum(targetStart, nodeCount);\n const cursor = rowCount;\n cursor.set(targetStart);\n const byTarget = new Uint32Array(2 * arcCount);\n let declared = null;\n if (directed) {\n scatterDirectedByTarget(src, dst, edgeCount, cursor, byTarget);\n } else {\n declared = new Uint32Array(arcCount + 31 >>> 5);\n scatterUndirectedByTarget(src, dst, edgeCount, cursor, byTarget, declared);\n }\n cursor.set(rowPtr);\n if (declared === null) {\n scatterDirectedBySource(nodeCount, targetStart, byTarget, cursor, colIdx, arcToEdge);\n invertPermutation(arcToEdge, edgeToArc);\n } else {\n scatterUndirectedBySource(nodeCount, targetStart, byTarget, declared, cursor, colIdx, arcToEdge, edgeToArc);\n }\n if (weights !== null && edgeWeights !== null) {\n gatherWeights(arcToEdge, edgeWeights, weights);\n }\n multigraph = hasAdjacentParallels(rowPtr, colIdx, nodeCount);\n } else {\n throw new GraphFormatError(\"E_UNSUPPORTED\", \"unreachable: a non-identity core without permutation arrays\", {\n directed,\n arcCount\n });\n }\n const flags = Object.freeze({\n multigraph,\n hasSelfLoops: selfLoopCount > 0,\n arcToEdgeIsIdentity: identity,\n weighted: weights !== null,\n allWeightsOne: allOne,\n nonNegativeWeights: nonNegative,\n finiteWeights: finite\n });\n return { core, arcCount, selfLoopCount, flags };\n}\nfunction allocLike(like, length) {\n if (like instanceof Uint8Array) {\n return allocU8(length);\n }\n if (like instanceof Uint32Array) {\n return new Uint32Array(length);\n }\n if (like instanceof Int32Array) {\n return new Int32Array(length);\n }\n if (like instanceof Float32Array) {\n return new Float32Array(length);\n }\n return new Float64Array(length);\n}\nfunction checkComponents(components, data) {\n if (!(Number.isInteger(components) && components >= 1)) {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `components must be a positive integer, found ${components}`, {\n field: \"components\",\n found: components\n });\n }\n if (data.length % components !== 0) {\n throw new GraphFormatError(\n \"E_COLUMN_LENGTH\",\n `array length ${data.length} is not a multiple of ${components}`,\n {\n expected: components,\n found: data.length\n }\n );\n }\n}\nfunction remapArray(data, remap, newLength, fill, components = 1) {\n checkComponents(components, data);\n const out = allocLike(data, newLength * components);\n if (fill !== 0) {\n out.fill(fill);\n }\n const rows = Math.min(remap.length, data.length / components);\n for (let i = 0; i < rows; i++) {\n const target = remap[i];\n if (target === INVALID_INDEX) {\n continue;\n }\n if (target >= newLength) {\n throw new GraphFormatError(\n \"E_INDEX_RANGE\",\n `remap[${i}] = ${target} is outside the new space of ${newLength} rows`,\n {\n index: i,\n found: target,\n length: newLength\n }\n );\n }\n if (components === 1) {\n out[target] = data[i];\n } else {\n for (let k = 0; k < components; k++) {\n out[target * components + k] = data[i * components + k];\n }\n }\n }\n return out;\n}\nfunction gatherArray(data, indexMap, components = 1) {\n checkComponents(components, data);\n const out = allocLike(data, indexMap.length * components);\n const rows = data.length / components;\n for (let i = 0; i < indexMap.length; i++) {\n const source = indexMap[i];\n if (source >= rows) {\n throw new GraphFormatError(\n \"E_INDEX_RANGE\",\n `indexMap[${i}] = ${source} is outside the source of ${rows} rows`,\n {\n index: i,\n found: source,\n length: rows\n }\n );\n }\n if (components === 1) {\n out[i] = data[source];\n } else {\n for (let k = 0; k < components; k++) {\n out[i * components + k] = data[source * components + k];\n }\n }\n }\n return out;\n}\nfunction scatterArray(out, values, indexMap, components = 1) {\n checkComponents(components, values);\n if (values.length !== indexMap.length * components) {\n throw new GraphFormatError(\n \"E_COLUMN_LENGTH\",\n `values has ${values.length} entries, expected ${indexMap.length * components}`,\n {\n expected: indexMap.length * components,\n found: values.length\n }\n );\n }\n const rows = out.length / components;\n for (let i = 0; i < indexMap.length; i++) {\n const target = indexMap[i];\n if (target >= rows) {\n throw new GraphFormatError(\n \"E_INDEX_RANGE\",\n `indexMap[${i}] = ${target} is outside the destination of ${rows} rows`,\n {\n index: i,\n found: target,\n length: rows\n }\n );\n }\n if (components === 1) {\n out[target] = values[i];\n } else {\n for (let k = 0; k < components; k++) {\n out[target * components + k] = values[i * components + k];\n }\n }\n }\n return out;\n}\nfunction gatherValidity(column, indexMap) {\n const source = column.validity;\n let validity = null;\n let nullCount = 0;\n for (let i = 0; i < indexMap.length; i++) {\n const from = indexMap[i];\n const set = from !== INVALID_INDEX && (source === null || bitmapGet(source, from));\n if (!set) {\n validity ??= makeBitmap(indexMap.length, true);\n bitmapClear(validity, i);\n nullCount++;\n }\n }\n return { validity, nullCount };\n}\nfunction gatheredMeta(meta, nullCount) {\n if (meta.nullable || nullCount === 0) {\n return meta;\n }\n return Object.freeze({ ...meta, nullable: true });\n}\nfunction gatherColumn(column, indexMap) {\n const { length } = indexMap;\n for (let i = 0; i < length; i++) {\n const from = indexMap[i];\n if (from !== INVALID_INDEX && from >= column.length) {\n throw new GraphFormatError(\n \"E_INDEX_RANGE\",\n `indexMap[${i}] = ${from} is outside the column of ${column.length} rows`,\n {\n index: i,\n found: from,\n length: column.length,\n column: column.meta.name\n }\n );\n }\n }\n const { validity, nullCount } = gatherValidity(column, indexMap);\n const meta = gatheredMeta(column.meta, nullCount);\n const parts = {\n ...partsOf(column),\n meta,\n length,\n validity\n };\n const { dtype } = column;\n switch (dtype) {\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\": {\n const { components, fill } = meta;\n const out = allocLike(column.data, length * components);\n if (typeof fill === \"number\" && fill !== 0) {\n out.fill(fill);\n }\n for (let i = 0; i < length; i++) {\n const from = indexMap[i];\n if (from === INVALID_INDEX) {\n continue;\n }\n for (let k = 0; k < components; k++) {\n out[i * components + k] = column.data[from * components + k];\n }\n }\n parts.data = out;\n break;\n }\n case \"bool\": {\n const out = new Uint32Array(bitmapWordCount(length)).fill(meta.fill === true ? 4294967295 : 0);\n for (let i = 0; i < length; i++) {\n const from = indexMap[i];\n if (from === INVALID_INDEX) {\n continue;\n }\n if (bitmapGet(column.data, from)) {\n bitmapSet(out, i);\n } else {\n bitmapClear(out, i);\n }\n }\n parts.data = out;\n break;\n }\n case \"dict\": {\n const code = typeof meta.fill === \"string\" ? column.codeOf(meta.fill) : INVALID_INDEX;\n const fillCode2 = code === INVALID_INDEX ? 0 : code;\n const out = new Uint32Array(length);\n for (let i = 0; i < length; i++) {\n const from = indexMap[i];\n out[i] = from === INVALID_INDEX ? fillCode2 : column.codes[from];\n }\n parts.data = out;\n break;\n }\n case \"string\": {\n const fillText = typeof meta.fill === \"string\" ? meta.fill : \"\";\n const strings = new Array(length);\n for (let i = 0; i < length; i++) {\n const from = indexMap[i];\n strings[i] = from === INVALID_INDEX ? fillText : column.valueAt(from);\n }\n parts.offsets = null;\n parts.utf8 = null;\n parts.strings = strings;\n break;\n }\n case \"list\": {\n const { offsets, child } = column;\n const newOffsets = new Uint32Array(length + 1);\n let total = 0;\n for (let i = 0; i < length; i++) {\n const from = indexMap[i];\n if (from !== INVALID_INDEX) {\n total += offsets[from + 1] - offsets[from];\n }\n newOffsets[i + 1] = total;\n }\n const itemMap = new Uint32Array(total);\n let at = 0;\n for (let i = 0; i < length; i++) {\n const from = indexMap[i];\n if (from === INVALID_INDEX) {\n continue;\n }\n for (let j = offsets[from]; j < offsets[from + 1]; j++) {\n itemMap[at++] = j;\n }\n }\n parts.offsets = newOffsets;\n parts.child = gatherColumn(child, itemMap);\n break;\n }\n case \"json\": {\n const out = new Array(length);\n for (let i = 0; i < length; i++) {\n const from = indexMap[i];\n out[i] = from === INVALID_INDEX ? void 0 : column.values[from];\n }\n parts.values = out;\n break;\n }\n default: {\n const name = dtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${name}`, { dtype: name });\n }\n }\n return createColumn(parts);\n}\nfunction invertRemap(remap, oldLength, newLength) {\n const indexMap = new Uint32Array(newLength).fill(INVALID_INDEX);\n const rows = Math.min(remap.length, oldLength);\n for (let i = 0; i < rows; i++) {\n const target = remap[i];\n if (target === INVALID_INDEX) {\n continue;\n }\n if (target >= newLength) {\n throw new GraphFormatError(\n \"E_INDEX_RANGE\",\n `remap[${i}] = ${target} is outside the new space of ${newLength} rows`,\n {\n index: i,\n found: target,\n length: newLength\n }\n );\n }\n indexMap[target] = i;\n }\n return indexMap;\n}\nfunction remapReferences(column, valueRemap) {\n if (column.meta.refersTo === null) {\n return column;\n }\n const mapValue = (value) => {\n if (value === INVALID_INDEX || value >= valueRemap.length) {\n return INVALID_INDEX;\n }\n return valueRemap[value];\n };\n if (column.dtype === \"u32\") {\n const { length } = column;\n const data = new Uint32Array(length);\n let validity = column.validity === null ? null : column.validity.slice();\n let { nullCount } = column;\n for (let row = 0; row < length; row++) {\n const mapped = mapValue(column.data[row]);\n data[row] = mapped;\n if (mapped === INVALID_INDEX && (validity === null || bitmapGet(validity, row))) {\n validity ??= makeBitmap(length, true);\n bitmapClear(validity, row);\n nullCount++;\n }\n }\n const parts = {\n ...partsOf(column),\n meta: gatheredMeta(column.meta, nullCount),\n data,\n validity\n };\n return createColumn(parts);\n }\n if (column.dtype === \"list\" && column.child.dtype === \"u32\") {\n const { length, offsets, child } = column;\n const rows = new Array(length);\n let validity = column.validity === null ? null : column.validity.slice();\n let { nullCount } = column;\n for (let row = 0; row < length; row++) {\n const items = [];\n const start = offsets[row];\n const end = offsets[row + 1];\n for (let j = start; j < end; j++) {\n const mapped = mapValue(child.data[j]);\n if (mapped !== INVALID_INDEX) {\n items.push(mapped);\n }\n }\n rows[row] = items;\n if (end > start && items.length === 0 && (validity === null || bitmapGet(validity, row))) {\n validity ??= makeBitmap(length, true);\n bitmapClear(validity, row);\n nullCount++;\n }\n }\n const meta = gatheredMeta(column.meta, nullCount);\n const rebuilt = columnOfValues(Object.freeze({ ...meta, nullable: true }), rows);\n const parts = {\n ...partsOf(rebuilt),\n meta,\n validity\n };\n return createColumn(parts);\n }\n throw new GraphFormatError(\n \"E_COLUMN_TYPE\",\n `column \"${column.meta.name}\" has refersTo but is not u32 or a list of u32`,\n {\n column: column.meta.name,\n field: \"refersTo\"\n }\n );\n}\nfunction remapColumnWith(column, remap, newLength, valueRemap) {\n if (remap.length !== column.length) {\n throw new GraphFormatError(\n \"E_COLUMN_LENGTH\",\n `remap has ${remap.length} entries for a column of ${column.length} rows`,\n { column: column.meta.name, expected: column.length, found: remap.length }\n );\n }\n const gathered = gatherColumn(column, invertRemap(remap, column.length, newLength));\n return valueRemap === null ? gathered : remapReferences(gathered, valueRemap);\n}\nfunction remapColumn(column, remap, newLength) {\n const { refersTo, domain } = column.meta;\n const ownSpace = refersTo !== null && refersTo === domain;\n return remapColumnWith(column, remap, newLength, ownSpace ? remap : null);\n}\nfunction withComponents(data, from, to, fill) {\n for (const [field, value] of [\n [\"from\", from],\n [\"to\", to]\n ]) {\n if (!Number.isInteger(value) || value < 1 || value > 16) {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `${field} must be an integer in 1..16, found ${value}`, {\n field,\n found: value\n });\n }\n }\n checkComponents(from, data);\n if (from === to) {\n return data;\n }\n const rows = data.length / from;\n const out = new Float32Array(rows * to);\n const keep = Math.min(from, to);\n if (to > from && fill !== 0) {\n out.fill(fill);\n }\n for (let row = 0; row < rows; row++) {\n const src = row * from;\n const dst = row * to;\n for (let k = 0; k < keep; k++) {\n out[dst + k] = data[src + k];\n }\n }\n return out;\n}\nfunction valueRemapFor(meta, refs) {\n if (meta.refersTo === \"node\") {\n return refs.node;\n }\n if (meta.refersTo === \"edge\") {\n return refs.edge;\n }\n return null;\n}\nfunction remapTable(table, rowRemap, newLength, refs) {\n const rowCount = table.rowCount;\n const columns = [];\n for (const column of table) {\n const valueRemap = valueRemapFor(column.meta, refs);\n let out = column;\n if (valueRemap !== null) {\n out = remapReferences(column, valueRemap);\n }\n columns.push(out);\n }\n return new AttributeTable({ domain: table.domain, rowCount, columns });\n}\nfunction gatherTable(table, indexMap, refs) {\n const columns = [];\n for (const column of table) {\n const gathered = gatherColumn(column, indexMap);\n const valueRemap = valueRemapFor(column.meta, refs);\n columns.push(valueRemap === null ? gathered : remapReferences(gathered, valueRemap));\n }\n return new AttributeTable({ domain: table.domain, rowCount: indexMap.length, columns });\n}\nfunction makeMask(length, fill) {\n return makeBitmap(length, fill === true);\n}\nfunction maskTest(mask, i) {\n return bitmapGet(mask, i);\n}\nfunction maskSet(mask, i, value) {\n bitmapWrite(mask, i, value);\n}\nfunction maskCount(mask, length) {\n return bitmapCount(mask, length);\n}\nfunction maskToIndices(mask, length) {\n return bitmapToIndices(mask, length);\n}\nfunction checkMaskLength(mask, length, what) {\n const required = bitmapWordCount(length);\n if (mask.length < required) {\n throw new GraphFormatError(\n \"E_MASK_LENGTH\",\n `mask over ${what} has ${mask.length} words; ${required} needed for ${length} ${what}`,\n { found: mask.length, required, length }\n );\n }\n}\nconst NO_REPORT = Object.freeze({ droppedEdges: 0, mergedEdges: 0 });\nfunction identityDerived() {\n return {\n parts: null,\n nodeOrigin: null,\n edgeOrigin: null,\n nodeRemap: null,\n edgeRemap: null,\n blockSizes: null,\n report: NO_REPORT\n };\n}\nfunction buildCore(edges, options = {}) {\n const result = sortIntoCore(edges, options.arena !== false);\n const { core } = result;\n return {\n arcCount: result.arcCount,\n selfLoopCount: result.selfLoopCount,\n rowPtr: core.rowPtr,\n colIdx: core.colIdx,\n weights: core.weights,\n arcToEdge: core.arcToEdge,\n edgeToArc: core.edgeToArc,\n flags: result.flags,\n arena: core.arena\n };\n}\nfunction assembleParts(source, core, sides) {\n return {\n label: source.label,\n serial: null,\n directed: sides.directed,\n nodeCount: sides.nodeCount,\n edgeCount: sides.edgeCount,\n arcCount: core.arcCount,\n selfLoopCount: core.selfLoopCount,\n rowPtr: core.rowPtr,\n colIdx: core.colIdx,\n weights: core.weights,\n arcToEdge: core.arcToEdge,\n edgeToArc: core.edgeToArc,\n flags: core.flags,\n ids: sides.ids,\n nodes: sides.nodes,\n edges: sides.edges,\n graph: source.graph,\n extensions: sides.extensions,\n meta: source.meta,\n arena: core.arena,\n checksum: false\n };\n}\nfunction remapExtensions(source, nodeRemap, edgeRemap) {\n if (nodeRemap === null && edgeRemap === null || source.extensions.size === 0) {\n return source.extensions;\n }\n const out = /* @__PURE__ */ new Map();\n for (const [name, table] of source.extensions) {\n out.set(name, remapTable(table, null, table.rowCount, { node: nodeRemap, edge: edgeRemap }));\n }\n return out;\n}\nfunction originOf(remap, count) {\n const origin = new Uint32Array(count).fill(INVALID_INDEX);\n for (let e = 0; e < remap.length; e++) {\n const d = remap[e];\n if (d !== INVALID_INDEX && origin[d] === INVALID_INDEX) {\n origin[d] = e;\n }\n }\n return origin;\n}\nfunction groupingFromSurvivors(survivorOf) {\n const edgeCount = survivorOf.length;\n const newIndex = new Uint32Array(edgeCount).fill(INVALID_INDEX);\n let count = 0;\n let dropped = 0;\n let merged = 0;\n for (let e = 0; e < edgeCount; e++) {\n if (survivorOf[e] === e) {\n newIndex[e] = count++;\n } else if (survivorOf[e] === INVALID_INDEX) {\n dropped++;\n } else {\n merged++;\n }\n }\n if (dropped === 0 && merged === 0) {\n return { count, remap: null, origin: null, dropped, merged };\n }\n const remap = new Uint32Array(edgeCount);\n for (let e = 0; e < edgeCount; e++) {\n const s = survivorOf[e];\n remap[e] = s === INVALID_INDEX ? INVALID_INDEX : newIndex[s];\n }\n return { count, remap, origin: originOf(remap, count), dropped, merged };\n}\nfunction isIdentitySelection(origin, nodeCount) {\n return origin.length === nodeCount && isIdentity(origin);\n}\nfunction gatherEndpoints(list, grouping, nodeRemap) {\n const { count, origin } = grouping;\n const src = new Uint32Array(count);\n const dst = new Uint32Array(count);\n for (let d = 0; d < count; d++) {\n const e = origin === null ? d : origin[d];\n src[d] = nodeRemap === null ? list.src[e] : nodeRemap[list.src[e]];\n dst[d] = nodeRemap === null ? list.dst[e] : nodeRemap[list.dst[e]];\n }\n return { src, dst };\n}\nfunction checkReducers(field, reducers) {\n if (reducers === void 0) {\n return;\n }\n for (const name of Object.keys(reducers)) {\n assertOneOf(`${field}.${name}`, reducers[name], COLUMN_REDUCERS);\n }\n}\nfunction reduceWeights(weights, grouping, reducer) {\n const { count, remap, origin } = grouping;\n if (weights === null) {\n if (reducer !== \"sum\") {\n return null;\n }\n const out2 = new Float32Array(count);\n if (remap === null) {\n out2.fill(1);\n return out2;\n }\n for (let e = 0; e < remap.length; e++) {\n if (remap[e] !== INVALID_INDEX) {\n out2[remap[e]]++;\n }\n }\n return out2;\n }\n if (remap === null || origin === null) {\n return weights;\n }\n const out = new Float32Array(count);\n for (let d = 0; d < count; d++) {\n out[d] = weights[origin[d]];\n }\n if (reducer === \"first\") {\n return out;\n }\n for (let e = 0; e < remap.length; e++) {\n const d = remap[e];\n if (d === INVALID_INDEX || origin[d] === e) {\n continue;\n }\n const w = weights[e];\n switch (reducer) {\n case \"last\":\n out[d] = w;\n break;\n case \"sum\":\n out[d] += w;\n break;\n case \"min\":\n if (w < out[d]) {\n out[d] = w;\n }\n break;\n case \"max\":\n if (w > out[d]) {\n out[d] = w;\n }\n break;\n default: {\n const unknown = reducer;\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown weight reducer ${String(unknown)}`, {\n reducer: unknown\n });\n }\n }\n }\n return out;\n}\nfunction groupingFromPredicate(edgeCount, keep) {\n const survivorOf = new Uint32Array(edgeCount);\n for (let e = 0; e < edgeCount; e++) {\n survivorOf[e] = keep(e) ? e : INVALID_INDEX;\n }\n return groupingFromSurvivors(survivorOf);\n}\nfunction reduceNumericColumn(column, grouping, reducer) {\n const { count, remap } = grouping;\n const { components } = column.meta;\n const width = components;\n const acc = new Float64Array(count * width);\n const members = new Uint32Array(count);\n const seen = new Uint8Array(count);\n const source = column.data;\n const rows = remap === null ? column.length : remap.length;\n for (let r = 0; r < rows; r++) {\n const d = remap === null ? r : remap[r];\n if (d === INVALID_INDEX || !column.isSet(r)) {\n continue;\n }\n members[d]++;\n for (let k = 0; k < width; k++) {\n const value = source[r * width + k];\n const at = d * width + k;\n if (seen[d] === 0) {\n acc[at] = value;\n } else {\n switch (reducer) {\n case \"sum\":\n case \"mean\":\n acc[at] += value;\n break;\n case \"min\":\n if (value < acc[at]) {\n acc[at] = value;\n }\n break;\n case \"max\":\n if (value > acc[at]) {\n acc[at] = value;\n }\n break;\n default: {\n const unknown = reducer;\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown reducer ${String(unknown)}`, {\n reducer: unknown\n });\n }\n }\n }\n }\n seen[d] = 1;\n }\n if (reducer === \"mean\") {\n for (let d = 0; d < count; d++) {\n if (members[d] > 1) {\n for (let k = 0; k < width; k++) {\n acc[d * width + k] /= members[d];\n }\n }\n }\n }\n const widen = reducer === \"mean\" || reducer === \"sum\" && column.dtype !== \"f32\" && column.dtype !== \"f64\";\n const dtype = widen ? \"f64\" : column.dtype;\n let data;\n switch (dtype) {\n case \"f64\":\n data = acc;\n break;\n case \"f32\":\n data = new Float32Array(acc);\n break;\n case \"i32\":\n data = new Int32Array(acc);\n break;\n case \"u32\":\n data = new Uint32Array(acc);\n break;\n case \"u8\":\n data = new Uint8Array(new ArrayBuffer(Math.ceil(count * width / 4) * 4), 0, count * width);\n data.set(acc);\n break;\n default: {\n const unknown = dtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `cannot reduce a ${String(unknown)} column`, {\n dtype: unknown\n });\n }\n }\n let validity = null;\n let nullCount = 0;\n for (let d = 0; d < count; d++) {\n if (seen[d] === 0) {\n validity ??= makeBitmap(count, true);\n bitmapClear(validity, d);\n nullCount++;\n }\n }\n const meta = resolveColumnMeta(column.meta.name, column.meta.domain, {\n dtype,\n components,\n nullable: column.meta.nullable || nullCount > 0,\n role: column.meta.role ?? void 0,\n extra: column.meta.extra\n });\n return createColumn({ ...emptyParts(meta, count, validity), data });\n}\nfunction countColumn(column, grouping) {\n const { count, remap } = grouping;\n const sizes = new Uint32Array(count);\n if (remap === null) {\n sizes.fill(1);\n } else {\n for (let r = 0; r < remap.length; r++) {\n if (remap[r] !== INVALID_INDEX) {\n sizes[remap[r]]++;\n }\n }\n }\n const meta = resolveColumnMeta(column.meta.name, column.meta.domain, {\n dtype: \"u32\",\n nullable: false,\n role: column.meta.role ?? void 0,\n extra: column.meta.extra\n });\n return createColumn({ ...emptyParts(meta, count, null), data: sizes });\n}\nfunction reduceColumn(column, grouping, reducer) {\n if (reducer === \"drop\" || column.meta.refersTo !== null) {\n return null;\n }\n const { count, remap, origin } = grouping;\n switch (reducer) {\n case \"first\":\n return origin === null ? column : gatherColumn(column, origin);\n case \"last\": {\n if (remap === null) {\n return column;\n }\n const last = new Uint32Array(count);\n for (let r = 0; r < remap.length; r++) {\n if (remap[r] !== INVALID_INDEX) {\n last[remap[r]] = r;\n }\n }\n return gatherColumn(column, last);\n }\n case \"count\":\n return countColumn(column, grouping);\n case \"sum\":\n case \"min\":\n case \"max\":\n case \"mean\": {\n const { dtype } = column;\n switch (dtype) {\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\":\n return reduceNumericColumn(column, grouping, reducer);\n case \"bool\":\n case \"dict\":\n case \"string\":\n case \"list\":\n case \"json\":\n throw new GraphFormatError(\n \"E_COLUMN_TYPE\",\n `reducer \"${reducer}\" needs a numeric column; \"${column.meta.name}\" is ${dtype}`,\n { column: column.meta.name, dtype, reducer }\n );\n default: {\n const unknown = dtype;\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `unknown dtype ${String(unknown)}`, { dtype: unknown });\n }\n }\n }\n default: {\n const unknown = reducer;\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown column reducer ${String(unknown)}`, {\n reducer: unknown\n });\n }\n }\n}\nfunction reduceEdgeTable(source, grouping, reducers, nodeRemap) {\n const refs = { node: nodeRemap, edge: grouping.remap };\n if (reducers === void 0 || Object.keys(reducers).length === 0) {\n if (grouping.origin === null) {\n return nodeRemap === null ? source.edges : remapTable(source.edges, null, source.edgeCount, refs);\n }\n return gatherTable(source.edges, grouping.origin, refs);\n }\n const columns = [];\n for (const column of source.edges) {\n const reducer = reducers[column.meta.name];\n if (reducer === void 0) {\n const gathered = grouping.origin === null ? column : gatherColumn(column, grouping.origin);\n columns.push(gathered);\n continue;\n }\n const reduced = reduceColumn(column, grouping, reducer);\n if (reduced !== null) {\n columns.push(reduced);\n }\n }\n const table = new AttributeTable({ domain: \"edge\", rowCount: grouping.count, columns });\n return remapTable(table, null, grouping.count, refs);\n}\nfunction deriveKeptEdges(source, list, keep) {\n const grouping = groupingFromPredicate(source.edgeCount, keep);\n const { src, dst } = gatherEndpoints(list, grouping, null);\n const weights = reduceWeights(list.weights, grouping, \"first\");\n const core = buildCore({\n directed: source.directed,\n nodeCount: source.nodeCount,\n edgeCount: grouping.count,\n src,\n dst,\n weights\n });\n const edges = reduceEdgeTable(source, grouping, void 0, null);\n const parts = assembleParts(source, core, {\n directed: source.directed,\n nodeCount: source.nodeCount,\n edgeCount: grouping.count,\n ids: source.ids,\n nodes: source.nodes,\n edges,\n extensions: remapExtensions(source, null, grouping.remap)\n });\n return {\n parts,\n nodeOrigin: null,\n edgeOrigin: grouping.origin,\n nodeRemap: null,\n edgeRemap: grouping.remap,\n blockSizes: null,\n report: { droppedEdges: grouping.dropped, mergedEdges: 0 }\n };\n}\nfunction deriveFilterEdges(source, list, keep) {\n checkMaskLength(keep, source.edgeCount, \"edges\");\n return deriveKeptEdges(source, list, (e) => maskTest(keep, e));\n}\nfunction deriveWithoutSelfLoops(source, list) {\n return deriveKeptEdges(source, list, (e) => list.src[e] !== list.dst[e]);\n}\nfunction selectionError(position, value, nodeCount, reason) {\n return new GraphFormatError(\n \"E_INDEX_RANGE\",\n `inducedSubgraph selection[${position}] = ${value} is ${reason} (nodeCount ${nodeCount})`,\n { index: position, found: value, nodeCount, reason }\n );\n}\nfunction resolveSelection(source, selection) {\n const { nodeCount } = source;\n if (selection instanceof Uint32Array) {\n const seen = new Uint8Array(nodeCount);\n const origin = new Uint32Array(selection.length);\n for (let i = 0; i < selection.length; i++) {\n const u = selection[i];\n if (u >= nodeCount) {\n throw selectionError(i, u, nodeCount, \"out of range\");\n }\n if (seen[u] === 1) {\n throw selectionError(i, u, nodeCount, \"repeated\");\n }\n seen[u] = 1;\n origin[i] = u;\n }\n return origin;\n }\n checkMaskLength(selection.mask, nodeCount, \"nodes\");\n return maskToIndices(selection.mask, nodeCount);\n}\nfunction invertOrigin(origin, nodeCount) {\n const remap = new Uint32Array(nodeCount).fill(INVALID_INDEX);\n for (let i = 0; i < origin.length; i++) {\n remap[origin[i]] = i;\n }\n return remap;\n}\nfunction deriveOverNodeSpace(source, list, nodeOrigin, grouping) {\n const nodeCount = nodeOrigin === null ? source.nodeCount : nodeOrigin.length;\n const nodeRemap = nodeOrigin === null ? null : invertOrigin(nodeOrigin, source.nodeCount);\n const { src, dst } = gatherEndpoints(list, grouping, nodeRemap);\n const weights = reduceWeights(list.weights, grouping, \"first\");\n const core = buildCore({ directed: source.directed, nodeCount, edgeCount: grouping.count, src, dst, weights });\n const refs = { node: nodeRemap, edge: grouping.remap };\n const nodes = nodeOrigin === null ? source.nodes : gatherTable(source.nodes, nodeOrigin, refs);\n const ids = nodeOrigin === null ? source.ids : gatherNodeIdMap(source.ids, nodeOrigin);\n const edges = reduceEdgeTable(source, grouping, void 0, nodeRemap);\n const parts = assembleParts(source, core, {\n directed: source.directed,\n nodeCount,\n edgeCount: grouping.count,\n ids,\n nodes,\n edges,\n extensions: remapExtensions(source, nodeRemap, grouping.remap)\n });\n return {\n parts,\n nodeOrigin,\n edgeOrigin: grouping.origin,\n nodeRemap,\n edgeRemap: grouping.remap,\n blockSizes: null,\n report: { droppedEdges: grouping.dropped, mergedEdges: grouping.merged }\n };\n}\nfunction deriveInducedSubgraph(source, list, selection) {\n const origin = resolveSelection(source, selection);\n const identity = isIdentitySelection(origin, source.nodeCount);\n const nodeOrigin = identity ? null : origin;\n const nodeRemap = identity ? null : invertOrigin(origin, source.nodeCount);\n const grouping = nodeRemap === null ? groupingFromPredicate(source.edgeCount, () => true) : groupingFromPredicate(\n source.edgeCount,\n (e) => nodeRemap[list.src[e]] !== INVALID_INDEX && nodeRemap[list.dst[e]] !== INVALID_INDEX\n );\n return deriveOverNodeSpace(source, list, nodeOrigin, grouping);\n}\nfunction deriveRelabel(source, list, perm) {\n const { nodeCount } = source;\n if (perm.length !== nodeCount) {\n throw new GraphFormatError(\"E_INVALID_PERMUTATION\", `perm has ${perm.length} entries, expected ${nodeCount}`, {\n expected: nodeCount,\n found: perm.length\n });\n }\n const seen = new Uint8Array(nodeCount);\n for (let i = 0; i < nodeCount; i++) {\n const u = perm[i];\n if (u >= nodeCount || seen[u] === 1) {\n throw new GraphFormatError(\n \"E_INVALID_PERMUTATION\",\n `perm[${i}] = ${u} is out of range or repeated (nodeCount ${nodeCount})`,\n { index: i, found: u, nodeCount }\n );\n }\n seen[u] = 1;\n }\n const nodeOrigin = isIdentity(perm) ? null : perm.slice();\n const grouping = groupingFromPredicate(source.edgeCount, () => true);\n return deriveOverNodeSpace(source, list, nodeOrigin, grouping);\n}\nfunction deriveToUndirected(source, list, options = {}) {\n const reciprocal = options.reciprocal === true;\n const reducer = assertOneOf(\"weights\", options.weights, WEIGHT_REDUCERS) ?? \"first\";\n const { nodeCount, edgeCount, rowPtr, colIdx, arcToEdge } = source;\n const survivorOf = new Uint32Array(edgeCount);\n for (let e = 0; e < edgeCount; e++) {\n survivorOf[e] = reciprocal && list.src[e] !== list.dst[e] ? INVALID_INDEX : e;\n }\n for (let u = 0; u < nodeCount; u++) {\n const end = rowPtr[u + 1];\n let a = rowPtr[u];\n while (a < end) {\n const v = colIdx[a];\n let g = a + 1;\n while (g < end && colIdx[g] === v) {\n g++;\n }\n if (v > u) {\n const [lo, hi] = arcRangeIn(rowPtr, colIdx, v, u);\n const pairs = Math.min(g - a, hi - lo);\n for (let i = 0; i < pairs; i++) {\n const e1 = arcToEdge[a + i];\n const e2 = arcToEdge[lo + i];\n const low = Math.min(e1, e2);\n const high = Math.max(e1, e2);\n survivorOf[low] = low;\n survivorOf[high] = low;\n }\n }\n a = g;\n }\n }\n const grouping = groupingFromSurvivors(survivorOf);\n const { src, dst } = gatherEndpoints(list, grouping, null);\n const weights = reduceWeights(list.weights, grouping, reducer);\n const core = buildCore({ directed: false, nodeCount, edgeCount: grouping.count, src, dst, weights });\n const edges = reduceEdgeTable(source, grouping, void 0, null);\n const parts = assembleParts(source, core, {\n directed: false,\n nodeCount,\n edgeCount: grouping.count,\n ids: source.ids,\n nodes: source.nodes,\n edges,\n extensions: remapExtensions(source, null, grouping.remap)\n });\n return {\n parts,\n nodeOrigin: null,\n edgeOrigin: grouping.origin,\n nodeRemap: null,\n edgeRemap: grouping.remap,\n blockSizes: null,\n report: { droppedEdges: grouping.dropped, mergedEdges: grouping.merged }\n };\n}\nfunction deriveTranspose(source, reverse) {\n const { nodeCount, edgeCount, arcCount, selfLoopCount } = source;\n const revArcToEdge = reverse.arcToEdge;\n const identity = isIdentity(revArcToEdge);\n let arcToEdge = null;\n let edgeToArc = null;\n if (!identity) {\n arcToEdge = revArcToEdge;\n edgeToArc = new Uint32Array(edgeCount);\n for (let k = 0; k < arcCount; k++) {\n edgeToArc[revArcToEdge[k]] = k;\n }\n }\n const flags = computeFlags({\n directed: true,\n nodeCount,\n rowPtr: reverse.rowPtr,\n colIdx: reverse.colIdx,\n weights: reverse.weights,\n arcToEdge,\n selfLoopCount\n });\n noteShared(reverse.rowPtr.buffer);\n noteShared(reverse.colIdx.buffer);\n if (reverse.weights !== null) {\n noteShared(reverse.weights.buffer);\n }\n if (arcToEdge !== null) {\n noteShared(arcToEdge.buffer);\n }\n const parts = {\n label: source.label,\n serial: null,\n directed: true,\n nodeCount,\n edgeCount,\n arcCount,\n selfLoopCount,\n rowPtr: reverse.rowPtr,\n colIdx: reverse.colIdx,\n weights: reverse.weights,\n arcToEdge,\n edgeToArc,\n flags,\n ids: source.ids,\n nodes: source.nodes,\n edges: source.edges,\n graph: source.graph,\n extensions: source.extensions,\n meta: source.meta,\n arena: null,\n checksum: false\n };\n return {\n parts,\n nodeOrigin: null,\n edgeOrigin: null,\n nodeRemap: null,\n edgeRemap: null,\n blockSizes: null,\n report: NO_REPORT\n };\n}\nfunction deriveSimplified(source, list, options = {}) {\n const reducer = assertOneOf(\"weights\", options.weights, WEIGHT_REDUCERS) ?? \"first\";\n const dropLoops = assertOneOf(\"selfLoops\", options.selfLoops, [\"keep\", \"drop\"]) === \"drop\";\n checkReducers(\"edgeReducers\", options.edgeReducers);\n const { nodeCount, edgeCount, rowPtr, colIdx, arcToEdge } = source;\n const survivorOf = new Uint32Array(edgeCount).fill(INVALID_INDEX);\n for (let u = 0; u < nodeCount; u++) {\n const end = rowPtr[u + 1];\n let a = rowPtr[u];\n while (a < end) {\n const v = colIdx[a];\n let g = a + 1;\n while (g < end && colIdx[g] === v) {\n g++;\n }\n if (source.directed || v >= u) {\n if (!(v === u && dropLoops)) {\n const survivor = arcToEdge[a];\n for (let i = a; i < g; i++) {\n survivorOf[arcToEdge[i]] = survivor;\n }\n }\n }\n a = g;\n }\n }\n const grouping = groupingFromSurvivors(survivorOf);\n const { src, dst } = gatherEndpoints(list, grouping, null);\n const weights = reduceWeights(list.weights, grouping, reducer);\n const core = buildCore({ directed: source.directed, nodeCount, edgeCount: grouping.count, src, dst, weights });\n const edges = reduceEdgeTable(source, grouping, options.edgeReducers, null);\n const parts = assembleParts(source, core, {\n directed: source.directed,\n nodeCount,\n edgeCount: grouping.count,\n ids: source.ids,\n nodes: source.nodes,\n edges,\n extensions: remapExtensions(source, null, grouping.remap)\n });\n return {\n parts,\n nodeOrigin: null,\n edgeOrigin: grouping.origin,\n nodeRemap: null,\n edgeRemap: grouping.remap,\n blockSizes: null,\n report: { droppedEdges: grouping.dropped, mergedEdges: grouping.merged }\n };\n}\nfunction renumberPartition(labels, out) {\n const n = labels.length;\n const result = out ?? new Uint32Array(n);\n if (result.length !== n) {\n throw new GraphFormatError(\"E_COLUMN_LENGTH\", `out has ${result.length} entries, expected ${n}`, {\n expected: n,\n found: result.length\n });\n }\n let maxLabel = 0;\n for (let i = 0; i < n; i++) {\n const label = labels[i];\n if (label === INVALID_INDEX) {\n throw new GraphFormatError(\"E_PARTITION\", `labels[${i}] is INVALID_INDEX`, { index: i });\n }\n if (label > maxLabel) {\n maxLabel = label;\n }\n }\n let count = 0;\n if (maxLabel < 4 * n + 1024) {\n const lookup = new Uint32Array(maxLabel + 1).fill(INVALID_INDEX);\n for (let i = 0; i < n; i++) {\n const label = labels[i];\n let dense = lookup[label];\n if (dense === INVALID_INDEX) {\n dense = count++;\n lookup[label] = dense;\n }\n result[i] = dense;\n }\n } else {\n const lookup = /* @__PURE__ */ new Map();\n for (let i = 0; i < n; i++) {\n const label = labels[i];\n let dense = lookup.get(label);\n if (dense === void 0) {\n dense = count++;\n lookup.set(label, dense);\n }\n result[i] = dense;\n }\n }\n return { labels: result, count };\n}\nfunction denseBlocks(partition, nodeCount) {\n if (partition.length !== nodeCount) {\n throw new GraphFormatError(\n \"E_PARTITION\",\n `partition has ${partition.length} entries, expected nodeCount ${nodeCount}`,\n { expected: nodeCount, found: partition.length }\n );\n }\n let maxLabel = -1;\n for (let i = 0; i < nodeCount; i++) {\n const label = partition[i];\n if (label === INVALID_INDEX) {\n throw new GraphFormatError(\"E_PARTITION\", `partition[${i}] is INVALID_INDEX`, { index: i });\n }\n if (label > maxLabel) {\n maxLabel = label;\n }\n }\n if (maxLabel < nodeCount) {\n const seen = new Uint8Array(maxLabel + 1);\n let distinct = 0;\n for (let i = 0; i < nodeCount; i++) {\n if (seen[partition[i]] === 0) {\n seen[partition[i]] = 1;\n distinct++;\n }\n }\n if (distinct === maxLabel + 1) {\n return { labels: partition.slice(), count: maxLabel + 1 };\n }\n }\n return renumberPartition(partition);\n}\nfunction contractNodeTable(source, blocks, blockCount, blockOrigin, reducers) {\n const columns = [];\n if (reducers !== void 0) {\n const grouping = { count: blockCount, remap: blocks, origin: blockOrigin };\n for (const column of source.nodes) {\n const reducer = reducers[column.meta.name];\n if (reducer === void 0) {\n continue;\n }\n const reduced = reduceColumn(column, grouping, reducer);\n if (reduced !== null) {\n columns.push(reduced);\n }\n }\n }\n return new AttributeTable({ domain: \"node\", rowCount: blockCount, columns });\n}\nfunction groupByBlockPair(first, second, blockCount) {\n const edgeCount = first.length;\n const kept = [];\n for (let e = 0; e < edgeCount; e++) {\n if (first[e] !== INVALID_INDEX) {\n kept.push(e);\n }\n }\n const start = new Uint32Array(blockCount + 1);\n for (const e of kept) {\n start[second[e] + 1]++;\n }\n for (let b = 0; b < blockCount; b++) {\n start[b + 1] += start[b];\n }\n const bySecond = new Uint32Array(kept.length);\n for (const e of kept) {\n bySecond[start[second[e]]++] = e;\n }\n start.fill(0);\n for (const e of kept) {\n start[first[e] + 1]++;\n }\n for (let b = 0; b < blockCount; b++) {\n start[b + 1] += start[b];\n }\n const sorted = new Uint32Array(kept.length);\n for (let k = 0; k < bySecond.length; k++) {\n const e = bySecond[k];\n sorted[start[first[e]]++] = e;\n }\n const survivorOf = new Uint32Array(edgeCount).fill(INVALID_INDEX);\n let runStart = 0;\n while (runStart < sorted.length) {\n const leader = sorted[runStart];\n let runEnd = runStart + 1;\n while (runEnd < sorted.length && first[sorted[runEnd]] === first[leader] && second[sorted[runEnd]] === second[leader]) {\n runEnd++;\n }\n for (let k = runStart; k < runEnd; k++) {\n survivorOf[sorted[k]] = leader;\n }\n runStart = runEnd;\n }\n return survivorOf;\n}\nfunction deriveContract(source, list, partition, options = {}) {\n const reducer = assertOneOf(\"weights\", options.weights, WEIGHT_REDUCERS) ?? \"sum\";\n const dropLoops = assertOneOf(\"selfLoops\", options.selfLoops, [\"keep\", \"drop\"]) === \"drop\";\n const merge = (assertOneOf(\"parallel\", options.parallel, [\"merge\", \"keep\"]) ?? \"merge\") === \"merge\";\n checkReducers(\"nodeReducers\", options.nodeReducers);\n checkReducers(\"edgeReducers\", options.edgeReducers);\n const { nodeCount, edgeCount } = source;\n const { labels: blocks, count: blockCount } = denseBlocks(partition, nodeCount);\n const blockSizes = new Uint32Array(blockCount);\n const blockOrigin = new Uint32Array(blockCount).fill(INVALID_INDEX);\n for (let u = 0; u < nodeCount; u++) {\n const b = blocks[u];\n blockSizes[b]++;\n if (blockOrigin[b] === INVALID_INDEX) {\n blockOrigin[b] = u;\n }\n }\n const first = new Uint32Array(edgeCount);\n const second = new Uint32Array(edgeCount);\n for (let e = 0; e < edgeCount; e++) {\n const bu = blocks[list.src[e]];\n const bv = blocks[list.dst[e]];\n if (bu === bv && dropLoops) {\n first[e] = INVALID_INDEX;\n second[e] = INVALID_INDEX;\n } else if (source.directed || bu <= bv) {\n first[e] = bu;\n second[e] = bv;\n } else {\n first[e] = bv;\n second[e] = bu;\n }\n }\n let survivorOf;\n if (merge) {\n survivorOf = groupByBlockPair(first, second, blockCount);\n } else {\n survivorOf = new Uint32Array(edgeCount);\n for (let e = 0; e < edgeCount; e++) {\n survivorOf[e] = first[e] === INVALID_INDEX ? INVALID_INDEX : e;\n }\n }\n const grouping = groupingFromSurvivors(survivorOf);\n const { src, dst } = gatherEndpoints(list, grouping, blocks);\n const weights = reduceWeights(list.weights, grouping, reducer);\n const core = buildCore({\n directed: source.directed,\n nodeCount: blockCount,\n edgeCount: grouping.count,\n src,\n dst,\n weights\n });\n const nodes = contractNodeTable(source, blocks, blockCount, blockOrigin, options.nodeReducers);\n const edgeColumns = [];\n if (options.edgeReducers !== void 0) {\n for (const column of source.edges) {\n const columnReducer = options.edgeReducers[column.meta.name];\n if (columnReducer === void 0) {\n continue;\n }\n const reduced = reduceColumn(column, grouping, columnReducer);\n if (reduced !== null) {\n edgeColumns.push(reduced);\n }\n }\n }\n const edges = new AttributeTable({ domain: \"edge\", rowCount: grouping.count, columns: edgeColumns });\n const parts = assembleParts(source, core, {\n directed: source.directed,\n nodeCount: blockCount,\n edgeCount: grouping.count,\n ids: identityNodeIdMap(blockCount),\n nodes,\n edges,\n extensions: remapExtensions(source, blocks, grouping.remap)\n });\n return {\n parts,\n nodeOrigin: blockOrigin,\n edgeOrigin: grouping.origin,\n nodeRemap: blocks,\n edgeRemap: grouping.remap,\n blockSizes,\n report: { droppedEdges: grouping.dropped, mergedEdges: grouping.merged }\n };\n}\nfunction withColumnsParts(source, nodes, edges, arcToEdge, edgeToArc) {\n return {\n label: source.label,\n serial: source.serial,\n directed: source.directed,\n nodeCount: source.nodeCount,\n edgeCount: source.edgeCount,\n arcCount: source.arcCount,\n selfLoopCount: source.selfLoopCount,\n rowPtr: source.rowPtr,\n colIdx: source.colIdx,\n weights: source.weights,\n arcToEdge,\n edgeToArc,\n flags: source.flags,\n ids: source.ids,\n nodes: tableWithColumns(source.nodes, nodes ?? {}),\n edges: tableWithColumns(source.edges, edges ?? {}),\n graph: source.graph.clone(),\n extensions: source.extensions,\n meta: source.meta,\n arena: source.arena,\n checksum: false\n };\n}\nconst LANE_A_BASIS = 2166136261;\nconst LANE_A_PRIME = 16777619;\nconst LANE_B_BASIS = 3421674724;\nconst LANE_B_MULTIPLIER = 1540483477;\nclass Fnv1aHasher {\n /** Start a fresh hasher at the two offset bases. */\n constructor() {\n this.laneA = LANE_A_BASIS;\n this.laneB = LANE_B_BASIS;\n }\n /**\n * Mix one u32 word (any number is coerced with `>>> 0`).\n * @param word - the word to mix\n * @returns this hasher\n */\n word(word) {\n const w = word >>> 0;\n this.laneA = Math.imul(this.laneA ^ w, LANE_A_PRIME) >>> 0;\n const rotated = (w << 16 | w >>> 16) >>> 0;\n this.laneB = Math.imul(this.laneB ^ rotated, LANE_B_MULTIPLIER) >>> 0;\n return this;\n }\n /**\n * Mix a length prefix followed by every word of a u32 array, so arrays of different lengths with a\n * common prefix hash differently and consecutive arrays cannot be re-split.\n * @param words - the words to mix\n * @returns this hasher\n */\n words(words) {\n this.word(words.length);\n for (let i = 0; i < words.length; i++) {\n this.word(words[i]);\n }\n return this;\n }\n /**\n * Mix the sequence 0..length-1 (an identity permutation) with the same framing as `words()`, without\n * allocating it.\n * @param length - the permutation length\n * @returns this hasher\n */\n identity(length) {\n this.word(length);\n for (let i = 0; i < length; i++) {\n this.word(i);\n }\n return this;\n }\n /**\n * Mix a byte length prefix followed by the bytes of any ArrayBufferView, four bytes per word\n * (little-endian packing, the last word zero-padded). A view whose byte range is 4-byte aligned\n * is read as u32 words directly.\n * @param view - the bytes to mix\n * @returns this hasher\n */\n bytes(view) {\n const { byteLength, byteOffset } = view;\n this.word(byteLength);\n if (byteOffset % 4 === 0 && byteLength % 4 === 0) {\n const words = new Uint32Array(view.buffer, byteOffset, byteLength / 4);\n for (let i2 = 0; i2 < words.length; i2++) {\n this.word(words[i2]);\n }\n return this;\n }\n const bytes = new Uint8Array(view.buffer, byteOffset, byteLength);\n let i = 0;\n for (; i + 4 <= byteLength; i += 4) {\n this.word(bytes[i] | bytes[i + 1] << 8 | bytes[i + 2] << 16 | bytes[i + 3] << 24);\n }\n if (i < byteLength) {\n let tail = 0;\n for (let k = 0; i + k < byteLength; k++) {\n tail |= bytes[i + k] << 8 * k;\n }\n this.word(tail);\n }\n return this;\n }\n /**\n * Mix a JS string as its length followed by its UTF-16 code units.\n * @param text - the string to mix\n * @returns this hasher\n */\n text(text) {\n this.word(text.length);\n for (let i = 0; i < text.length; i++) {\n this.word(text.charCodeAt(i));\n }\n return this;\n }\n /**\n * The 16-character lowercase hex digest: lane A then lane B, each 8 zero-padded characters.\n * @returns the digest\n */\n digest() {\n return this.laneA.toString(16).padStart(8, \"0\") + this.laneB.toString(16).padStart(8, \"0\");\n }\n}\nfunction hashTypedArray(view) {\n return new Fnv1aHasher().bytes(view).digest();\n}\nfunction mixColumn(hasher, column) {\n hasher.text(column.dtype).word(column.length).word(column.nullCount);\n if (column.validity !== null) {\n hasher.words(column.validity);\n } else {\n hasher.word(0);\n }\n const { dtype } = column;\n switch (dtype) {\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\":\n case \"bool\":\n hasher.bytes(column.data);\n break;\n case \"dict\":\n hasher.words(column.codes).word(column.dictionary.length);\n for (const entry of column.dictionary) {\n hasher.text(entry);\n }\n break;\n case \"string\":\n hasher.words(column.offsets).bytes(column.utf8);\n break;\n case \"list\":\n hasher.words(column.offsets);\n mixColumn(hasher, column.child);\n break;\n case \"json\":\n hasher.text(JSON.stringify(column.values));\n break;\n default:\n unsupportedDtype$1(dtype);\n }\n}\nfunction hashColumn(column) {\n if (isColumnDetached(column)) {\n throw new GraphFormatError(\"E_DETACHED\", `column \"${column.meta.name}\" was transferred away`, {\n column: column.meta.name\n });\n }\n const hasher = new Fnv1aHasher();\n mixColumn(hasher, column);\n return hasher.digest();\n}\nfunction contentHashOf(snapshot) {\n const hasher = new Fnv1aHasher();\n hasher.word(snapshot.directed ? 1 : 0).word(snapshot.nodeCount).word(snapshot.edgeCount).word(snapshot.arcCount).word(snapshot.selfLoopCount);\n hasher.words(snapshot.rowPtr).words(snapshot.colIdx);\n if (snapshot.weights === null) {\n hasher.word(0);\n } else {\n hasher.bytes(snapshot.weights);\n }\n if (snapshot.flags.arcToEdgeIsIdentity) {\n hasher.identity(snapshot.arcCount).identity(snapshot.edgeCount);\n } else {\n hasher.words(snapshot.arcToEdge).words(snapshot.edgeToArc);\n }\n return hasher.digest();\n}\nlet nextSerial = 1;\nconst VIEW_NAMES = [\n \"reverse\",\n \"coo\",\n \"edgeList\",\n \"outDegree\",\n \"inDegree\",\n \"degree\",\n \"weightedOutDegree\",\n \"weightedInDegree\",\n \"weightedDegree\",\n \"selfLoopWeight\",\n \"totalWeight\",\n \"selfLoopArcs\",\n \"selfLoopsPerNode\",\n \"mate\",\n \"degreeOrder\",\n \"reverseDegreeOrder\",\n \"symmetric\"\n];\nconst CLONE_GUARD_KEY = \"__graphtyNoStructuredClone\";\nfunction cloneGuard() {\n return void 0;\n}\nconst STATES = /* @__PURE__ */ new WeakMap();\nfunction emptyViewCache() {\n return {\n reverse: null,\n coo: null,\n edgeList: null,\n outDegree: null,\n inDegree: null,\n degree: null,\n weightedOutDegree: null,\n weightedInDegree: null,\n weightedDegree: null,\n selfLoopWeight: null,\n totalWeight: null,\n selfLoopArcs: null,\n selfLoopsPerNode: null,\n mate: null,\n degreeOrder: null,\n reverseDegreeOrder: null,\n symmetric: null\n };\n}\nfunction partsError(invariant, message, details) {\n return new GraphFormatError(\"E_INVALID_SNAPSHOT\", `invariant ${invariant} violated: ${message}`, {\n invariant,\n ...details\n });\n}\nfunction checkParts(parts) {\n const { nodeCount, edgeCount, arcCount, flags } = parts;\n if (parts.rowPtr.length !== nodeCount + 1) {\n throw partsError(\"I1\", `rowPtr has ${parts.rowPtr.length} entries, expected ${nodeCount + 1}`, {\n expected: nodeCount + 1,\n found: parts.rowPtr.length\n });\n }\n if (parts.colIdx.length !== arcCount) {\n throw partsError(\"I1\", `colIdx has ${parts.colIdx.length} entries, expected ${arcCount}`, {\n expected: arcCount,\n found: parts.colIdx.length\n });\n }\n if (parts.weights !== null && parts.weights.length !== arcCount) {\n throw partsError(\"I8\", `weights has ${parts.weights.length} entries, expected ${arcCount}`, {\n expected: arcCount,\n found: parts.weights.length\n });\n }\n const identity = flags.arcToEdgeIsIdentity;\n if (parts.arcToEdge === null !== identity || parts.edgeToArc === null !== identity) {\n throw partsError(\"I9\", \"arcToEdge / edgeToArc must be null exactly when flags.arcToEdgeIsIdentity\", {\n flag: \"arcToEdgeIsIdentity\",\n found: identity\n });\n }\n if (identity && (!parts.directed || arcCount !== edgeCount)) {\n throw partsError(\"I9\", \"flags.arcToEdgeIsIdentity requires a directed snapshot with arcCount === edgeCount\", {\n flag: \"arcToEdgeIsIdentity\",\n directed: parts.directed,\n arcCount,\n edgeCount\n });\n }\n if (parts.arcToEdge !== null && parts.arcToEdge.length !== arcCount) {\n throw partsError(\"I5\", `arcToEdge has ${parts.arcToEdge.length} entries, expected ${arcCount}`, {\n expected: arcCount,\n found: parts.arcToEdge.length\n });\n }\n if (parts.edgeToArc !== null && parts.edgeToArc.length !== edgeCount) {\n throw partsError(\"I5\", `edgeToArc has ${parts.edgeToArc.length} entries, expected ${edgeCount}`, {\n expected: edgeCount,\n found: parts.edgeToArc.length\n });\n }\n if (parts.ids.size !== nodeCount) {\n throw partsError(\"I11\", `ids.size is ${parts.ids.size}, expected ${nodeCount}`, {\n expected: nodeCount,\n found: parts.ids.size\n });\n }\n if (parts.nodes.rowCount !== nodeCount || parts.edges.rowCount !== edgeCount || parts.graph.rowCount !== 1) {\n throw partsError(\"I12\", \"table row counts do not match nodeCount / edgeCount / 1\", {\n nodes: parts.nodes.rowCount,\n edges: parts.edges.rowCount,\n graph: parts.graph.rowCount\n });\n }\n}\nfunction recordColumns(records, table) {\n for (const column of table) {\n if (!column.meta.mutable) {\n records.columns.set(column, hashColumn(column));\n }\n }\n}\nconst _GraphSnapshot = class _GraphSnapshot2 {\n /**\n * Wrap prepared parts. Producers call `createSnapshot()`; the constructor is not part of the public\n * surface. The producer has established I1-I13; the constructor checks the O(1) length rules,\n * records checksums when asked, freezes the object and installs the clone guard.\n * @param parts - the parts (no array may alias memory a builder can still write, invariant I18)\n * @internal\n */\n constructor(parts) {\n checkParts(parts);\n this[SNAPSHOT_BRAND] = true;\n this.serial = parts.serial ?? nextSerial++;\n this.label = parts.label;\n this.formatVersion = FORMAT_VERSION;\n this.directed = parts.directed;\n this.nodeCount = parts.nodeCount;\n this.edgeCount = parts.edgeCount;\n this.arcCount = parts.arcCount;\n this.selfLoopCount = parts.selfLoopCount;\n this.rowPtr = parts.rowPtr;\n this.colIdx = parts.colIdx;\n this.weights = parts.weights;\n this.flags = Object.freeze({ ...parts.flags });\n this.ids = parts.ids;\n this.nodes = parts.nodes;\n this.edges = parts.edges;\n this.graph = parts.graph;\n this.extensions = parts.extensions;\n this.meta = parts.meta;\n this.arena = parts.arena;\n let checksums = null;\n if (parts.checksum) {\n checksums = { core: /* @__PURE__ */ new Map(), columns: /* @__PURE__ */ new WeakMap(), views: /* @__PURE__ */ new Map() };\n checksums.core.set(\"rowPtr\", hashTypedArray(parts.rowPtr));\n checksums.core.set(\"colIdx\", hashTypedArray(parts.colIdx));\n if (parts.weights !== null) {\n checksums.core.set(\"weights\", hashTypedArray(parts.weights));\n }\n if (parts.arcToEdge !== null) {\n checksums.core.set(\"arcToEdge\", hashTypedArray(parts.arcToEdge));\n }\n if (parts.edgeToArc !== null) {\n checksums.core.set(\"edgeToArc\", hashTypedArray(parts.edgeToArc));\n }\n recordColumns(checksums, parts.nodes);\n recordColumns(checksums, parts.edges);\n recordColumns(checksums, parts.graph);\n for (const table of parts.extensions.values()) {\n recordColumns(checksums, table);\n }\n }\n const state = {\n arcToEdge: parts.arcToEdge,\n edgeToArc: parts.edgeToArc,\n views: emptyViewCache(),\n checksums,\n contentHash: null,\n edgeIds: null\n };\n Object.defineProperty(this, \"state\", { value: state, enumerable: false, writable: false, configurable: false });\n STATES.set(this, state);\n claimStorage(parts);\n Object.defineProperty(this, CLONE_GUARD_KEY, {\n value: cloneGuard,\n enumerable: true,\n writable: false,\n configurable: false\n });\n Object.freeze(this);\n }\n // ---------------------------------------------------------------- core accessors\n /**\n * rowPtr.length === 0: the core buffer was transferred away (design section 9.4). Derived from the\n * array state, never a stored bit, so every holder of the same core agrees.\n * @returns true when detached\n */\n get detached() {\n return this.rowPtr.length === 0;\n }\n /**\n * Logical edge of every arc (invariant I5); an identity permutation is materialised on first\n * access as a separate 4-byte-aligned array outside the arena. GPU code tests\n * `flags.arcToEdgeIsIdentity` before reading it.\n * @returns arcCount entries; E_DETACHED after a consuming transfer\n */\n get arcToEdge() {\n this.assertAttached();\n const { state } = this;\n if (state.arcToEdge === null) {\n state.arcToEdge = identityPermutation(this.arcCount);\n state.checksums?.core.set(\"arcToEdge\", hashTypedArray(state.arcToEdge));\n }\n return state.arcToEdge;\n }\n /**\n * The arc holding the declared orientation of every logical edge (invariant I5); an identity\n * permutation is materialised on first access outside the arena.\n * @returns edgeCount entries; E_DETACHED after a consuming transfer\n */\n get edgeToArc() {\n this.assertAttached();\n const { state } = this;\n if (state.edgeToArc === null) {\n state.edgeToArc = identityPermutation(this.edgeCount);\n state.checksums?.core.set(\"edgeToArc\", hashTypedArray(state.edgeToArc));\n }\n return state.edgeToArc;\n }\n // ---------------------------------------------------------------- queries (3.9)\n /**\n * The out-arc range of a node: [rowPtr[u], rowPtr[u + 1]]. Allocates a tuple; hot loops read\n * rowPtr directly.\n * @param u - the node index\n * @returns the half-open arc range as [start, end]\n */\n outArcs(u) {\n this.assertAttached();\n return [this.rowPtr[u], this.rowPtr[u + 1]];\n }\n /**\n * rowPtr[u + 1] - rowPtr[u]: the out-arc count (a self-loop counted once).\n * @param u - the node index\n * @returns the out-degree\n */\n outDegreeOf(u) {\n this.assertAttached();\n return this.rowPtr[u + 1] - this.rowPtr[u];\n }\n /**\n * Binary search for the first arc u -> v (the lowest logical edge index among parallels).\n * @param u - the source node index\n * @param v - the target node index\n * @returns the arc index, or INVALID_INDEX when absent\n */\n findArc(u, v) {\n this.assertAttached();\n return findArcIn(this.rowPtr, this.colIdx, u, v);\n }\n /**\n * Whether an arc u -> v exists.\n * @param u - the source node index\n * @param v - the target node index\n * @returns findArc(u, v) !== INVALID_INDEX\n */\n hasArc(u, v) {\n return this.findArc(u, v) !== INVALID_INDEX;\n }\n /**\n * The half-open arc range [lo, hi) of every arc u -> v; empty when lo === hi. Allocates a tuple.\n * @param u - the source node index\n * @param v - the target node index\n * @returns the range as [lo, hi]\n */\n arcsBetween(u, v) {\n this.assertAttached();\n return arcRangeIn(this.rowPtr, this.colIdx, u, v);\n }\n /**\n * Number of parallel arcs u -> v.\n * @param u - the source node index\n * @param v - the target node index\n * @returns hi - lo of arcsBetween(u, v)\n */\n multiplicity(u, v) {\n this.assertAttached();\n return multiplicityIn(this.rowPtr, this.colIdx, u, v);\n }\n /**\n * The row containing an arc: O(1) through the cached coo() view, else a binary search on rowPtr.\n * @param a - the arc index\n * @returns the source node index\n */\n arcSource(a) {\n this.assertAttached();\n const { coo } = this.state.views;\n if (coo !== null) {\n return coo.src[a];\n }\n return arcSourceIn(this.rowPtr, a);\n }\n /**\n * Declared source of a logical edge: arcSource(edgeToArc[e]).\n * @param e - the logical edge index\n * @returns the source node index\n */\n edgeSource(e) {\n this.assertAttached();\n const list = this.state.views.edgeList;\n if (list !== null) {\n return list.src[e];\n }\n return this.arcSource(this.edgeToArc[e]);\n }\n /**\n * Declared target of a logical edge: colIdx[edgeToArc[e]].\n * @param e - the logical edge index\n * @returns the target node index\n */\n edgeTarget(e) {\n return this.colIdx[this.edgeToArc[e]];\n }\n /**\n * Lookup through the role \"id\" edge column, backed by a Map built on first call and rebuilt when the\n * column is replaced or a mutable id column's version changes (design section 4.6).\n * @param id - the edge id\n * @returns the logical edge index, or INVALID_INDEX on a miss or when no id column exists\n */\n edgeIndexOf(id) {\n const { state } = this;\n const version = columnSetVersion(this.edges);\n if (state.edgeIds === null || state.edgeIds.version !== version) {\n const column = this.edges.byRole(\"id\");\n state.edgeIds = { version, column, index: column === null ? null : new EdgeIdIndex(column) };\n }\n return state.edgeIds.index === null ? INVALID_INDEX : state.edgeIds.index.indexOf(id);\n }\n // ---------------------------------------------------------------- views (7.2)\n /**\n * The in-adjacency, rows sorted by source; the forward arrays themselves when undirected. Cached\n * and shared.\n * @returns the reverse view\n */\n reverse() {\n return this.cached(\"reverse\", () => computeReverse(this));\n }\n /**\n * Per-arc COO form; src is the only new array. Cached and shared.\n * @returns the COO view\n */\n coo() {\n return this.cached(\"coo\", () => computeCoo(this));\n }\n /**\n * Every logical edge once in declared orientation. Cached and shared.\n * @returns the edge list view\n */\n edgeList() {\n return this.cached(\"edgeList\", () => computeEdgeList(this));\n }\n /**\n * rowPtr differences materialised; a self-loop counted once. Cached and shared: call `.slice()`\n * before writing.\n * @returns Uint32Array(n)\n */\n outDegree() {\n return this.cached(\"outDegree\", () => rowLengths(this.rowPtr, this.nodeCount));\n }\n /**\n * Arcs targeting each node, via reverse().rowPtr; the same object as outDegree() when undirected.\n * Cached and shared: call `.slice()` before writing.\n * @returns Uint32Array(n)\n */\n inDegree() {\n return this.cached(\n \"inDegree\",\n () => this.directed ? rowLengths(this.reverse().rowPtr, this.nodeCount) : this.outDegree()\n );\n }\n /**\n * Graph-theoretic degree (NetworkX convention, design section 3.4): in + out when directed; out\n * plus self-loops when undirected. Cached and shared: call `.slice()` before writing.\n * @returns Uint32Array(n)\n */\n degree() {\n return this.cached(\n \"degree\",\n () => sumDegrees(this.outDegree(), this.directed ? this.inDegree() : this.selfLoopsPerNode())\n );\n }\n /**\n * Row sums of weights (a self-loop arc counted once); outDegree widened when unweighted. F64 for\n * CPU precision; may be 0 for a node with out-arcs. Cached and shared: call `.slice()` before\n * writing.\n * @returns Float64Array(n)\n */\n weightedOutDegree() {\n return this.cached(\n \"weightedOutDegree\",\n () => this.weights === null ? widenToF64(this.outDegree()) : rowWeightSums(this.rowPtr, this.weights, this.nodeCount)\n );\n }\n /**\n * Weight sums over incoming arcs; the same object as weightedOutDegree() when undirected. Cached\n * and shared: call `.slice()` before writing.\n * @returns Float64Array(n)\n */\n weightedInDegree() {\n return this.cached(\"weightedInDegree\", () => {\n if (!this.directed) {\n return this.weightedOutDegree();\n }\n const reverse = this.reverse();\n return reverse.weights === null ? widenToF64(this.inDegree()) : rowWeightSums(reverse.rowPtr, reverse.weights, this.nodeCount);\n });\n }\n /**\n * NetworkX weighted degree: weightedOutDegree + (directed ? weightedInDegree : selfLoopWeight), so\n * the sum is 2 * totalWeight() when undirected. Cached and shared: call `.slice()` before writing.\n * @returns Float64Array(n)\n */\n weightedDegree() {\n return this.cached(\n \"weightedDegree\",\n () => sumF64(this.weightedOutDegree(), this.directed ? this.weightedInDegree() : this.selfLoopWeight())\n );\n }\n /**\n * Sum of weights over each node's self-loop arcs (selfLoopsPerNode widened when unweighted).\n * Cached and shared: call `.slice()` before writing.\n * @returns Float64Array(n)\n */\n selfLoopWeight() {\n return this.cached(\n \"selfLoopWeight\",\n () => computeSelfLoopWeight(this, {\n selfLoopArcs: this.selfLoopArcs(),\n selfLoopsPerNode: this.selfLoopsPerNode()\n })\n );\n }\n /**\n * Sum of weights over logical edges (each undirected edge once). Cached.\n * @returns the total weight\n */\n totalWeight() {\n return this.cached(\"totalWeight\", () => computeTotalWeight(this));\n }\n /**\n * The arcs a with colIdx[a] === row(a), found by binary search per row. Cached and shared: call\n * `.slice()` before writing.\n * @returns Uint32Array(selfLoopCount)\n */\n selfLoopArcs() {\n return this.cached(\"selfLoopArcs\", () => this.materialiseSelfLoops().selfLoopArcs);\n }\n /**\n * Self-loop arcs per node. Cached and shared: call `.slice()` before writing.\n * @returns Uint32Array(n)\n */\n selfLoopsPerNode() {\n return this.cached(\"selfLoopsPerNode\", () => this.materialiseSelfLoops().selfLoopsPerNode);\n }\n /**\n * Point query: self-loop arcs at one node, O(log d).\n * @param u - the node index\n * @returns the count\n */\n selfLoopsAt(u) {\n this.assertAttached();\n return selfLoopsAtIn(this.rowPtr, this.colIdx, u);\n }\n /**\n * For every arc, the arc storing the opposite orientation of the same edge (a self-loop maps to\n * itself); the lockstep walk of design section 6.4. Undirected only. Cached and shared: call\n * `.slice()` before writing.\n * @returns Uint32Array(arcCount); E_DIRECTED on a directed snapshot\n */\n mate() {\n return this.cached(\"mate\", () => computeMate(this));\n }\n /**\n * Nodes ordered by descending out-degree of the forward or reverse adjacency with the cuGraph tier\n * boundaries. Both variants cached; on an undirected snapshot they are the same object.\n * @param options - which adjacency's degree to order by\n * @returns the permutation and its tier offsets\n */\n degreeOrder(options) {\n const of = assertOneOf(\"of\", options?.of, [\"forward\", \"reverse\"]) ?? \"forward\";\n if (of === \"reverse\" && this.directed) {\n return this.cached(\"reverseDegreeOrder\", () => computeDegreeOrder(this.reverse().rowPtr, this.nodeCount));\n }\n const forward = this.cached(\"degreeOrder\", () => computeDegreeOrder(this.rowPtr, this.nodeCount));\n if (!this.directed) {\n this.state.views.reverseDegreeOrder = forward;\n }\n return forward;\n }\n /**\n * Whether the arc set is closed under reversal with equal weights (forward row v equals reverse row\n * v for every v); true without work when undirected. Cached.\n * @returns true when symmetric\n */\n isSymmetric() {\n return this.cached(\"symmetric\", () => this.directed ? computeSymmetric(this, this.reverse()) : true);\n }\n /**\n * Compute a set of views eagerly (inside freeze() through FreezeOptions.prepare, or off the critical\n * path).\n * @param views - the views to materialise\n * @returns this snapshot\n */\n prepare(views) {\n for (const name of views) {\n this.materialiseView(name);\n }\n return this;\n }\n /**\n * Release every cached view (and every identity permutation materialised on demand) and every\n * cached `gpuView()` f32 copy of an f64 column (design section 7.2); they are recomputed on\n * demand. The checksum records of the dropped views are dropped with them.\n */\n dropCaches() {\n const { state } = this;\n for (const name of VIEW_NAMES) {\n state.views[name] = null;\n }\n state.checksums?.views.clear();\n if (this.flags.arcToEdgeIsIdentity) {\n state.arcToEdge = null;\n state.edgeToArc = null;\n state.checksums?.core.delete(\"arcToEdge\");\n state.checksums?.core.delete(\"edgeToArc\");\n }\n for (const table of [this.nodes, this.edges, this.graph, ...this.extensions.values()]) {\n for (const column of table) {\n dropGpuViewCache(column);\n }\n }\n }\n /**\n * Which views are resident.\n * @returns the names of the cached views, in the fixed ViewName order\n */\n cachedViews() {\n if (this.detached) {\n this.dropCaches();\n return [];\n }\n const { views } = this.state;\n return VIEW_NAMES.filter((name) => views[name] !== null);\n }\n // ---------------------------------------------------------------- derived graphs (7.3)\n /**\n * Every directed edge becomes undirected; reciprocal pairs collapse to one edge keeping the lower\n * index's row (keep-first). Returns `{ snapshot: this, null maps }` on an undirected snapshot.\n * @param options - reciprocal filtering and the weight reducer\n * @returns the derived graph\n */\n toUndirected(options) {\n this.assertAttached();\n if (!this.directed) {\n return this.wrapDerived(identityDerived());\n }\n return this.wrapDerived(deriveToUndirected(this, this.edgeEndpoints(), options));\n }\n /**\n * Orientation of every edge swapped: the reverse view's arrays become the core. Returns this on an\n * undirected snapshot.\n * @returns the derived graph (same node and edge spaces)\n */\n transpose() {\n this.assertAttached();\n if (!this.directed) {\n return this.wrapDerived(identityDerived());\n }\n return this.wrapDerived(deriveTranspose(this, this.reverse()));\n }\n /**\n * One edge per (u, v) group (parallels are adjacent by invariant I4), survivor = lowest index;\n * flags.multigraph is false afterwards.\n * @param options - reducers and self-loop policy\n * @returns the derived graph\n */\n simplified(options) {\n this.assertAttached();\n return this.wrapDerived(deriveSimplified(this, this.edgeEndpoints(), options));\n }\n /**\n * Every edge with source !== target.\n * @returns the derived graph\n */\n withoutSelfLoops() {\n this.assertAttached();\n return this.wrapDerived(deriveWithoutSelfLoops(this, this.edgeEndpoints()));\n }\n /**\n * Keep the logical edges whose mask bit is set.\n * @param keep - packed bitmap over logical edges; E_MASK_LENGTH when shorter than ceil(edgeCount / 32) words\n * @returns the derived graph\n */\n filterEdges(keep) {\n this.assertAttached();\n return this.wrapDerived(deriveFilterEdges(this, this.edgeEndpoints(), keep));\n }\n /**\n * The subgraph induced by a node selection: an index list (order = new index order; E_INDEX_RANGE\n * for an out-of-range or repeated index) or a packed mask (ascending order; E_MASK_LENGTH when\n * short). Edges with both endpoints kept.\n * @param selection - the node indices or a mask\n * @returns the derived graph\n */\n inducedSubgraph(selection) {\n this.assertAttached();\n return this.wrapDerived(deriveInducedSubgraph(this, this.edgeEndpoints(), selection));\n }\n /**\n * Contract the nodes of each partition block into one node (design section 7.3).\n * @param partition - one label per node; E_PARTITION for a wrong length or an INVALID_INDEX label\n * @param options - weight reducer, self-loop and parallel policies, column reducers\n * @returns the derived graph with blockSizes and an identity id map\n */\n contract(partition, options) {\n this.assertAttached();\n return this.wrapDerived(deriveContract(this, this.edgeEndpoints(), partition, options));\n }\n /**\n * Permute the node space: perm[newIndex] = oldIndex; the id map follows; edge order is preserved.\n * @param perm - a permutation of 0..n-1; E_INVALID_PERMUTATION otherwise\n * @returns the derived graph\n */\n relabel(perm) {\n this.assertAttached();\n return this.wrapDerived(deriveRelabel(this, this.edgeEndpoints(), perm));\n }\n /**\n * A new snapshot object sharing the core, the id map and the serial with a CLONED column set plus\n * the given columns (the only operation that clones the column set).\n * @param nodes - node columns to add, keyed by name\n * @param edges - edge columns to add, keyed by name\n * @returns the new snapshot\n */\n withColumns(nodes, edges) {\n this.assertAttached();\n const identity = this.flags.arcToEdgeIsIdentity;\n const parts = withColumnsParts(\n this,\n nodes,\n edges,\n identity ? null : this.arcToEdge,\n identity ? null : this.edgeToArc\n );\n return new _GraphSnapshot2({ ...parts, checksum: this.state.checksums !== null });\n }\n // ---------------------------------------------------------------- memory, transfer, checks (9, 11)\n /**\n * Resident bytes of the core (an identity permutation counts zero even when materialised), plus\n * the side structures selected by the options.\n * @param options - which side structures to include\n * @returns the byte count\n */\n byteLength(options = {}) {\n let bytes = this.rowPtr.byteLength + this.colIdx.byteLength;\n if (this.weights !== null) {\n bytes += this.weights.byteLength;\n }\n if (!this.flags.arcToEdgeIsIdentity) {\n bytes += this.arcToEdge.byteLength + this.edgeToArc.byteLength;\n }\n if (options.views === true) {\n const { views } = this.state;\n for (const name of VIEW_NAMES) {\n const value = views[name];\n if (value !== null && !(name === \"reverseDegreeOrder\" && value === views.degreeOrder)) {\n bytes += viewByteLength(this, name, value);\n }\n }\n }\n if (options.columns === true) {\n for (const table of [this.nodes, this.edges, this.graph, ...this.extensions.values()]) {\n for (const column of table) {\n bytes += column.byteLength;\n }\n }\n }\n if (options.ids === true) {\n bytes += this.ids.byteLength();\n }\n return bytes;\n }\n /**\n * A 64-bit content hash of the core arrays (two 32-bit FNV-1a lanes) as 16 hex characters,\n * computed lazily and cached (design section 9.3).\n * @returns the hash\n */\n contentHash() {\n this.assertAttached();\n const { state } = this;\n state.contentHash ??= contentHashOf(this);\n return state.contentHash;\n }\n /**\n * The distinct, exclusively owned backing buffers: the postMessage transfer list (design section\n * 9.1). Buffers shared with another holder (a withColumns() sibling, a derived graph sharing the\n * node table) are excluded.\n * @returns the buffers\n */\n transferables() {\n this.assertAttached();\n return transferables(this);\n }\n /**\n * The plain-object wire form (design section 9.1): a JSON-serialisable manifest plus the backing\n * buffers. With `transfer: true` only exclusively owned buffers are listed as transferables and\n * shared ones are copied.\n * @param options - transfer mode, views and columns to include\n * @returns the wire snapshot\n */\n toWire(options) {\n this.assertAttached();\n return toWire(this, options);\n }\n /**\n * The GSNP byte container as one contiguous buffer (design section 9.2).\n * @param options - views to include\n * @returns the container bytes\n */\n toBytes(options) {\n this.assertAttached();\n return toBytes(this, options);\n }\n /**\n * The GSNP container as a sequence of chunks (design section 9.2): the header plus manifest,\n * then one chunk per non-empty segment.\n * @param options - views to include\n * @returns the chunks\n */\n toByteChunks(options) {\n this.assertAttached();\n return toByteChunks(this, options);\n }\n /**\n * Check the invariants (design section 11.4): the recorded checksums first when `checksum` is set\n * (a mutated frozen array is the most useful diagnosis, details.reason \"checksum\"; \"no-checksum\"\n * when none were recorded), then \"structure\" or \"full\" (default) per the level table of design\n * section 9.5. Throws E_INVALID_SNAPSHOT with details.invariant and the location on the first\n * violation.\n * @param options - level and checksum comparison\n */\n validate(options = {}) {\n this.assertAttached();\n const level = assertOneOf(\"level\", options.level, [\"structure\", \"full\"]) ?? \"full\";\n if (typeof options.checksum !== \"boolean\" && options.checksum !== void 0) {\n throw new GraphFormatError(\"E_UNSUPPORTED\", \"validate option checksum must be a boolean\", {\n field: \"checksum\",\n found: options.checksum,\n reason: \"unsupported option\"\n });\n }\n if (idMapDetached(this.ids)) {\n throw new GraphFormatError(\"E_DETACHED\", \"the id map's storage was transferred away\", {\n serial: this.serial\n });\n }\n for (const table of [this.nodes, this.edges, this.graph, ...this.extensions.values()]) {\n for (const column of table) {\n if (isColumnDetached(column)) {\n throw new GraphFormatError(\"E_DETACHED\", `column \"${column.meta.name}\" was transferred away`, {\n column: column.meta.name,\n serial: this.serial\n });\n }\n }\n }\n if (options.checksum === true) {\n this.verifyChecksums();\n }\n if (level === \"structure\") {\n validateStructure(this);\n } else {\n validateFull(this);\n }\n }\n // ---------------------------------------------------------------- private helpers\n /**\n * Throw E_DETACHED when the core was transferred away.\n */\n assertAttached() {\n if (this.rowPtr.length === 0) {\n throw new GraphFormatError(\"E_DETACHED\", \"the snapshot's core buffer was transferred away\", {\n serial: this.serial\n });\n }\n }\n /**\n * Return the cached value of a view, computing and recording it on first use.\n * @param name - the view name\n * @param compute - the computation\n * @returns the cached value\n */\n cached(name, compute) {\n this.assertAttached();\n const { views } = this.state;\n const existing = views[name];\n if (existing !== null) {\n return existing;\n }\n const value = compute();\n views[name] = value;\n this.recordView(name, value);\n return value;\n }\n /**\n * Compute both self-loop views in one pass and seed the slot the caller did not ask for.\n * @returns the two views\n */\n materialiseSelfLoops() {\n const loops = computeSelfLoops(this);\n const { views } = this.state;\n if (views.selfLoopArcs === null) {\n views.selfLoopArcs = loops.selfLoopArcs;\n this.recordView(\"selfLoopArcs\", loops.selfLoopArcs);\n }\n if (views.selfLoopsPerNode === null) {\n views.selfLoopsPerNode = loops.selfLoopsPerNode;\n this.recordView(\"selfLoopsPerNode\", loops.selfLoopsPerNode);\n }\n return { selfLoopArcs: views.selfLoopArcs, selfLoopsPerNode: views.selfLoopsPerNode };\n }\n /**\n * Record the digests of a freshly materialised view when checksums are on.\n * @param name - the view name\n * @param value - the view\n */\n recordView(name, value) {\n recordViewDigests(this, this.state, name, value);\n }\n /**\n * Compare every recorded checksum with the current bytes (design section 5.8).\n */\n verifyChecksums() {\n const records = this.state.checksums;\n if (records === null) {\n throw new GraphFormatError(\"E_INVALID_SNAPSHOT\", \"no checksums were recorded for this snapshot\", {\n reason: \"no-checksum\"\n });\n }\n const mismatch = (what, details) => new GraphFormatError(\"E_INVALID_SNAPSHOT\", `checksum mismatch: ${what} was modified after freeze`, {\n reason: \"checksum\",\n ...details\n });\n const { state } = this;\n const core = [\n [\"rowPtr\", this.rowPtr],\n [\"colIdx\", this.colIdx],\n [\"weights\", this.weights],\n [\"arcToEdge\", state.arcToEdge],\n [\"edgeToArc\", state.edgeToArc]\n ];\n for (const [name, array] of core) {\n const recorded = records.core.get(name);\n if (recorded !== void 0 && array !== null && hashTypedArray(array) !== recorded) {\n throw mismatch(`core array ${name}`, { array: name });\n }\n }\n const tables = [\n [\"nodes\", this.nodes],\n [\"edges\", this.edges],\n [\"graph\", this.graph],\n ...[...this.extensions].map(([name, table]) => [`extensions[${name}]`, table])\n ];\n for (const [tableName, table] of tables) {\n for (const column of table) {\n const recorded = records.columns.get(column);\n if (recorded !== void 0 && hashColumn(column) !== recorded) {\n throw mismatch(`column \"${column.meta.name}\" of ${tableName}`, {\n table: tableName,\n column: column.meta.name\n });\n }\n }\n }\n for (const name of VIEW_NAMES) {\n const value = state.views[name];\n if (value === null) {\n continue;\n }\n for (const [member, array] of Object.entries(viewArrays(this, name, value))) {\n const recorded = records.views.get(`${name}.${member}`);\n if (recorded !== void 0 && hashTypedArray(array) !== recorded) {\n throw mismatch(`view ${name}.${member}`, { view: name, member });\n }\n }\n }\n }\n /**\n * The edge endpoints in declared orientation for the derived-graph functions: the cached edge list\n * when resident, else a fresh one that is NOT cached (derived graphs must not grow the source's\n * resident size, design section 7.3).\n * @returns an edge list view\n */\n edgeEndpoints() {\n return this.state.views.edgeList ?? computeEdgeList(this);\n }\n /**\n * Wrap derived parts into a DerivedGraph, creating the new snapshot (with this snapshot's checksum\n * setting) or returning this for the identity cases.\n * @param derived - the derived parts\n * @returns the derived graph\n */\n wrapDerived(derived) {\n const snapshot = derived.parts === null ? this : new _GraphSnapshot2({ ...derived.parts, checksum: this.state.checksums !== null });\n return {\n snapshot,\n nodeOrigin: derived.nodeOrigin,\n edgeOrigin: derived.edgeOrigin,\n nodeRemap: derived.nodeRemap,\n edgeRemap: derived.edgeRemap,\n blockSizes: derived.blockSizes,\n report: derived.report\n };\n }\n /**\n * Materialise one named view (the prepare() dispatch).\n * @param name - the view name\n */\n materialiseView(name) {\n switch (name) {\n case \"reverse\":\n this.reverse();\n break;\n case \"coo\":\n this.coo();\n break;\n case \"edgeList\":\n this.edgeList();\n break;\n case \"outDegree\":\n this.outDegree();\n break;\n case \"inDegree\":\n this.inDegree();\n break;\n case \"degree\":\n this.degree();\n break;\n case \"weightedOutDegree\":\n this.weightedOutDegree();\n break;\n case \"weightedInDegree\":\n this.weightedInDegree();\n break;\n case \"weightedDegree\":\n this.weightedDegree();\n break;\n case \"selfLoopWeight\":\n this.selfLoopWeight();\n break;\n case \"totalWeight\":\n this.totalWeight();\n break;\n case \"selfLoopArcs\":\n this.selfLoopArcs();\n break;\n case \"selfLoopsPerNode\":\n this.selfLoopsPerNode();\n break;\n case \"mate\":\n this.mate();\n break;\n case \"degreeOrder\":\n this.degreeOrder();\n break;\n case \"reverseDegreeOrder\":\n this.degreeOrder({ of: \"reverse\" });\n break;\n case \"symmetric\":\n this.isSymmetric();\n break;\n default: {\n const unknown = name;\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown view ${String(unknown)}`, { view: unknown });\n }\n }\n }\n};\nlet GraphSnapshot = _GraphSnapshot;\nfunction claimStorage(parts) {\n const buffers = /* @__PURE__ */ new Set([parts.rowPtr.buffer, parts.colIdx.buffer]);\n if (parts.weights !== null) {\n buffers.add(parts.weights.buffer);\n }\n if (parts.arcToEdge !== null) {\n buffers.add(parts.arcToEdge.buffer);\n }\n if (parts.edgeToArc !== null) {\n buffers.add(parts.edgeToArc.buffer);\n }\n for (const buffer of idMapBuffers(parts.ids)) {\n buffers.add(buffer);\n }\n for (const buffer of buffers) {\n claimHolder(buffer);\n }\n claimHolder(parts.ids);\n claimHolder(parts.nodes);\n claimHolder(parts.edges);\n claimHolder(parts.graph);\n for (const table of parts.extensions.values()) {\n claimHolder(table);\n }\n}\nfunction createSnapshot(parts) {\n return new GraphSnapshot(parts);\n}\nfunction isGraphSnapshot(x) {\n if (typeof x !== \"object\" || x === null) {\n return false;\n }\n const candidate = x;\n return candidate[SNAPSHOT_BRAND] === true && candidate.formatVersion === FORMAT_VERSION;\n}\nfunction sameElements(a, b) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\nfunction equalsTopology(a, b) {\n if (a.directed !== b.directed || a.nodeCount !== b.nodeCount || a.edgeCount !== b.edgeCount || a.arcCount !== b.arcCount || a.selfLoopCount !== b.selfLoopCount) {\n return false;\n }\n if (!sameElements(a.rowPtr, b.rowPtr) || !sameElements(a.colIdx, b.colIdx)) {\n return false;\n }\n if (a.weights === null !== (b.weights === null)) {\n return false;\n }\n if (a.weights !== null && b.weights !== null && !sameElements(a.weights, b.weights)) {\n return false;\n }\n const identityA = a.flags.arcToEdgeIsIdentity;\n const identityB = b.flags.arcToEdgeIsIdentity;\n if (!identityA || !identityB) {\n if (!sameElements(a.arcToEdge, b.arcToEdge) || !sameElements(a.edgeToArc, b.edgeToArc)) {\n return false;\n }\n }\n if (a.ids.size !== b.ids.size) {\n return false;\n }\n for (let i = 0; i < a.nodeCount; i++) {\n const idA = a.ids.idOf(i);\n const idB = b.ids.idOf(i);\n if (idA !== idB && !(typeof idA === \"number\" && typeof idB === \"number\" && Number.isNaN(idA) && Number.isNaN(idB))) {\n return false;\n }\n }\n return true;\n}\nfunction recordViewDigests(snapshot, state, name, value) {\n const records = state.checksums;\n if (records === null) {\n return;\n }\n for (const [member, array] of Object.entries(viewArrays(snapshot, name, value))) {\n records.views.set(`${name}.${member}`, hashTypedArray(array));\n }\n}\nfunction seedView(snapshot, name, value) {\n const state = STATES.get(snapshot);\n if (state === void 0 || state.views[name] !== null) {\n return false;\n }\n state.views[name] = value;\n recordViewDigests(snapshot, state, name, value);\n return true;\n}\nfunction peekView(snapshot, name) {\n const state = STATES.get(snapshot);\n if (state === void 0) {\n return null;\n }\n return state.views[name];\n}\nconst DUPLICATE_POLICIES = /* @__PURE__ */ new Set([\"keep\", \"error\", \"first\", \"last\", \"sum\", \"min\", \"max\"]);\nfunction assertDuplicatePolicy(field, value, error) {\n if (typeof value !== \"string\" || !DUPLICATE_POLICIES.has(value)) {\n throw error(field, value);\n }\n return value;\n}\nconst WEIGHT_COLUMN_NAME = \"graphty.weight\";\nfunction now() {\n return performance.now();\n}\nfunction checkSelfLoops(staging) {\n if (staging.selfLoopCount === 0) {\n return;\n }\n const bound = staging.edgeBound;\n for (let e = 0; e < bound; e++) {\n if (staging.edgeAlive.get(e) && staging.src.get(e) === staging.dst.get(e)) {\n const node = staging.src.get(e);\n throw new GraphFormatError(\"E_SELF_LOOP\", `edge ${e} is a self-loop at node ${node}`, { edge: e, node });\n }\n }\n}\nfunction liveNonLoopBits(staging) {\n const keep = staging.edgeAlive.view().slice();\n const src = staging.src.view();\n const dst = staging.dst.view();\n const bound = staging.edgeBound;\n for (let e = 0; e < bound; e++) {\n if (src[e] === dst[e] && bitmapGet(keep, e)) {\n bitmapClear(keep, e);\n }\n }\n return keep;\n}\nfunction sortInputOf(staging, directed) {\n const edgeCount = staging.edgeBound;\n return {\n directed,\n nodeCount: staging.nodeBound,\n edgeCount,\n src: staging.src.view(),\n dst: staging.dst.view(),\n weights: staging.weight === null ? null : staging.weight.view()\n };\n}\nfunction walkDuplicates(sorted, staging, directed, policy, countMultiplicity, builderIndex) {\n const { rowPtr, colIdx, arcToEdge } = sorted.core;\n const nodeCount = staging.nodeBound;\n const edgeCount = staging.edgeBound;\n const weights = staging.weight === null ? null : staging.weight.view();\n const survivorOf = new Uint32Array(edgeCount);\n for (let e = 0; e < edgeCount; e++) {\n survivorOf[e] = e;\n }\n let reduced = null;\n let stored = null;\n let explicit = null;\n let merged = 0;\n const group = [];\n for (let u = 0; u < nodeCount; u++) {\n const end = rowPtr[u + 1];\n let a = rowPtr[u];\n while (a < end) {\n const v = colIdx[a];\n let b = a + 1;\n while (b < end && colIdx[b] === v) {\n b++;\n }\n if (b - a > 1 && (directed || v >= u)) {\n group.length = 0;\n for (let k = a; k < b; k++) {\n group.push(arcToEdge === null ? k : arcToEdge[k]);\n }\n if (policy === \"error\") {\n const edges = [builderIndex(group[0]), builderIndex(group[1])];\n throw new GraphFormatError(\n \"E_DUPLICATE_EDGE\",\n `edges ${edges[0]} and ${edges[1]} both connect ${u} -> ${v}`,\n { source: u, target: v, edges }\n );\n }\n const survivor = policy === \"last\" ? group[group.length - 1] : group[0];\n let value = null;\n if (policy === \"sum\" || policy === \"min\" || policy === \"max\") {\n value = reduceGroup(weights, group, policy, countMultiplicity);\n if (value !== null && Number.isNaN(value)) {\n const edges = group.map(builderIndex);\n throw new GraphFormatError(\n \"E_INVALID_WEIGHT\",\n `duplicateEdges \"${policy}\" over edges ${edges.join(\", \")} (${u} -> ${v}) yields NaN`,\n { source: u, target: v, edges, policy, reason: \"reducer\" }\n );\n }\n }\n if (value !== null) {\n reduced ??= new Float64Array(edgeCount);\n stored ??= new Uint32Array(bitmapWordCount(edgeCount));\n reduced[survivor] = value;\n bitmapSet(stored, survivor);\n }\n let anyExplicit = value !== null;\n for (let i = 0; i < group.length && !anyExplicit; i++) {\n anyExplicit = staging.weightExplicit(group[i]);\n }\n if (anyExplicit && !staging.weightExplicit(survivor)) {\n explicit ??= new Uint32Array(bitmapWordCount(edgeCount));\n bitmapSet(explicit, survivor);\n }\n for (const e of group) {\n if (e !== survivor) {\n survivorOf[e] = survivor;\n merged++;\n }\n }\n }\n a = b;\n }\n }\n return merged === 0 ? null : { survivorOf, reduced, stored, explicit, merged };\n}\nfunction reduceGroup(weights, group, policy, countMultiplicity) {\n if (weights === null) {\n return policy === \"sum\" && countMultiplicity ? group.length : null;\n }\n let value = weights[group[0]];\n for (let i = 1; i < group.length; i++) {\n const w = weights[group[i]];\n switch (policy) {\n case \"sum\":\n value += w;\n break;\n case \"min\":\n value = Math.min(value, w);\n break;\n case \"max\":\n value = Math.max(value, w);\n break;\n default: {\n const name = policy;\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown reducer ${name}`, { policy: name });\n }\n }\n }\n return value;\n}\nfunction weightShadowColumn(staging, edgeCount, weightDtype) {\n const { weight } = staging;\n if (weight === null || edgeCount === 0) {\n return null;\n }\n const values = weight.view();\n let inexact = false;\n if (weightDtype === \"f64\") {\n for (let e = 0; e < edgeCount; e++) {\n const w = values[e];\n if (Math.fround(w) !== w) {\n inexact = true;\n break;\n }\n }\n }\n const needValidity = staging.weightSet !== null || staging.weightMode === \"omitted\";\n if (!inexact && !needValidity) {\n return null;\n }\n const dtype = inexact ? \"f64\" : \"f32\";\n const meta = resolveColumnMeta(WEIGHT_COLUMN_NAME, \"edge\", { dtype, role: \"weight\", nullable: needValidity });\n const data = dtype === \"f64\" ? new Float64Array(edgeCount) : new Float32Array(edgeCount);\n data.set(values.subarray(0, edgeCount));\n let validity = null;\n if (needValidity) {\n validity = new Uint32Array(bitmapWordCount(edgeCount));\n for (let e = 0; e < edgeCount; e++) {\n if (staging.weightExplicit(e)) {\n bitmapSet(validity, e);\n }\n }\n }\n return createColumn({ ...emptyParts(meta, edgeCount, validity), data });\n}\nfunction idMapOf$1(staging, nodeCount) {\n if (staging.ids === null || staging.idToIndex === null) {\n return identityNodeIdMap(nodeCount);\n }\n return nodeIdMapFromIds(staging.ids, nodeCount, { map: staging.idToIndex });\n}\nfunction tableOf$1(domain, rowCount, columns, extra = []) {\n const frozen = columns.map((column) => column.toColumn(rowCount));\n const table = new AttributeTable({ domain, rowCount, columns: [...frozen, ...extra] });\n verifyUniqueColumns(table);\n return table;\n}\nfunction graphTableOf(values) {\n const columns = [];\n for (const [name, entry] of values) {\n columns.push(columnFromValues(\"graph\", 1, name, [entry.value], entry.decl ?? {}));\n }\n return new AttributeTable({ domain: \"graph\", rowCount: 1, columns });\n}\nfunction composeEdgeRemap(oldBound, first, walk, second) {\n if (first === null && walk === null) {\n return null;\n }\n const out = new Uint32Array(oldBound);\n for (let e = 0; e < oldBound; e++) {\n let index = first === null ? e : first.remap[e];\n if (index !== INVALID_INDEX && walk !== null && second !== null) {\n index = second.remap[walk.survivorOf[index]];\n }\n out[e] = index;\n }\n return isIdentity(out) ? null : out;\n}\nfunction identityRemap(count) {\n const remap = new Uint32Array(count);\n for (let i = 0; i < count; i++) {\n remap[i] = i;\n }\n return { remap, origin: remap, count };\n}\nfunction freezeOptionError(field, found) {\n return new GraphFormatError(\"E_UNSUPPORTED\", `freeze option ${field} has an unsupported value ${String(found)}`, {\n field,\n found,\n reason: \"unsupported option\"\n });\n}\nfunction checkFreezeOptions(options) {\n if (options.duplicateEdges !== void 0) {\n assertDuplicatePolicy(\"duplicateEdges\", options.duplicateEdges, freezeOptionError);\n }\n for (const field of [\"arena\", \"release\", \"profile\", \"checksum\"]) {\n const value = options[field];\n if (value !== void 0 && typeof value !== \"boolean\") {\n throw freezeOptionError(field, value);\n }\n }\n if (options.label !== void 0 && typeof options.label !== \"string\") {\n throw freezeOptionError(\"label\", options.label);\n }\n if (options.prepare !== void 0 && !Array.isArray(options.prepare)) {\n throw freezeOptionError(\"prepare\", options.prepare);\n }\n}\nfunction runFreeze(ctx, options) {\n const profile = options.profile === true;\n const timings = {};\n const start = profile ? now() : 0;\n let mark = start;\n const lap = (phase) => {\n if (profile) {\n const t = now();\n timings[phase] = (timings[phase] ?? 0) + (t - mark);\n mark = t;\n }\n };\n const { directed } = ctx;\n const source = ctx.staging;\n checkFreezeOptions(options);\n const useArena = options.arena !== false;\n const policy = options.duplicateEdges ?? ctx.options.duplicateEdges;\n const loopPolicy = ctx.options.selfLoops;\n const oldNodeBound = source.nodeBound;\n const oldEdgeBound = source.edgeBound;\n const tombstonedEdges = oldEdgeBound - source.liveEdgeCount;\n if (loopPolicy === \"error\") {\n checkSelfLoops(source);\n }\n const liveArcs = directed ? source.liveEdgeCount : 2 * source.liveEdgeCount - source.selfLoopCount;\n if (liveArcs > MAX_COUNT) {\n throw new GraphFormatError(\"E_TOO_LARGE\", `arc count ${liveArcs} exceeds MAX_COUNT`, {\n count: liveArcs,\n max: MAX_COUNT\n });\n }\n let staging = source;\n let nodeRemap = null;\n let edgeRemap = null;\n let droppedSelfLoops = 0;\n const dropLoops = loopPolicy === \"drop\" && source.selfLoopCount > 0;\n if (source.hasTombstones || dropLoops) {\n const nodes2 = remapKeepingBits(oldNodeBound, source.nodeAlive.view());\n const edges2 = remapKeepingBits(oldEdgeBound, dropLoops ? liveNonLoopBits(source) : source.edgeAlive.view());\n droppedSelfLoops = dropLoops ? source.selfLoopCount : 0;\n staging = compactStaging(source, {\n nodes: nodes2,\n edges: edges2,\n edgeValues: null,\n mergedWeights: null,\n mergedWeightStored: null,\n mergedWeightSet: null\n });\n nodeRemap = nodes2;\n edgeRemap = edges2;\n }\n lap(\"compact\");\n const nodeCount = staging.nodeBound;\n let sorted = sortIntoCore(sortInputOf(staging, directed), useArena && policy === \"keep\");\n lap(\"sort\");\n let walk = null;\n let mergeRemap = null;\n if (policy !== \"keep\") {\n const compaction = edgeRemap;\n walk = walkDuplicates(\n sorted,\n staging,\n directed,\n policy,\n ctx.options.weighted !== false,\n (e) => compaction === null ? e : compaction.origin[e]\n );\n if (walk !== null) {\n const { survivorOf } = walk;\n const edges2 = remapSurvivors(survivorOf);\n let mergedWeights = null;\n let mergedWeightStored = null;\n if (walk.reduced !== null && walk.stored !== null) {\n mergedWeights = new Float64Array(edges2.count);\n mergedWeightStored = new Uint32Array(bitmapWordCount(edges2.count));\n for (let e = 0; e < survivorOf.length; e++) {\n if (survivorOf[e] === e && bitmapGet(walk.stored, e)) {\n mergedWeights[edges2.remap[e]] = walk.reduced[e];\n bitmapSet(mergedWeightStored, edges2.remap[e]);\n }\n }\n }\n let mergedWeightSet = null;\n if (walk.explicit !== null) {\n mergedWeightSet = new Uint32Array(bitmapWordCount(edges2.count));\n for (let e = 0; e < survivorOf.length; e++) {\n if (survivorOf[e] === e && bitmapGet(walk.explicit, e)) {\n bitmapSet(mergedWeightSet, edges2.remap[e]);\n }\n }\n }\n const edgeValues = new Uint32Array(survivorOf.length);\n for (let e = 0; e < survivorOf.length; e++) {\n edgeValues[e] = edges2.remap[survivorOf[e]];\n }\n staging = compactStaging(staging, {\n nodes: identityRemap(nodeCount),\n edges: edges2,\n edgeValues,\n mergedWeights,\n mergedWeightStored,\n mergedWeightSet\n });\n mergeRemap = edges2;\n sorted = sortIntoCore(sortInputOf(staging, directed), useArena);\n } else if (useArena) {\n sorted = { ...sorted, core: copyCoreIntoArena(sorted.core) };\n }\n lap(\"duplicates\");\n }\n const edgeCount = staging.edgeBound;\n const { core, arcCount, selfLoopCount, flags } = sorted;\n const shadow = weightShadowColumn(staging, edgeCount, ctx.options.weightDtype);\n lap(\"weights\");\n const ids = idMapOf$1(staging, nodeCount);\n lap(\"ids\");\n const nodes = tableOf$1(\"node\", nodeCount, staging.nodeColumns);\n const edges = tableOf$1(\"edge\", edgeCount, staging.edgeColumns, shadow === null ? [] : [shadow]);\n const graph = graphTableOf(ctx.graphValues);\n const extensions = /* @__PURE__ */ new Map();\n for (const table of staging.extensions) {\n extensions.set(table.name, tableOf$1(\"extension\", table.rowCount, table.columns));\n }\n lap(\"columns\");\n const parts = {\n label: options.label ?? null,\n serial: null,\n directed,\n nodeCount,\n edgeCount,\n arcCount,\n selfLoopCount,\n rowPtr: core.rowPtr,\n colIdx: core.colIdx,\n weights: core.weights,\n arcToEdge: core.arcToEdge,\n edgeToArc: core.edgeToArc,\n flags,\n ids,\n nodes,\n edges,\n graph,\n extensions,\n meta: ctx.meta,\n arena: core.arena,\n checksum: options.checksum === true\n };\n const snapshot = createSnapshot(parts);\n if (options.prepare !== void 0 && options.prepare.length > 0) {\n snapshot.prepare(options.prepare);\n }\n lap(\"snapshot\");\n if (profile) {\n timings.total = now() - start;\n }\n const nodeRemapOut = nodeRemap !== null && !isIdentity(nodeRemap.remap) ? nodeRemap.remap : null;\n const edgeRemapOut = composeEdgeRemap(oldEdgeBound, edgeRemap, walk, mergeRemap);\n const mergedEdges = walk === null ? 0 : walk.merged;\n const report = Object.freeze({\n nodeRemap: nodeRemapOut,\n edgeRemap: edgeRemapOut,\n compacted: nodeRemapOut !== null || edgeRemapOut !== null,\n droppedSelfLoops,\n mergedEdges,\n droppedEdges: tombstonedEdges + droppedSelfLoops + mergedEdges,\n widened: Object.freeze(ctx.widened.map((w) => Object.freeze({ ...w }))),\n timings: Object.freeze({ ...timings })\n });\n return { snapshot, report, staging };\n}\nconst SELF_LOOP_POLICIES = /* @__PURE__ */ new Set([\"keep\", \"drop\", \"error\"]);\nconst WEIGHT_DTYPES = /* @__PURE__ */ new Set([\"f32\", \"f64\"]);\nconst DIRECTED_COLUMN = \"graphty.directed\";\nconst PAIR_COLUMN = \"graphty.pair\";\nfunction optionError(field, found) {\n return new GraphFormatError(\"E_UNSUPPORTED\", `builder option ${field} has an unsupported value ${String(found)}`, {\n field,\n found,\n reason: \"unsupported option\"\n });\n}\nfunction resolveOptions$1(options) {\n if (typeof options !== \"object\" || options === null) {\n throw optionError(\"options\", options);\n }\n if (typeof options.directed !== \"boolean\") {\n throw optionError(\"directed\", options.directed);\n }\n const weighted = options.weighted ?? \"auto\";\n if (weighted !== \"auto\" && typeof weighted !== \"boolean\") {\n throw optionError(\"weighted\", weighted);\n }\n const weightDtype = options.weightDtype ?? \"f32\";\n if (!WEIGHT_DTYPES.has(weightDtype)) {\n throw optionError(\"weightDtype\", weightDtype);\n }\n const duplicateEdges = assertDuplicatePolicy(\"duplicateEdges\", options.duplicateEdges ?? \"keep\", optionError);\n const selfLoops = options.selfLoops ?? \"keep\";\n if (!SELF_LOOP_POLICIES.has(selfLoops)) {\n throw optionError(\"selfLoops\", selfLoops);\n }\n const addMissingNodes = options.addMissingNodes ?? true;\n if (typeof addMissingNodes !== \"boolean\") {\n throw optionError(\"addMissingNodes\", addMissingNodes);\n }\n const hint = (field) => {\n const value = options[field];\n if (value === void 0) {\n return null;\n }\n if (!Number.isInteger(value) || value < 0) {\n throw optionError(field, value);\n }\n return value;\n };\n return {\n fixed: {\n weighted,\n weightDtype,\n duplicateEdges,\n selfLoops,\n addMissingNodes,\n expectedNodes: hint(\"expectedNodes\"),\n expectedEdges: hint(\"expectedEdges\")\n },\n directed: options.directed\n };\n}\nfunction definedFields(patch) {\n const out = {};\n for (const key of Object.keys(patch)) {\n const value = patch[key];\n if (value !== void 0) {\n out[key] = value;\n }\n }\n return out;\n}\nfunction sameShape(a, b) {\n return a.dtype === b.dtype && a.components === b.components && a.itemDtype === b.itemDtype && a.itemComponents === b.itemComponents;\n}\nclass GraphBuilder {\n /**\n * Create an empty builder.\n * @param options - the options; `directed` is required\n */\n constructor(options) {\n this.locked = false;\n this.optionsCache = null;\n this.nodeNames = null;\n this.edgeNames = null;\n this.graphValues = /* @__PURE__ */ new Map();\n this.metaValue = EMPTY_GRAPH_META;\n this.widenings = [];\n this.mutations = 0;\n this.dirtyFlag = true;\n this.disposed = false;\n const resolved = resolveOptions$1(options);\n this.fixed = resolved.fixed;\n this.directedValue = resolved.directed;\n this.staging = this.freshStaging();\n }\n /**\n * Seed a builder from a snapshot in O(n + m) (design section 6.6): ids, edges in logical order\n * with their declared orientation, weights (through the role-\"weight\" column when present, so an\n * f64 shadow and the explicit / omitted record survive), columns, extension tables and meta;\n * indices are preserved. The staging precision follows an f64 shadow unless the patch says\n * otherwise.\n * @param snapshot - the snapshot to continue\n * @param options - option overrides; `directed` defaults to the snapshot's\n * @returns the builder\n */\n static from(snapshot, options) {\n const patch = definedFields(options ?? {});\n const shadow = snapshot.edges.byRole(\"weight\");\n const weightDtype = patch.weightDtype ?? (shadow !== null && shadow.dtype === \"f64\" ? \"f64\" : void 0);\n const weighted = patch.weighted ?? (snapshot.flags.weighted ? true : void 0);\n const builder = new GraphBuilder({\n directed: snapshot.directed,\n expectedNodes: snapshot.nodeCount,\n expectedEdges: snapshot.edgeCount,\n ...patch,\n ...weightDtype === void 0 ? {} : { weightDtype },\n ...weighted === void 0 ? {} : { weighted }\n });\n builder.addGraph(snapshot, { onDuplicateNode: \"error\" });\n builder.setMeta(snapshot.meta);\n return builder;\n }\n // ---------------------------------------------------------------- options and state\n /**\n * The resolved options; `directed` is the current value.\n * @returns the options\n */\n get options() {\n this.check();\n this.optionsCache ??= Object.freeze({ directed: this.directedValue, ...this.fixed });\n return this.optionsCache;\n }\n /**\n * The current direction.\n * @returns true when directed\n */\n get directed() {\n this.check();\n return this.directedValue;\n }\n /**\n * Whether lockDirected() was called.\n * @returns true when locked\n */\n get directedLocked() {\n this.check();\n return this.locked;\n }\n /**\n * Live node count.\n * @returns the count\n */\n get nodeCount() {\n this.check();\n return this.staging.liveNodeCount;\n }\n /**\n * Live edge count (exact, from the incidence lists).\n * @returns the count\n */\n get edgeCount() {\n this.check();\n return this.staging.liveEdgeCount;\n }\n /**\n * Next node index to be assigned.\n * @returns the bound\n */\n get nodeBound() {\n this.check();\n return this.staging.nodeBound;\n }\n /**\n * Next logical edge index to be assigned.\n * @returns the bound\n */\n get edgeBound() {\n this.check();\n return this.staging.edgeBound;\n }\n /**\n * Increments on every topology or weight mutation; column writes and freeze() do not count.\n * @returns the count\n */\n get mutationCount() {\n this.check();\n return this.mutations;\n }\n /**\n * Whether the builder was mutated since the last freeze() (true for a builder never frozen).\n * @returns true when a fresh freeze would differ from the last one\n */\n get dirty() {\n this.check();\n return this.dirtyFlag;\n }\n /**\n * Change the direction (design section 6.6): a no-op when unchanged; free while no live edge\n * exists; with live edges only undirected -> directed with `expand`, which appends a mirror edge\n * for every live edge and writes the graphty.directed / graphty.pair columns. E_DIRECTED when\n * locked or refused.\n * @param directed - the new direction\n * @param options - `expand` for the in-place expansion\n */\n setDirected(directed, options) {\n this.check();\n if (directed === this.directedValue) {\n return;\n }\n if (this.locked) {\n throw new GraphFormatError(\"E_DIRECTED\", \"the builder's direction is locked\", {\n reason: \"locked\",\n directed: this.directedValue\n });\n }\n if (this.staging.liveEdgeCount === 0) {\n this.directedValue = directed;\n this.optionsCache = null;\n this.mutated();\n return;\n }\n if (!directed) {\n throw new GraphFormatError(\"E_DIRECTED\", \"a builder with edges cannot become undirected\", {\n reason: \"edges present\",\n edgeCount: this.staging.liveEdgeCount\n });\n }\n if (options?.expand !== true) {\n throw new GraphFormatError(\n \"E_DIRECTED\",\n \"an undirected builder with edges becomes directed only with { expand: true }\",\n { reason: \"expand required\", edgeCount: this.staging.liveEdgeCount }\n );\n }\n this.expandToDirected();\n }\n /** Fix the direction: every later changing setDirected() throws E_DIRECTED. */\n lockDirected() {\n this.check();\n this.locked = true;\n }\n // ---------------------------------------------------------------- nodes\n /**\n * Add a node, or return the index of the live node with this id; a tombstoned id is revived at\n * its old index (design section 6.6).\n * @param id - the node id; E_INVALID_ID when illegal\n * @returns the node index\n */\n addNode(id) {\n this.check();\n return this.addValidatedNode(validateNodeId(id));\n }\n /**\n * Add many nodes, writing every id's index (new or existing) into `out`.\n * @param ids - the ids\n * @param out - receives the indices; allocated when omitted; E_COLUMN_LENGTH when too short\n * @returns `out`\n */\n addNodes(ids, out) {\n this.check();\n const list = Array.isArray(ids) ? ids : [...ids];\n const validated = list.map((id) => validateNodeId(id));\n if (out !== void 0 && out.length < validated.length) {\n throw new GraphFormatError(\"E_COLUMN_LENGTH\", `out has ${out.length} entries for ${validated.length} ids`, {\n expected: validated.length,\n found: out.length\n });\n }\n const target = out ?? new Uint32Array(validated.length);\n for (let i = 0; i < validated.length; i++) {\n target[i] = this.addValidatedNode(validated[i]);\n }\n return target;\n }\n /**\n * Append `count` nodes whose ids are their own indices, never touching the id Map while every\n * node is anonymous (design section 6.6).\n * @param count - how many; E_TOO_LARGE beyond MAX_COUNT; E_DUPLICATE_ID when an index is already an id\n * @returns the first new index\n */\n addAnonymousNodes(count) {\n this.check();\n if (!Number.isInteger(count) || count < 0) {\n throw new GraphFormatError(\"E_INDEX_RANGE\", `node count ${count} is not a non-negative integer`, {\n count\n });\n }\n const { staging } = this;\n const first = staging.nodeBound;\n this.checkNodeLimit(count);\n if (staging.idToIndex !== null) {\n for (let i = first; i < first + count; i++) {\n if (staging.idToIndex.has(i)) {\n throw new GraphFormatError(\n \"E_DUPLICATE_ID\",\n `node id ${i} exists; anonymous node ${i} cannot use it`,\n {\n id: i,\n index: staging.idToIndex.get(i)\n }\n );\n }\n }\n }\n for (let i = 0; i < count; i++) {\n staging.pushNode(null);\n }\n if (count > 0) {\n this.mutated();\n }\n return first;\n }\n /**\n * Whether a live node has this id (total: an illegal id is simply absent).\n * @param id - the id\n * @returns true when present and alive\n */\n hasNode(id) {\n this.check();\n return this.lookup(id) !== INVALID_INDEX;\n }\n /**\n * Total lookup of a live node.\n * @param id - the id\n * @returns the index, or INVALID_INDEX\n */\n indexOf(id) {\n this.check();\n return this.lookup(id);\n }\n /**\n * The id of a live node index.\n * @param index - the index; E_INDEX_RANGE when out of range or tombstoned\n * @returns the id\n */\n idOf(index) {\n this.check();\n const { staging } = this;\n if (!this.isLiveNode(index)) {\n throw new GraphFormatError(\"E_INDEX_RANGE\", `node index ${index} is out of range or removed`, {\n index,\n bound: staging.nodeBound\n });\n }\n return staging.ids === null ? index : staging.ids[index];\n }\n /**\n * Tombstone a node and every live incident edge (O(degree)); bumps mutationCount.\n * @param id - the id; E_UNKNOWN_NODE when absent or already removed\n * @returns the removed live incident edge indices, ascending\n */\n removeNode(id) {\n this.check();\n const index = this.lookup(id);\n if (index === INVALID_INDEX) {\n throw new GraphFormatError(\"E_UNKNOWN_NODE\", `unknown node id ${describeId(id)}`, { id });\n }\n return this.removeLiveNode(index);\n }\n /**\n * Tombstone a node by index and every live incident edge.\n * @param index - the index; E_UNKNOWN_NODE (details.index) when out of range or removed\n * @returns the removed live incident edge indices, ascending\n */\n removeNodeByIndex(index) {\n this.check();\n if (!this.isLiveNode(index)) {\n throw new GraphFormatError(\"E_UNKNOWN_NODE\", `node index ${index} is out of range or removed`, { index });\n }\n return this.removeLiveNode(index);\n }\n /**\n * Grow staging capacity ahead of a bulk push.\n * @param nodes - the node count to fit\n * @param edges - the edge count to fit\n */\n reserve(nodes, edges) {\n this.check();\n const check = (field, value) => {\n if (value === void 0) {\n return 0;\n }\n if (!Number.isInteger(value) || value < 0 || value > MAX_COUNT) {\n throw new GraphFormatError(\n \"E_TOO_LARGE\",\n `reserve(${field}) ${value} is not an integer in [0, MAX_COUNT]`,\n {\n field,\n count: value,\n max: MAX_COUNT\n }\n );\n }\n return value;\n };\n this.staging.reserve(check(\"nodes\", nodes), check(\"edges\", edges));\n }\n // ---------------------------------------------------------------- edges\n /**\n * Add a logical edge by id; unknown endpoints are created when addMissingNodes is set (a\n * tombstoned endpoint is revived), else E_UNKNOWN_NODE. A NaN weight is E_INVALID_WEIGHT.\n * @param source - source id\n * @param target - target id\n * @param weight - the weight; 1 when omitted\n * @returns the logical edge index\n */\n addEdge(source, target, weight) {\n this.check();\n const w = this.checkWeight(weight, void 0);\n const u = this.resolveEndpoint(validateNodeId(source));\n const v = this.resolveEndpoint(validateNodeId(target));\n return this.pushEdge(u, v, w);\n }\n /**\n * Add a logical edge by node index.\n * @param u - source index; E_UNKNOWN_NODE (details.index) when out of range or removed\n * @param v - target index\n * @param weight - the weight; 1 when omitted\n * @returns the logical edge index\n */\n addEdgeByIndex(u, v, weight) {\n this.check();\n const w = this.checkWeight(weight, void 0);\n this.checkLiveNode(u);\n this.checkLiveNode(v);\n return this.pushEdge(u, v, w);\n }\n /**\n * Bulk add edges by node index (the index-space path used with addAnonymousNodes). Everything is\n * validated before the first edge is pushed.\n * @param src - source indices\n * @param dst - target indices; E_COLUMN_LENGTH when the lengths differ\n * @param weights - per-edge weights; 1 when omitted; E_INVALID_WEIGHT for NaN\n * @returns the first new logical edge index\n */\n addEdges(src, dst, weights) {\n this.check();\n const count = src.length;\n if (dst.length !== count || weights !== void 0 && weights.length !== count) {\n throw new GraphFormatError(\n \"E_COLUMN_LENGTH\",\n `addEdges: src has ${count} entries, dst ${dst.length}, weights ${weights === void 0 ? \"none\" : weights.length}`,\n { src: count, dst: dst.length, weights: weights?.length ?? null }\n );\n }\n for (let i = 0; i < count; i++) {\n this.checkLiveNode(src[i]);\n this.checkLiveNode(dst[i]);\n }\n let explicit = null;\n if (weights !== void 0) {\n for (let i = 0; i < count; i++) {\n this.checkWeight(weights[i], i);\n }\n explicit = this.fixed.weighted === false ? null : weights;\n }\n this.checkEdgeLimit(count, this.arcsOf(src, dst, count));\n const { staging } = this;\n staging.reserve(0, staging.edgeBound + count);\n const first = staging.pushEdges(src, dst, explicit);\n if (count > 0) {\n this.mutated();\n }\n return first;\n }\n /**\n * Bulk add edges by id. Every id and weight is validated before anything is added.\n * @param src - source ids\n * @param dst - target ids; E_COLUMN_LENGTH when the lengths differ\n * @param weights - per-edge weights; 1 when omitted\n * @returns the first new logical edge index\n */\n addEdgesByIds(src, dst, weights) {\n this.check();\n const count = src.length;\n if (dst.length !== count || weights !== void 0 && weights.length !== count) {\n throw new GraphFormatError(\n \"E_COLUMN_LENGTH\",\n `addEdgesByIds: src has ${count} entries, dst ${dst.length}, weights ${weights === void 0 ? \"none\" : weights.length}`,\n { src: count, dst: dst.length, weights: weights?.length ?? null }\n );\n }\n const sources = new Array(count);\n const targets = new Array(count);\n const checked = new Array(count);\n for (let i = 0; i < count; i++) {\n sources[i] = validateNodeId(src[i]);\n targets[i] = validateNodeId(dst[i]);\n checked[i] = this.checkWeight(weights === void 0 ? void 0 : weights[i], i);\n }\n if (!this.fixed.addMissingNodes) {\n for (let i = 0; i < count; i++) {\n this.requireLive(sources[i]);\n this.requireLive(targets[i]);\n }\n }\n this.checkEdgeLimit(count, this.directedValue ? count : 2 * count);\n const first = this.staging.edgeBound;\n for (let i = 0; i < count; i++) {\n const u = this.resolveEndpoint(sources[i]);\n const v = this.resolveEndpoint(targets[i]);\n this.staging.pushEdge(u, v, checked[i]);\n }\n if (count > 0) {\n this.mutated();\n }\n return first;\n }\n /**\n * Tombstone an edge (O(1)); bumps mutationCount when something was removed.\n * @param edge - the logical edge index\n * @returns true when a live edge was removed\n */\n removeEdge(edge) {\n this.check();\n if (!this.isLiveEdge(edge)) {\n return false;\n }\n this.staging.killEdge(edge);\n this.mutated();\n return true;\n }\n /**\n * Whether an edge index is live.\n * @param edge - the logical edge index\n * @returns true when live\n */\n hasEdge(edge) {\n this.check();\n return this.isLiveEdge(edge);\n }\n /**\n * Read a live edge's endpoints back.\n * @param edge - the logical edge index; E_INDEX_RANGE when out of range or removed\n * @returns [source index, target index] in declared orientation\n */\n edgeEndpoints(edge) {\n this.check();\n this.checkEdge(edge);\n return [this.staging.src.get(edge), this.staging.dst.get(edge)];\n }\n /**\n * Read a live edge's weight back.\n * @param edge - the logical edge index; E_INDEX_RANGE when out of range or removed\n * @returns the weight (1 when unweighted)\n */\n edgeWeight(edge) {\n this.check();\n this.checkEdge(edge);\n const { weight } = this.staging;\n return weight === null ? 1 : weight.get(edge);\n }\n /**\n * Set the weight of a live edge, allocating the weight array on first use and marking the weight\n * explicit; bumps mutationCount.\n * @param edge - the logical edge index; E_INDEX_RANGE when out of range or removed\n * @param weight - the weight; E_INVALID_WEIGHT for NaN\n */\n setEdgeWeight(edge, weight) {\n this.check();\n this.checkEdge(edge);\n const w = this.checkWeight(weight, void 0);\n const { staging } = this;\n if (w !== void 0) {\n staging.ensureWeights().set(edge, w);\n staging.trackWeight(edge, true);\n }\n this.mutated();\n }\n /**\n * Live edges leaving a node, from the out-list (O(degree)). On an undirected builder every\n * incident edge leaves the node (invariant I7, the snapshot's row holds both orientations), so\n * both lists are walked and a self-loop is listed once.\n * @param index - the node index; E_INDEX_RANGE when out of range\n * @returns a fresh ascending array of live edge indices\n */\n outEdgesOf(index) {\n this.check();\n this.checkNodeIndex(index);\n return this.directedValue ? this.staging.outEdges(index) : this.staging.incidentEdges(index);\n }\n /**\n * Live edges entering a node, from the in-list (O(degree)); on an undirected builder the same\n * set as outEdgesOf (the alias rule of inDegree === outDegree).\n * @param index - the node index; E_INDEX_RANGE when out of range\n * @returns a fresh ascending array of live edge indices\n */\n inEdgesOf(index) {\n this.check();\n this.checkNodeIndex(index);\n return this.directedValue ? this.staging.inEdges(index) : this.staging.incidentEdges(index);\n }\n /**\n * Live edges u -> v (undirected: either orientation), from the incidence lists.\n * @param u - source index; E_INDEX_RANGE when out of range\n * @param v - target index; E_INDEX_RANGE when out of range\n * @returns a fresh ascending array of live edge indices\n */\n findEdges(u, v) {\n this.check();\n this.checkNodeIndex(u);\n this.checkNodeIndex(v);\n const { staging } = this;\n const found = [];\n for (let e = staging.firstOut.get(u); e !== INVALID_INDEX; e = staging.nextOut.get(e)) {\n if (staging.edgeAlive.get(e) && staging.dst.get(e) === v) {\n found.push(e);\n }\n }\n if (!this.directedValue && u !== v) {\n for (let e = staging.firstIn.get(u); e !== INVALID_INDEX; e = staging.nextIn.get(e)) {\n if (staging.edgeAlive.get(e) && staging.src.get(e) === v) {\n found.push(e);\n }\n }\n }\n return Uint32Array.from(found).sort();\n }\n // ---------------------------------------------------------------- attributes\n /**\n * Declare a node column; the same shape again returns the existing handle, a different shape is\n * E_COLUMN_EXISTS, a taken role E_DUPLICATE_ROLE.\n * @param decl - the declaration\n * @returns the column handle\n */\n declareNodeColumn(decl) {\n this.check();\n return this.declare(\"node\", decl);\n }\n /**\n * Declare an edge column; the same shape again returns the existing handle, a different shape is\n * E_COLUMN_EXISTS, a taken role E_DUPLICATE_ROLE.\n * @param decl - the declaration\n * @returns the column handle\n */\n declareEdgeColumn(decl) {\n this.check();\n return this.declare(\"edge\", decl);\n }\n /**\n * Look up a node column handle.\n * @param name - the column name\n * @returns the handle, or INVALID_INDEX when absent\n */\n nodeColumn(name) {\n this.check();\n return this.handleOf(this.staging.nodeColumns, name);\n }\n /**\n * Look up an edge column handle.\n * @param name - the column name\n * @returns the handle, or INVALID_INDEX when absent\n */\n edgeColumn(name) {\n this.check();\n return this.handleOf(this.staging.edgeColumns, name);\n }\n /**\n * Set one node cell; a string column name auto-declares an inferred column (design section 5.1)\n * on the first set value, and an unset value for an undeclared name is a no-op.\n * @param column - the handle (E_UNKNOWN_COLUMN when stale) or name\n * @param index - the node index; E_INDEX_RANGE when out of range\n * @param value - the value; undefined / null unset the row\n */\n setNodeValue(column, index, value) {\n this.check();\n this.checkNodeIndex(index);\n this.writeCell(\"node\", column, index, value);\n }\n /**\n * Set one edge cell; a string column name auto-declares an inferred column.\n * @param column - the handle (E_UNKNOWN_COLUMN when stale) or name\n * @param edge - the logical edge index; E_INDEX_RANGE when out of range\n * @param value - the value; undefined / null unset the row\n */\n setEdgeValue(column, edge, value) {\n this.check();\n this.checkEdgeIndex(edge);\n this.writeCell(\"edge\", column, edge, value);\n }\n /**\n * Widen an inferred node column to a wider dtype of the design section 5.1 order without\n * changing any value (an importer that knows from the lexical grammar that a column of `2.0`\n * cells is f64 although every value so far was integral). A no-op when the column is already\n * as wide; E_COLUMN_TYPE for a declared (non-inferred) column, a dtype outside the inference\n * order or a narrower one; the widening is reported in FreezeReport.widened.\n * @param column - the handle (E_UNKNOWN_COLUMN when stale) or name (E_UNKNOWN_COLUMN when absent)\n * @param dtype - the dtype to widen to\n */\n widenNodeColumn(column, dtype) {\n this.check();\n this.widenColumn(\"node\", column, dtype);\n }\n /**\n * Widen an inferred edge column to a wider dtype of the design section 5.1 order without\n * changing any value; see widenNodeColumn().\n * @param column - the handle (E_UNKNOWN_COLUMN when stale) or name (E_UNKNOWN_COLUMN when absent)\n * @param dtype - the dtype to widen to\n */\n widenEdgeColumn(column, dtype) {\n this.check();\n this.widenColumn(\"edge\", column, dtype);\n }\n /**\n * Bulk-set a node column from a typed array (copied into staging); replaces a column of the same\n * name. The length must be nodeBound * components (bool: ceil(nodeBound / 32) words).\n * @param name - the column name\n * @param data - the values\n * @param decl - declaration fields (dtype defaults to the array's)\n */\n setNodeColumn(name, data, decl) {\n this.check();\n this.setBulkColumn(\"node\", this.staging.nodeBound, name, data, decl ?? {});\n }\n /**\n * Bulk-set an edge column from a typed array (copied into staging); replaces a column of the same\n * name. The length must be edgeBound * components.\n * @param name - the column name\n * @param data - the values\n * @param decl - declaration fields (dtype defaults to the array's)\n */\n setEdgeColumn(name, data, decl) {\n this.check();\n this.setBulkColumn(\"edge\", this.staging.edgeBound, name, data, decl ?? {});\n }\n /**\n * Set a graph-level attribute (the graph table's single row); the value and declaration are\n * checked now, the column is built at freeze.\n * @param name - the column name\n * @param value - the value; undefined unsets it\n * @param decl - declaration fields for the column\n */\n setGraphValue(name, value, decl) {\n this.check();\n const patch = decl ?? {};\n resolveColumnMeta(name, \"graph\", { dtype: \"json\", ...patch });\n if (value !== void 0) {\n buildGraphColumn(name, value, patch);\n }\n this.graphValues.set(name, { decl: patch, value });\n }\n /**\n * Merge fields into the graph metadata (design section 5.9); undefined fields are left alone,\n * `extra` must be a JSON value (E_COLUMN_TYPE with details.field otherwise).\n * @param meta - the fields to set\n */\n setMeta(meta) {\n this.check();\n this.metaValue = resolveGraphMeta$1(this.metaValue, meta);\n }\n /**\n * Create an extension table (design section 5.10).\n * @param name - the table name; E_COLUMN_EXISTS when taken\n * @param decls - its columns; E_COLUMN_EXISTS for a repeated name, E_DUPLICATE_ROLE for a repeated role\n * @returns the table handle\n */\n addExtensionTable(name, decls) {\n this.check();\n const { staging } = this;\n if (staging.extensions.some((table) => table.name === name)) {\n throw new GraphFormatError(\"E_COLUMN_EXISTS\", `extension table \"${name}\" already exists`, { table: name });\n }\n const columns = [];\n for (const decl of decls) {\n const column = createStagingColumn(decl.name, \"extension\", decl, false);\n if (columns.some((other) => other.meta.name === column.meta.name)) {\n throw new GraphFormatError(\"E_COLUMN_EXISTS\", `column \"${decl.name}\" is declared twice in \"${name}\"`, {\n table: name,\n column: decl.name\n });\n }\n checkRole(columns, column.meta, name);\n columns.push(column);\n }\n staging.extensions.push({ name, columns, rowCount: 0 });\n return staging.extensions.length - 1;\n }\n /**\n * Append a row to an extension table.\n * @param table - the table handle; E_INDEX_RANGE when unknown\n * @param values - one value per declared column; E_COLUMN_LENGTH otherwise\n * @returns the new row index\n */\n addExtensionRow(table, values) {\n this.check();\n const target = this.extensionOf(table);\n if (values.length !== target.columns.length) {\n throw new GraphFormatError(\n \"E_COLUMN_LENGTH\",\n `extension table \"${target.name}\" has ${target.columns.length} columns; ${values.length} values given`,\n { table: target.name, expected: target.columns.length, found: values.length }\n );\n }\n const row = target.rowCount;\n const checked = target.columns.map((column, i) => {\n const value = this.checkReference(column.meta, values[i]);\n column.checkValue(row, value);\n return value;\n });\n for (let i = 0; i < checked.length; i++) {\n target.columns[i].write(row, checked[i]);\n }\n target.rowCount = row + 1;\n return row;\n }\n /**\n * Add a node from a record: every key present overwrites that row (last-write-wins per attribute,\n * design section 6.6), auto-declaring inferred columns.\n * @param id - the node id\n * @param attrs - attribute values keyed by column name\n * @returns the node index\n */\n addNodeRecord(id, attrs) {\n this.check();\n const validated = validateNodeId(id);\n const keys = Object.keys(attrs);\n this.checkCells(\"node\", this.prospectiveNodeIndex(validated), keys, attrs);\n const index = this.addValidatedNode(validated);\n for (const key of keys) {\n this.writeCell(\"node\", key, index, attrs[key]);\n }\n return index;\n }\n /**\n * Add an edge from a record; always a new edge (parallels are kept). The weight comes from\n * `weightKey` (\"weight\" by default; null = none) and must be a number (E_INVALID_WEIGHT).\n * @param source - source id\n * @param target - target id\n * @param attrs - attribute values keyed by column name\n * @param weightKey - the key holding the weight; default \"weight\"; null = no weight\n * @returns the logical edge index\n */\n addEdgeRecord(source, target, attrs, weightKey) {\n this.check();\n const key = weightKey === void 0 ? \"weight\" : weightKey;\n let weight;\n if (key !== null && Object.prototype.hasOwnProperty.call(attrs, key)) {\n const raw = attrs[key];\n if (raw !== void 0 && raw !== null) {\n if (typeof raw !== \"number\") {\n throw new GraphFormatError(\"E_INVALID_WEIGHT\", `edge weight \"${key}\" is not a number`, {\n key,\n found: typeof raw\n });\n }\n weight = raw;\n }\n }\n const keys = Object.keys(attrs).filter((name) => name !== key);\n this.checkWeight(weight, void 0);\n this.checkCells(\"edge\", this.staging.edgeBound, keys, attrs);\n const edge = this.addEdge(source, target, weight);\n for (const name of keys) {\n this.writeCell(\"edge\", name, edge, attrs[name]);\n }\n return edge;\n }\n // ---------------------------------------------------------------- composition\n /**\n * Append another snapshot (design section 6.6): nodes are merged by id (\"merge\": the incoming set\n * rows overwrite; \"error\": E_DUPLICATE_ID), edges are appended in logical order with their\n * declared orientation and weights, columns declared in both graphs widen to the union dtype of\n * design section 5.1, dictionaries are re-interned, extension tables are appended with their\n * references rewritten, and graph attributes overwrite by name.\n * @param snapshot - the snapshot to append\n * @param options - duplicate-id handling\n * @param options.onDuplicateNode - \"merge\" (default) or \"error\"\n */\n addGraph(snapshot, options) {\n this.check();\n const onDuplicate = options?.onDuplicateNode ?? \"merge\";\n if (onDuplicate !== \"merge\" && onDuplicate !== \"error\") {\n throw new GraphFormatError(\n \"E_UNSUPPORTED\",\n `addGraph option onDuplicateNode has an unsupported value ${String(onDuplicate)}`,\n { field: \"onDuplicateNode\", found: onDuplicate, reason: \"unsupported option\" }\n );\n }\n if (snapshot.directed !== this.directedValue) {\n throw new GraphFormatError(\n \"E_DIRECTED\",\n `a ${snapshot.directed ? \"directed\" : \"undirected\"} snapshot cannot be appended to a ${this.directedValue ? \"directed\" : \"undirected\"} builder`,\n { reason: \"direction mismatch\", directed: this.directedValue, found: snapshot.directed }\n );\n }\n const { staging } = this;\n const { nodeCount, edgeCount } = snapshot;\n const anonymous = staging.ids === null && staging.nodeBound === 0 && snapshot.ids.kind === \"identity\" && snapshot.ids.offset === 0;\n const nodeMap = new Uint32Array(nodeCount);\n let newNodes = nodeCount;\n if (!anonymous) {\n newNodes = 0;\n for (let i = 0; i < nodeCount; i++) {\n const id = snapshot.ids.idOf(i);\n const existing = this.lookup(id);\n if (existing === INVALID_INDEX) {\n newNodes++;\n } else if (onDuplicate === \"error\") {\n throw new GraphFormatError(\"E_DUPLICATE_ID\", `node id ${describeId(id)} already exists`, {\n id,\n index: existing\n });\n }\n }\n }\n this.checkNodeLimit(newNodes);\n const list = snapshot.edgeList();\n this.checkEdgeLimit(edgeCount, this.arcsOf(list.src, list.dst, edgeCount));\n const shadow = snapshot.edges.byRole(\"weight\");\n const weights = new Array(edgeCount);\n for (let e = 0; e < edgeCount; e++) {\n let weight;\n if (shadow !== null) {\n weight = shadow.isSet(e) ? shadow.value(e) : void 0;\n } else if (list.weights !== null) {\n weight = list.weights[e];\n }\n weights[e] = this.checkWeight(weight, e);\n }\n for (const column of snapshot.nodes) {\n this.checkIncomingColumn(\"node\", column);\n }\n for (const column of snapshot.edges) {\n if (column !== shadow) {\n this.checkIncomingColumn(\"edge\", column);\n }\n }\n for (const [name, table] of snapshot.extensions) {\n this.checkIncomingExtension(name, table);\n }\n if (anonymous) {\n const first = this.addAnonymousNodes(nodeCount);\n for (let i = 0; i < nodeCount; i++) {\n nodeMap[i] = first + i;\n }\n } else {\n for (let i = 0; i < nodeCount; i++) {\n const id = snapshot.ids.idOf(i);\n const existing = this.lookup(id);\n nodeMap[i] = existing === INVALID_INDEX ? this.addValidatedNode(id) : existing;\n }\n }\n if (snapshot.flags.weighted && this.fixed.weighted !== false) {\n staging.ensureWeights();\n }\n const edgeMap = new Uint32Array(edgeCount);\n for (let e = 0; e < edgeCount; e++) {\n edgeMap[e] = this.pushEdge(nodeMap[list.src[e]], nodeMap[list.dst[e]], weights[e]);\n }\n const refs = { node: nodeMap, edge: edgeMap };\n for (const column of snapshot.nodes) {\n this.copyColumn(\"node\", column, nodeMap, refs);\n }\n for (const column of snapshot.edges) {\n if (column !== shadow) {\n this.copyColumn(\"edge\", column, edgeMap, refs);\n }\n }\n for (const column of snapshot.graph) {\n if (column.isSet(0)) {\n this.setGraphValue(column.meta.name, column.value(0), metaToDecl(column.meta));\n }\n }\n for (const [name, table] of snapshot.extensions) {\n this.appendExtension(name, table, refs);\n }\n }\n // ---------------------------------------------------------------- output and lifecycle\n /**\n * Run the freeze pipeline of design section 6.3 and return a snapshot; the builder keeps its\n * staging (compacted and renumbered when tombstones existed, rewritten by a merge policy) unless\n * `release` is set.\n * @param options - the freeze options\n * @returns the snapshot\n */\n freeze(options) {\n return this.freezeWithReport(options).snapshot;\n }\n /**\n * freeze() plus the report of what was renumbered, merged, dropped and widened (design section\n * 6.6): the remaps are relative to the previous freeze (the builder's own index space on the\n * first) and null exactly when nothing was renumbered.\n * @param options - the freeze options\n * @returns the snapshot and its report\n */\n freezeWithReport(options) {\n this.check();\n const opts = options ?? {};\n const context = {\n staging: this.staging,\n directed: this.directedValue,\n options: this.options,\n graphValues: this.graphValues,\n meta: this.metaValue,\n widened: this.widenings\n };\n const outcome = runFreeze(context, opts);\n this.staging = outcome.staging;\n this.widenings = [];\n this.dirtyFlag = false;\n if (opts.release === true) {\n this.staging = this.freshStaging();\n }\n return { snapshot: outcome.snapshot, report: outcome.report };\n }\n /** Empty the builder (nodes, edges, columns, extension tables, graph attributes, meta), keeping its options and lock. */\n clear() {\n this.check();\n this.staging = this.freshStaging();\n this.graphValues = /* @__PURE__ */ new Map();\n this.metaValue = EMPTY_GRAPH_META;\n this.widenings = [];\n this.mutated();\n }\n /** Release everything; every further call throws E_BUILDER_DISPOSED. */\n dispose() {\n if (this.disposed) {\n return;\n }\n this.staging = new Staging({\n weightDtype: this.fixed.weightDtype,\n weighted: false,\n expectedNodes: null,\n expectedEdges: null,\n resizable: void 0\n });\n this.graphValues = /* @__PURE__ */ new Map();\n this.metaValue = EMPTY_GRAPH_META;\n this.widenings = [];\n this.disposed = true;\n }\n /**\n * Bytes of typed staging currently held (capacity, not length; JS arrays and the id Map excluded).\n * @returns the byte count\n */\n byteLength() {\n this.check();\n return this.staging.byteLength();\n }\n // ---------------------------------------------------------------- private: state\n check() {\n if (this.disposed) {\n throw new GraphFormatError(\"E_BUILDER_DISPOSED\", \"the builder was disposed\", {});\n }\n }\n mutated() {\n this.mutations++;\n this.dirtyFlag = true;\n }\n freshStaging() {\n return new Staging({\n weightDtype: this.fixed.weightDtype,\n weighted: this.fixed.weighted === true,\n expectedNodes: this.fixed.expectedNodes,\n expectedEdges: this.fixed.expectedEdges,\n resizable: void 0\n });\n }\n // ---------------------------------------------------------------- private: nodes\n /**\n * The index a validated id would get from addValidatedNode: its existing (live or tombstoned)\n * index, or the next one.\n * @param id - a validated id\n * @returns the prospective index\n */\n prospectiveNodeIndex(id) {\n const { staging } = this;\n if (staging.idToIndex === null) {\n return typeof id === \"number\" && Number.isInteger(id) && id >= 0 && id < staging.nodeBound ? id : staging.nodeBound;\n }\n return staging.idToIndex.get(typeof id === \"number\" && id === 0 ? 0 : id) ?? staging.nodeBound;\n }\n /**\n * The live index of an id, total.\n * @param id - any value\n * @returns the index, or INVALID_INDEX when absent, illegal or tombstoned\n */\n lookup(id) {\n const { staging } = this;\n if (staging.idToIndex === null) {\n if (typeof id !== \"number\" || !Number.isInteger(id) || id < 0 || id >= staging.nodeBound) {\n return INVALID_INDEX;\n }\n return staging.nodeAlive.get(id) ? id : INVALID_INDEX;\n }\n const index = staging.idToIndex.get(typeof id === \"number\" && id === 0 ? 0 : id);\n if (index === void 0 || !staging.nodeAlive.get(index)) {\n return INVALID_INDEX;\n }\n return index;\n }\n isLiveNode(index) {\n const { staging } = this;\n return Number.isInteger(index) && index >= 0 && index < staging.nodeBound && staging.nodeAlive.get(index);\n }\n isLiveEdge(edge) {\n const { staging } = this;\n return Number.isInteger(edge) && edge >= 0 && edge < staging.edgeBound && staging.edgeAlive.get(edge);\n }\n checkNodeIndex(index) {\n if (!Number.isInteger(index) || index < 0 || index >= this.staging.nodeBound) {\n throw new GraphFormatError(\"E_INDEX_RANGE\", `node index ${index} is out of range`, {\n index,\n bound: this.staging.nodeBound\n });\n }\n }\n checkEdgeIndex(edge) {\n if (!Number.isInteger(edge) || edge < 0 || edge >= this.staging.edgeBound) {\n throw new GraphFormatError(\"E_INDEX_RANGE\", `edge index ${edge} is out of range`, {\n edge,\n bound: this.staging.edgeBound\n });\n }\n }\n checkLiveNode(index) {\n if (!this.isLiveNode(index)) {\n throw new GraphFormatError(\"E_UNKNOWN_NODE\", `node index ${index} is out of range or removed`, { index });\n }\n }\n checkEdge(edge) {\n if (!this.isLiveEdge(edge)) {\n throw new GraphFormatError(\"E_INDEX_RANGE\", `edge index ${edge} is out of range or removed`, {\n edge,\n bound: this.staging.edgeBound\n });\n }\n }\n checkNodeLimit(adding) {\n if (this.staging.nodeBound + adding > MAX_COUNT) {\n throw new GraphFormatError(\n \"E_TOO_LARGE\",\n `node count ${this.staging.nodeBound + adding} exceeds MAX_COUNT`,\n {\n count: this.staging.nodeBound + adding,\n max: MAX_COUNT\n }\n );\n }\n }\n /**\n * The E_TOO_LARGE check of invariant I3 at the add* call that would cross the limit: the edge\n * index space and the live arc count (doubled for an undirected graph, loops once) must both\n * stay at or below MAX_COUNT.\n * @param addingEdges - edges about to be added\n * @param addingArcs - arcs they contribute (1 per directed edge or loop, 2 per undirected non-loop)\n */\n checkEdgeLimit(addingEdges, addingArcs) {\n const { staging } = this;\n const edges = staging.edgeBound + addingEdges;\n const liveArcs = this.directedValue ? staging.liveEdgeCount : 2 * staging.liveEdgeCount - staging.selfLoopCount;\n const arcs = liveArcs + addingArcs;\n if (edges > MAX_COUNT || arcs > MAX_COUNT) {\n throw new GraphFormatError(\"E_TOO_LARGE\", `edge count ${edges} (${arcs} arcs) exceeds MAX_COUNT`, {\n count: edges,\n arcs,\n max: MAX_COUNT\n });\n }\n }\n /**\n * The arcs a batch of edges contributes.\n * @param src - sources\n * @param dst - targets\n * @param count - how many\n * @returns the arc count\n */\n arcsOf(src, dst, count) {\n if (this.directedValue) {\n return count;\n }\n let arcs = 0;\n for (let i = 0; i < count; i++) {\n arcs += src[i] === dst[i] ? 1 : 2;\n }\n return arcs;\n }\n /**\n * Add or revive a validated id.\n * @param id - a validated id\n * @returns the index\n */\n addValidatedNode(id) {\n const { staging } = this;\n staging.materialiseIds();\n const map = staging.idToIndex;\n const existing = map.get(id);\n if (existing !== void 0) {\n if (!staging.nodeAlive.get(existing)) {\n staging.nodeAlive.set(existing, true);\n staging.liveNodeCount++;\n this.mutated();\n }\n return existing;\n }\n this.checkNodeLimit(1);\n const index = staging.pushNode(typeof id === \"string\" ? detachString(id) : id);\n this.mutated();\n return index;\n }\n /**\n * Resolve an edge endpoint id: the live index, a revived or new node under addMissingNodes, or\n * E_UNKNOWN_NODE.\n * @param id - a validated id\n * @returns the index\n */\n resolveEndpoint(id) {\n const index = this.lookup(id);\n if (index !== INVALID_INDEX) {\n return index;\n }\n if (this.fixed.addMissingNodes) {\n return this.addValidatedNode(id);\n }\n throw new GraphFormatError(\"E_UNKNOWN_NODE\", `unknown node id ${describeId(id)}`, { id });\n }\n requireLive(id) {\n if (this.lookup(id) === INVALID_INDEX) {\n throw new GraphFormatError(\"E_UNKNOWN_NODE\", `unknown node id ${describeId(id)}`, { id });\n }\n }\n removeLiveNode(index) {\n const { staging } = this;\n const removed = [];\n for (let e = staging.firstOut.get(index); e !== INVALID_INDEX; e = staging.nextOut.get(e)) {\n if (staging.edgeAlive.get(e)) {\n staging.killEdge(e);\n removed.push(e);\n }\n }\n for (let e = staging.firstIn.get(index); e !== INVALID_INDEX; e = staging.nextIn.get(e)) {\n if (staging.edgeAlive.get(e)) {\n staging.killEdge(e);\n removed.push(e);\n }\n }\n staging.nodeAlive.set(index, false);\n staging.liveNodeCount--;\n this.mutated();\n return Uint32Array.from(removed).sort();\n }\n // ---------------------------------------------------------------- private: edges\n /**\n * Validate a weight argument: NaN is E_INVALID_WEIGHT; on an unweighted (`weighted: false`) builder\n * only 1 is accepted and it is treated as omitted.\n * @param weight - the argument\n * @param edge - the bulk position, for the error details\n * @returns the weight to store, or undefined when omitted\n */\n checkWeight(weight, edge) {\n if (weight === void 0) {\n return void 0;\n }\n if (typeof weight !== \"number\" || Number.isNaN(weight)) {\n throw new GraphFormatError(\"E_INVALID_WEIGHT\", `weight ${String(weight)} is not a number`, {\n weight,\n ...edge === void 0 ? {} : { edge }\n });\n }\n if (this.fixed.weighted === false) {\n if (weight !== 1) {\n throw new GraphFormatError(\"E_INVALID_WEIGHT\", `weight ${weight} on a builder declared unweighted`, {\n weight,\n reason: \"unweighted builder\",\n ...edge === void 0 ? {} : { edge }\n });\n }\n return void 0;\n }\n return weight;\n }\n pushEdge(u, v, weight) {\n this.checkEdgeLimit(1, this.directedValue || u === v ? 1 : 2);\n const e = this.staging.pushEdge(u, v, weight);\n this.mutated();\n return e;\n }\n /**\n * The in-place expansion of design section 6.6: every live edge u -> v gets a mirror v -> u at a\n * new index (loops are not mirrored), graphty.directed is 0 for both halves and graphty.pair links\n * them; every other column's mirror rows stay unset.\n */\n expandToDirected() {\n const { staging } = this;\n const live = staging.liveEdgeCount;\n this.checkEdgeLimit(live, live);\n const directedDecl = { name: DIRECTED_COLUMN, dtype: \"bool\", role: \"directed\" };\n const pairDecl = { name: PAIR_COLUMN, dtype: \"u32\", role: \"pair\", refersTo: \"edge\" };\n this.checkDeclaration(\"edge\", directedDecl);\n this.checkDeclaration(\"edge\", pairDecl);\n const directedHandle = this.declare(\"edge\", directedDecl);\n const pairHandle = this.declare(\"edge\", pairDecl);\n const directedColumn = staging.edgeColumns[directedHandle];\n const pairColumn = staging.edgeColumns[pairHandle];\n const bound = staging.edgeBound;\n for (let e = 0; e < bound; e++) {\n if (!staging.edgeAlive.get(e)) {\n continue;\n }\n directedColumn.write(e, false);\n const u = staging.src.get(e);\n const v = staging.dst.get(e);\n if (u === v) {\n continue;\n }\n const explicit = staging.weightExplicit(e);\n const weight = explicit && staging.weight !== null ? staging.weight.get(e) : void 0;\n const mirror = staging.pushEdge(v, u, weight);\n directedColumn.write(mirror, false);\n pairColumn.write(e, mirror);\n pairColumn.write(mirror, e);\n }\n this.directedValue = true;\n this.optionsCache = null;\n this.mutated();\n }\n // ---------------------------------------------------------------- private: columns\n columnsOf(domain) {\n return domain === \"node\" ? this.staging.nodeColumns : this.staging.edgeColumns;\n }\n handleOf(columns, name) {\n const index = this.columnIndex(columns, name);\n return index < 0 ? INVALID_INDEX : index;\n }\n /**\n * The index of a staging column by name in O(1): a Map beside each column array, rebuilt when\n * the array is replaced (a fresh staging, a compaction) and kept in step by pushColumn().\n * Column names never change, so the map is invalidated only by identity or length.\n * @param columns - the node or edge staging columns\n * @param name - the column name\n * @returns the index, or -1 when absent\n */\n columnIndex(columns, name) {\n const cached = columns === this.staging.nodeColumns ? this.nodeNames : this.edgeNames;\n let index = cached;\n if (index === null || index.columns !== columns || index.map.size !== columns.length) {\n const map = /* @__PURE__ */ new Map();\n for (let i = 0; i < columns.length; i++) {\n map.set(columns[i].meta.name, i);\n }\n index = { columns, map };\n if (columns === this.staging.nodeColumns) {\n this.nodeNames = index;\n } else if (columns === this.staging.edgeColumns) {\n this.edgeNames = index;\n }\n }\n return index.map.get(name) ?? -1;\n }\n /**\n * Append a staging column and keep the name index in step.\n * @param columns - the node or edge staging columns\n * @param column - the column to append\n * @returns the new column's index\n */\n pushColumn(columns, column) {\n columns.push(column);\n const index = columns === this.staging.nodeColumns ? this.nodeNames : this.edgeNames;\n if (index !== null && index.columns === columns && index.map.size === columns.length - 1) {\n index.map.set(column.meta.name, columns.length - 1);\n }\n return columns.length - 1;\n }\n /**\n * Declare a column (design section 11.3): the same shape returns the existing handle, another\n * shape is E_COLUMN_EXISTS, a role held by another column E_DUPLICATE_ROLE.\n * @param domain - node or edge\n * @param decl - the declaration\n * @returns the handle\n */\n declare(domain, decl) {\n const { meta, existing } = this.checkDeclaration(domain, decl);\n if (existing !== INVALID_INDEX) {\n return existing;\n }\n const columns = this.columnsOf(domain);\n return this.pushColumn(columns, new StagingColumn(meta, false));\n }\n /**\n * The checks of declare() without applying anything: the resolved metadata and, when a column\n * of the same shape exists, its handle.\n * @param domain - node or edge\n * @param decl - the declaration\n * @returns the metadata and the existing handle (INVALID_INDEX when the column is new)\n */\n checkDeclaration(domain, decl) {\n if (typeof decl.name !== \"string\" || decl.name.length === 0) {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", \"a column declaration needs a non-empty name\", {\n field: \"name\",\n found: decl.name\n });\n }\n const meta = resolveColumnMeta(decl.name, domain, decl);\n const columns = this.columnsOf(domain);\n const existing = this.columnIndex(columns, meta.name);\n if (existing >= 0) {\n if (sameShape(columns[existing].meta, meta)) {\n return { meta, existing };\n }\n throw new GraphFormatError(\n \"E_COLUMN_EXISTS\",\n `${domain} column \"${meta.name}\" is already declared as ${columns[existing].meta.dtype}`,\n { column: meta.name, domain, found: columns[existing].meta.dtype, expected: meta.dtype }\n );\n }\n checkRole(columns, meta, domain);\n return { meta, existing: INVALID_INDEX };\n }\n /**\n * The staging column a handle or name refers to, auto-declaring an inferred column for an unknown\n * name when the value is set.\n * @param domain - node or edge\n * @param column - the handle or name\n * @param value - the value about to be written (decides the inferred dtype)\n * @returns the column, or null when an unknown name receives an unset value\n */\n resolveColumn(domain, column, value) {\n const columns = this.columnsOf(domain);\n if (typeof column === \"number\") {\n if (!Number.isInteger(column) || column < 0 || column >= columns.length) {\n throw new GraphFormatError(\"E_UNKNOWN_COLUMN\", `no ${domain} column with handle ${column}`, {\n domain,\n handle: column\n });\n }\n return columns[column];\n }\n const index = this.columnIndex(columns, column);\n if (index >= 0) {\n return columns[index];\n }\n if (value === void 0 || value === null) {\n return null;\n }\n const dtype = inferInitialDtype(value);\n const created = createStagingColumn(column, domain, { dtype, nullable: true }, true);\n this.pushColumn(columns, created);\n return created;\n }\n /**\n * Validate every value of a record against the columns it would be written to, without writing\n * (design section 11.1: a record whose value is refused is not applied at all). An existing\n * column checks the value as its `write` would; a new name must be inferrable (a JSON value or a\n * well-formed string) unless the value is unset.\n * @param domain - node or edge\n * @param row - the row the record is meant for (error details only)\n * @param keys - the record keys\n * @param attrs - the record\n */\n checkCells(domain, row, keys, attrs) {\n const columns = this.columnsOf(domain);\n for (const key of keys) {\n const value = attrs[key];\n const at = this.columnIndex(columns, key);\n const column = at < 0 ? void 0 : columns[at];\n if (column !== void 0) {\n column.checkValue(row, this.checkReference(column.meta, value));\n } else if (value !== void 0 && value !== null) {\n inferInitialDtype(value);\n if (typeof value === \"string\") {\n assertWellFormedString(value, { column: key, row });\n } else if (typeof value === \"object\") {\n assertJsonValue(value, `${key}[${row}]`);\n }\n }\n }\n }\n /**\n * The refersTo range rule of invariant I12 at the write: an index-valued cell of a refersTo\n * column must be below the referenced space's current bound (a tombstoned target is a dangling\n * reference the next compaction resolves) or INVALID_INDEX; E_INDEX_RANGE otherwise. A scalar\n * INVALID_INDEX means \"no reference\" and is written as an unset row (E_COLUMN_TYPE on a\n * non-nullable column, which cannot hold it). Values of other shapes are left to the column's\n * own type check.\n * @param meta - the column\n * @param value - the value about to be written\n * @returns the value to write (undefined for a scalar INVALID_INDEX)\n */\n checkReference(meta, value) {\n if (meta.refersTo === null || value === void 0 || value === null) {\n return value;\n }\n const bound = meta.refersTo === \"node\" ? this.staging.nodeBound : this.staging.edgeBound;\n const check = (index) => {\n if (typeof index === \"number\" && index !== INVALID_INDEX && !(index >= 0 && index < bound)) {\n throw new GraphFormatError(\n \"E_INDEX_RANGE\",\n `column \"${meta.name}\" refers to ${String(meta.refersTo)} ${index}, which is not below ${bound}`,\n { column: meta.name, refersTo: meta.refersTo, found: index, bound }\n );\n }\n };\n if (Array.isArray(value)) {\n for (const item of value) {\n check(item);\n }\n return value;\n }\n check(value);\n return value === INVALID_INDEX ? void 0 : value;\n }\n /**\n * The checks copyColumn would fail on before it writes anything: a new column's role must be\n * free (E_DUPLICATE_ROLE).\n * @param domain - node or edge\n * @param column - the incoming column\n */\n checkIncomingColumn(domain, column) {\n const columns = this.columnsOf(domain);\n if (this.columnIndex(columns, column.meta.name) < 0) {\n checkRole(columns, column.meta, domain);\n }\n }\n /**\n * The checks appendExtension would fail on before it writes anything: an existing table of the\n * same name must hold every incoming column (E_UNKNOWN_COLUMN); a new table's declarations must\n * resolve (E_COLUMN_EXISTS / E_DUPLICATE_ROLE).\n * @param name - the table name\n * @param table - the incoming table\n */\n checkIncomingExtension(name, table) {\n const target = this.staging.extensions.find((t) => t.name === name);\n const columns = [...table];\n if (target === void 0) {\n const seen = [];\n for (const column of columns) {\n const decl = { ...metaToDecl(column.meta), name: column.meta.name };\n const created = createStagingColumn(decl.name, \"extension\", decl, false);\n if (seen.some((other) => other.meta.name === created.meta.name)) {\n throw new GraphFormatError(\n \"E_COLUMN_EXISTS\",\n `column \"${decl.name}\" is declared twice in \"${name}\"`,\n {\n table: name,\n column: decl.name\n }\n );\n }\n checkRole(seen, created.meta, name);\n seen.push(created);\n }\n return;\n }\n for (const column of columns) {\n if (!target.columns.some((c) => c.meta.name === column.meta.name)) {\n throw new GraphFormatError(\n \"E_UNKNOWN_COLUMN\",\n `extension table \"${name}\" has no column \"${column.meta.name}\"`,\n { table: name, column: column.meta.name }\n );\n }\n }\n }\n /**\n * The widening of widenNodeColumn / widenEdgeColumn.\n * @param domain - node or edge\n * @param column - the handle or name\n * @param dtype - the dtype to widen to\n */\n widenColumn(domain, column, dtype) {\n const columns = this.columnsOf(domain);\n let target;\n if (typeof column === \"number\") {\n target = Number.isInteger(column) && column >= 0 && column < columns.length ? columns[column] : void 0;\n } else {\n const index = this.columnIndex(columns, column);\n target = index < 0 ? void 0 : columns[index];\n }\n if (target === void 0) {\n throw new GraphFormatError(\"E_UNKNOWN_COLUMN\", `no ${domain} column ${String(column)}`, { domain, column });\n }\n const current = target.inferredDtype;\n if (current === null) {\n throw new GraphFormatError(\n \"E_COLUMN_TYPE\",\n `${domain} column \"${target.meta.name}\" is declared, not inferred`,\n {\n column: target.meta.name,\n domain\n }\n );\n }\n if (wideningRank(dtype) < 0) {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `${dtype} is not a dtype inference widens to`, {\n column: target.meta.name,\n dtype\n });\n }\n const next = dtype;\n if (wideningRank(next) < wideningRank(current)) {\n throw new GraphFormatError(\n \"E_COLUMN_TYPE\",\n `${domain} column \"${target.meta.name}\" is ${current}; it cannot narrow to ${next}`,\n { column: target.meta.name, found: current, expected: next }\n );\n }\n if (next === current) {\n return;\n }\n target.widenTo(next);\n this.widenings.push({ column: target.meta.name, domain, from: current, to: next });\n this.mutated();\n }\n writeCell(domain, column, row, value) {\n const target = this.resolveColumn(domain, column, value);\n if (target === null) {\n return;\n }\n const widened = target.write(row, this.checkReference(target.meta, value));\n if (widened !== null) {\n this.widenings.push({ column: target.meta.name, domain, from: widened.from, to: widened.to });\n }\n }\n /**\n * Replace or create a column from a typed array (setNodeColumn / setEdgeColumn).\n * @param domain - node or edge\n * @param rows - the table's current bound\n * @param name - the column name\n * @param data - the values\n * @param decl - the declaration patch\n */\n setBulkColumn(domain, rows, name, data, decl) {\n const column = stagingColumnFromTypedArray(domain, rows, name, data, decl, {\n node: this.staging.nodeBound,\n edge: this.staging.edgeBound\n });\n const columns = this.columnsOf(domain);\n const existing = this.columnIndex(columns, name);\n checkRole(\n columns.filter((c) => c.meta.name !== name),\n column.meta,\n domain\n );\n if (existing >= 0) {\n columns[existing] = column;\n } else {\n this.pushColumn(columns, column);\n }\n }\n extensionOf(handle) {\n const { extensions } = this.staging;\n if (!Number.isInteger(handle) || handle < 0 || handle >= extensions.length) {\n throw new GraphFormatError(\"E_INDEX_RANGE\", `no extension table with handle ${handle}`, { handle });\n }\n return extensions[handle];\n }\n /**\n * Copy a snapshot column into the builder (addGraph): declared under the same metadata when the\n * name is new, else widened to the union dtype (design section 6.6); every set row is written\n * through `rowMap`, with refersTo values rewritten through `refs`.\n * @param domain - node or edge\n * @param column - the source column\n * @param rowMap - source row -> builder row\n * @param refs - source node / edge index -> builder index\n */\n copyColumn(domain, column, rowMap, refs) {\n const columns = this.columnsOf(domain);\n const { name } = column.meta;\n let index = this.columnIndex(columns, name);\n if (index < 0) {\n const decl = { ...metaToDecl(column.meta) };\n checkRole(columns, column.meta, domain);\n index = this.pushColumn(columns, createStagingColumn(name, domain, decl, false));\n } else {\n const target2 = columns[index];\n if (!sameShape(target2.meta, column.meta)) {\n const union = wider(inferredEquivalent(target2.meta.dtype), inferredEquivalent(column.meta.dtype));\n if (target2.meta.dtype !== union) {\n const from = target2.meta.dtype;\n target2.widenTo(union);\n this.widenings.push({ column: name, domain, from, to: union });\n }\n }\n }\n const target = columns[index];\n const valueMap = referenceMap(column.meta, refs);\n for (let row = 0; row < column.length; row++) {\n if (!column.isSet(row)) {\n continue;\n }\n let value = column.value(row);\n if (valueMap !== null) {\n value = remapReference(value, valueMap);\n if (value === void 0) {\n continue;\n }\n }\n target.write(rowMap[row], value);\n }\n }\n /**\n * Append the rows of a snapshot extension table (addGraph): into the table of the same name when\n * the columns match, else a new table is declared from the source columns.\n * @param name - the table name\n * @param table - the source table\n * @param refs - source node / edge index -> builder index\n */\n appendExtension(name, table, refs) {\n const { staging } = this;\n const sourceColumns = [...table];\n let target = staging.extensions.find((t) => t.name === name);\n if (target === void 0) {\n const decls = sourceColumns.map(\n (column) => ({ ...metaToDecl(column.meta), name: column.meta.name })\n );\n const handle = this.addExtensionTable(name, decls);\n target = staging.extensions[handle];\n }\n const targetColumns = target.columns;\n const first = target.rowCount;\n for (const column of sourceColumns) {\n const into = targetColumns.find((c) => c.meta.name === column.meta.name);\n if (into === void 0) {\n throw new GraphFormatError(\n \"E_UNKNOWN_COLUMN\",\n `extension table \"${name}\" has no column \"${column.meta.name}\"`,\n { table: name, column: column.meta.name }\n );\n }\n const valueMap = referenceMap(column.meta, refs);\n for (let row = 0; row < column.length; row++) {\n if (!column.isSet(row)) {\n into.ensureLength(first + row + 1);\n continue;\n }\n let value = column.value(row);\n if (valueMap !== null) {\n value = remapReference(value, valueMap);\n if (value === void 0) {\n into.ensureLength(first + row + 1);\n continue;\n }\n }\n into.write(first + row, value);\n }\n }\n for (const column of targetColumns) {\n column.ensureLength(first + table.rowCount);\n }\n target.rowCount = first + table.rowCount;\n }\n}\nfunction checkRole(columns, meta, where) {\n if (meta.role === null) {\n return;\n }\n const holder = columns.find((column) => column.meta.name !== meta.name && column.meta.role === meta.role);\n if (holder !== void 0) {\n throw new GraphFormatError(\n \"E_DUPLICATE_ROLE\",\n `role \"${meta.role}\" is already held by column \"${holder.meta.name}\" in ${where}`,\n { role: meta.role, column: meta.name, holder: holder.meta.name }\n );\n }\n}\nfunction wider(a, b) {\n return wideningRank(a) >= wideningRank(b) ? a : b;\n}\nfunction referenceMap(meta, refs) {\n switch (meta.refersTo) {\n case \"node\":\n return refs.node;\n case \"edge\":\n return refs.edge;\n default:\n return null;\n }\n}\nfunction remapReference(value, map) {\n if (typeof value === \"number\") {\n return value < map.length ? map[value] : void 0;\n }\n if (typeof value === \"object\" && value !== null) {\n const items = Array.from(value);\n const kept = items.filter((item) => item < map.length).map((item) => map[item]);\n return kept.length === 0 && items.length > 0 ? void 0 : kept;\n }\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `a refersTo cell holds a ${typeof value}, not an index or a list`, {\n found: typeof value,\n reason: \"refersTo\"\n });\n}\nfunction buildGraphColumn(name, value, decl) {\n const column = createStagingColumn(\n name,\n \"graph\",\n decl.dtype === void 0 ? { ...decl, dtype: inferInitialDtype(value) } : decl,\n decl.dtype === void 0\n );\n column.write(0, value);\n}\nfunction stagingColumnFromTypedArray(domain, rows, name, data, decl, bounds) {\n const arrayDtype = dtypeOfArray(data);\n const dtype = decl.dtype ?? arrayDtype;\n const compatible = dtype === arrayDtype || arrayDtype === \"u32\" && (dtype === \"bool\" || dtype === \"dict\");\n if (!compatible) {\n throw new GraphFormatError(\n \"E_COLUMN_TYPE\",\n `column \"${name}\": a ${arrayDtype} array cannot back a ${dtype} column`,\n {\n column: name,\n field: \"dtype\",\n found: arrayDtype,\n expected: dtype\n }\n );\n }\n const column = createStagingColumn(name, domain, { nullable: false, ...decl, dtype }, false);\n const { components } = column.meta;\n let expected;\n switch (dtype) {\n case \"bool\":\n expected = Math.ceil(rows / 32);\n break;\n case \"dict\":\n expected = rows;\n break;\n case \"f32\":\n case \"f64\":\n case \"i32\":\n case \"u32\":\n case \"u8\":\n expected = rows * components;\n break;\n default:\n throw new GraphFormatError(\n \"E_COLUMN_TYPE\",\n `column \"${name}\": a ${String(dtype)} column cannot adopt a typed array`,\n {\n column: name,\n field: \"dtype\"\n }\n );\n }\n if (data.length !== expected) {\n throw new GraphFormatError(\n \"E_COLUMN_LENGTH\",\n `column \"${name}\": array length ${data.length}, expected ${expected}`,\n {\n column: name,\n expected,\n found: data.length\n }\n );\n }\n column.ensureLength(rows);\n switch (dtype) {\n case \"bool\": {\n const words = data;\n for (let row = 0; row < rows; row++) {\n column.write(row, (words[row >>> 5] >>> (row & 31) & 1) === 1);\n }\n break;\n }\n case \"dict\": {\n const { dictionary } = column;\n if (dictionary === null) {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `column \"${name}\" has no dictionary`, { column: name });\n }\n for (let row = 0; row < rows; row++) {\n const code = data[row];\n if (code >= dictionary.size) {\n throw new GraphFormatError(\n \"E_COLUMN_TYPE\",\n `column \"${name}\": code ${code} at row ${row} is outside the ${dictionary.size} declared options`,\n {\n column: name,\n row,\n code\n }\n );\n }\n column.write(row, dictionary.values[code]);\n }\n break;\n }\n default: {\n const { typed } = column;\n if (typed === null) {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", `column \"${name}\" has no typed storage`, { column: name });\n }\n const { refersTo } = column.meta;\n const bound = refersTo === \"node\" ? bounds.node : bounds.edge;\n for (let i = 0; i < data.length; i++) {\n const value = data[i];\n if (refersTo !== null && value !== INVALID_INDEX && value >= bound) {\n throw new GraphFormatError(\n \"E_INDEX_RANGE\",\n `column \"${name}\" refers to ${refersTo} ${value} at row ${i}, which is not below ${bound}`,\n { column: name, row: i, refersTo, found: value, bound }\n );\n }\n if (refersTo !== null && value === INVALID_INDEX && column.validity === null) {\n throw new GraphFormatError(\n \"E_COLUMN_TYPE\",\n `column \"${name}\": row ${i} of a non-nullable refersTo column holds INVALID_INDEX`,\n { column: name, row: i, field: \"nullable\" }\n );\n }\n typed.set(i, value);\n }\n if (column.validity !== null) {\n for (let row = 0; row < rows; row++) {\n column.validity.set(row, refersTo === null || data[row] !== INVALID_INDEX);\n }\n }\n break;\n }\n }\n return column;\n}\nconst FLAG_NAMES = [\n \"multigraph\",\n \"hasSelfLoops\",\n \"arcToEdgeIsIdentity\",\n \"weighted\",\n \"allWeightsOne\",\n \"nonNegativeWeights\",\n \"finiteWeights\"\n];\nconst VALIDATION_LEVELS = /* @__PURE__ */ new Set([\"none\", \"structure\", \"full\"]);\nfunction arrayTypeError(name, expected) {\n return new GraphFormatError(\"E_INVALID_SNAPSHOT\", `${name} must be a ${expected}`, {\n array: name,\n expected,\n reason: \"dtype\"\n });\n}\nfunction checkShape(input) {\n if (!Number.isInteger(input.nodeCount) || input.nodeCount < 0 || input.nodeCount > MAX_COUNT) {\n throw new GraphFormatError(\"E_TOO_LARGE\", `nodeCount ${input.nodeCount} is not an integer in [0, MAX_COUNT]`, {\n count: input.nodeCount,\n max: MAX_COUNT\n });\n }\n if (!(input.rowPtr instanceof Uint32Array)) {\n throw arrayTypeError(\"rowPtr\", \"Uint32Array\");\n }\n if (!(input.colIdx instanceof Uint32Array)) {\n throw arrayTypeError(\"colIdx\", \"Uint32Array\");\n }\n if (input.weights !== void 0 && input.weights !== null && !(input.weights instanceof Float32Array)) {\n throw arrayTypeError(\"weights\", \"Float32Array\");\n }\n if (input.arcToEdge !== void 0 && !(input.arcToEdge instanceof Uint32Array)) {\n throw arrayTypeError(\"arcToEdge\", \"Uint32Array\");\n }\n if (input.edgeToArc !== void 0 && !(input.edgeToArc instanceof Uint32Array)) {\n throw arrayTypeError(\"edgeToArc\", \"Uint32Array\");\n }\n if (input.edgeCount !== void 0 && (!Number.isInteger(input.edgeCount) || input.edgeCount < 0)) {\n throw invariantViolation(\"I3\", `edgeCount ${input.edgeCount} is not a non-negative integer`, {\n count: \"edgeCount\",\n found: input.edgeCount\n });\n }\n if (input.rowPtr.length !== input.nodeCount + 1) {\n throw invariantViolation(\"I1\", `rowPtr has ${input.rowPtr.length} entries, expected ${input.nodeCount + 1}`, {\n expected: input.nodeCount + 1,\n found: input.rowPtr.length\n });\n }\n}\nfunction overPlainBuffer(array) {\n return isOverPlainBuffer(array);\n}\nfunction deriveEdgeToArc(arcToEdge, edgeCount) {\n const edgeToArc = new Uint32Array(edgeCount).fill(INVALID_INDEX);\n for (let a = 0; a < arcToEdge.length; a++) {\n const e = arcToEdge[a];\n if (e < edgeCount && edgeToArc[e] === INVALID_INDEX) {\n edgeToArc[e] = a;\n }\n }\n return edgeToArc;\n}\nfunction identityError(message, details) {\n return invariantViolation(\"I5\", message, details);\n}\nfunction resolveCore(input, level) {\n const { directed, nodeCount, rowPtr, colIdx } = input;\n const arcCount = colIdx.length;\n const weights = input.weights ?? null;\n const selfLoopCount = countLoopArcs(rowPtr, colIdx, nodeCount);\n let arcToEdge = input.arcToEdge ?? null;\n let edgeToArc = input.edgeToArc ?? null;\n let edgeCount;\n if (directed) {\n edgeCount = input.edgeCount ?? arcCount;\n if (edgeCount !== arcCount) {\n throw invariantViolation(\"I6\", `directed input has arcCount ${arcCount} but edgeCount ${edgeCount}`, {\n arcCount,\n edgeCount\n });\n }\n const identity = arcToEdge === null || arcToEdge.length === arcCount && isIdentity(arcToEdge);\n if (identity) {\n if (edgeToArc !== null && level !== \"none\" && (edgeToArc.length !== edgeCount || !isIdentity(edgeToArc))) {\n throw identityError(\"arcToEdge is the identity but edgeToArc is not\", {\n array: \"edgeToArc\",\n found: edgeToArc.length,\n expected: edgeCount\n });\n }\n arcToEdge = null;\n edgeToArc = null;\n } else if (edgeToArc === null) {\n edgeToArc = deriveEdgeToArc(arcToEdge, edgeCount);\n }\n } else {\n if (arcToEdge === null) {\n throw identityError(\"an undirected input must supply arcToEdge\", {\n array: \"arcToEdge\",\n reason: \"missing arcToEdge\"\n });\n }\n const { edgeCount: given } = input;\n if (given === void 0) {\n let max = -1;\n for (let a = 0; a < arcToEdge.length; a++) {\n if (arcToEdge[a] > max) {\n max = arcToEdge[a];\n }\n }\n edgeCount = max + 1;\n } else {\n edgeCount = given;\n }\n edgeToArc ??= deriveEdgeToArc(arcToEdge, edgeCount);\n }\n return { rowPtr, colIdx, weights, arcToEdge, edgeToArc, edgeCount, arcCount, selfLoopCount };\n}\nfunction coreArraysOf(core, arena) {\n return {\n rowPtr: core.rowPtr,\n colIdx: core.colIdx,\n weights: core.weights,\n arcToEdge: core.arcToEdge,\n edgeToArc: core.edgeToArc,\n arena\n };\n}\nfunction detectArena(core) {\n const { buffer } = core.rowPtr;\n if (!(buffer instanceof ArrayBuffer)) {\n return null;\n }\n const base = core.rowPtr.byteOffset;\n const arrays = [\n core.rowPtr,\n core.colIdx,\n core.weights,\n core.arcToEdge,\n core.edgeToArc\n ];\n const segments = {\n rowPtr: null,\n colIdx: null,\n weights: null,\n arcToEdge: null,\n edgeToArc: null\n };\n let cursor = base;\n let hotEnd = base;\n for (let i = 0; i < CORE_ORDER.length; i++) {\n const array = arrays[i];\n if (array === null || array.byteLength === 0) {\n continue;\n }\n if (array.buffer !== buffer || array.byteOffset < cursor || (array.byteOffset - base) % ALIGNMENT !== 0) {\n return null;\n }\n segments[CORE_ORDER[i]] = Object.freeze({ byteOffset: array.byteOffset, byteLength: array.byteLength });\n cursor = array.byteOffset + array.byteLength;\n if (i <= 2) {\n hotEnd = cursor;\n }\n }\n return Object.freeze({\n buffer,\n byteOffset: base,\n byteLength: cursor - base,\n alignment: ALIGNMENT,\n segments: Object.freeze(segments),\n hotByteLength: hotEnd - base\n });\n}\nfunction needsCopy(core) {\n const arrays = [core.rowPtr, core.colIdx, core.weights, core.arcToEdge, core.edgeToArc];\n return arrays.some((array) => array !== null && !overPlainBuffer(array));\n}\nfunction idMapOf(input, level, copy) {\n const { ids, nodeCount } = input;\n if (ids === void 0) {\n return identityNodeIdMap(nodeCount);\n }\n if (ids.length !== nodeCount) {\n throw new GraphFormatError(\n \"E_COLUMN_LENGTH\",\n `ids has ${ids.length} entries, expected nodeCount ${nodeCount}`,\n {\n field: \"ids\",\n expected: nodeCount,\n found: ids.length\n }\n );\n }\n const validate = level !== \"none\";\n if (ids instanceof Float64Array) {\n const values = copy || !overPlainBuffer(ids) ? new Float64Array(ids) : ids;\n return nodeIdMapFromF64(values, { validate });\n }\n return nodeIdMapFromIds(copy ? [...ids] : ids, nodeCount, { validate });\n}\nfunction tableOf(domain, rowCount, columns, copy) {\n const table = createTable(domain, rowCount);\n if (columns === void 0) {\n return table;\n }\n const copied = {};\n for (const name of Object.keys(columns)) {\n const value = columns[name];\n if (ArrayBuffer.isView(value)) {\n copied[name] = copy || !overPlainBuffer(value) ? value.slice() : value;\n } else if (ArrayBuffer.isView(value.data)) {\n copied[name] = copy || !overPlainBuffer(value.data) ? { data: value.data.slice(), decl: value.decl } : value;\n } else {\n copied[name] = value;\n }\n }\n return tableWithColumns(table, copied);\n}\nfunction resolveGraphMeta(patch) {\n return patch === void 0 ? EMPTY_GRAPH_META : resolveGraphMeta$1(EMPTY_GRAPH_META, patch);\n}\nfunction fullyClaimed(claims) {\n return claims !== void 0 && FLAG_NAMES.every((name) => claims[name] !== void 0);\n}\nfunction flagsOf(directed, nodeCount, core, selfLoopCount) {\n return computeFlags({\n directed,\n nodeCount,\n rowPtr: core.rowPtr,\n colIdx: core.colIdx,\n weights: core.weights,\n arcToEdge: core.arcToEdge,\n selfLoopCount\n });\n}\nfunction verifyClaims(claims, flags) {\n if (claims === void 0) {\n return;\n }\n for (const name of FLAG_NAMES) {\n const claim = claims[name];\n if (claim !== void 0 && claim !== flags[name]) {\n throw invariantViolation(\"I9\", `flag ${name} is claimed ${claim} but the arrays say ${flags[name]}`, {\n flag: name,\n found: claim,\n expected: flags[name]\n });\n }\n }\n}\nfunction rowsSorted(s) {\n const { rowPtr, colIdx, nodeCount } = s;\n const arcToEdge = s.flags.arcToEdgeIsIdentity ? null : s.arcToEdge;\n for (let u = 0; u < nodeCount; u++) {\n const end = rowPtr[u + 1];\n for (let a = rowPtr[u] + 1; a < end; a++) {\n if (colIdx[a] < colIdx[a - 1]) {\n return false;\n }\n if (colIdx[a] === colIdx[a - 1] && arcToEdge !== null && arcToEdge[a] <= arcToEdge[a - 1]) {\n return false;\n }\n }\n }\n return true;\n}\nfunction declaredEdges(s) {\n const { nodeCount, edgeCount, rowPtr, colIdx, weights } = s;\n const identity = s.flags.arcToEdgeIsIdentity;\n const src = new Uint32Array(edgeCount);\n const dst = new Uint32Array(edgeCount);\n const edgeWeights = weights === null ? null : new Float32Array(edgeCount);\n const arcToEdge = identity ? null : s.arcToEdge;\n const edgeToArc = identity ? null : s.edgeToArc;\n for (let u = 0; u < nodeCount; u++) {\n const end = rowPtr[u + 1];\n for (let a = rowPtr[u]; a < end; a++) {\n const e = arcToEdge === null ? a : arcToEdge[a];\n if (edgeToArc !== null && edgeToArc[e] !== a) {\n continue;\n }\n src[e] = u;\n dst[e] = colIdx[a];\n if (edgeWeights !== null && weights !== null) {\n edgeWeights[e] = weights[a];\n }\n }\n }\n return { src, dst, weights: edgeWeights };\n}\nfunction compareRows(input, rebuilt) {\n const { nodeCount } = input;\n for (let u = 0; u <= nodeCount; u++) {\n if (input.rowPtr[u] !== rebuilt.rowPtr[u]) {\n throw invariantViolation(\"I7\", `row ${u - 1} holds arcs whose mates are missing from their rows`, {\n row: Math.max(0, u - 1),\n found: input.rowPtr[u],\n expected: rebuilt.rowPtr[u]\n });\n }\n }\n const inArcToEdge = input.arcToEdge;\n const outArcToEdge = rebuilt.arcToEdge;\n const inWeights = input.weights;\n const outWeights = rebuilt.weights;\n for (let u = 0; u < nodeCount; u++) {\n const start = input.rowPtr[u];\n const end = input.rowPtr[u + 1];\n const order = new Uint32Array(end - start);\n for (let i = 0; i < order.length; i++) {\n order[i] = start + i;\n }\n order.sort((x, y) => input.colIdx[x] - input.colIdx[y] || inArcToEdge[x] - inArcToEdge[y]);\n for (let i = 0; i < order.length; i++) {\n const a = order[i];\n const b = start + i;\n const sameArc = input.colIdx[a] === rebuilt.colIdx[b] && inArcToEdge[a] === outArcToEdge[b];\n const sameWeight = inWeights === null || outWeights === null || inWeights[a] === outWeights[b];\n if (!sameArc || !sameWeight) {\n throw invariantViolation(\"I7\", `arc ${a} in row ${u} has no matching mate`, {\n row: u,\n arc: a,\n target: input.colIdx[a],\n edge: inArcToEdge[a]\n });\n }\n }\n }\n}\nfunction rebuildSorted(candidate, parts) {\n const edges = declaredEdges(candidate);\n const sorted = sortIntoCore(\n {\n directed: candidate.directed,\n nodeCount: candidate.nodeCount,\n edgeCount: candidate.edgeCount,\n src: edges.src,\n dst: edges.dst,\n weights: edges.weights\n },\n true\n );\n return {\n ...parts,\n arcCount: sorted.arcCount,\n selfLoopCount: sorted.selfLoopCount,\n rowPtr: sorted.core.rowPtr,\n colIdx: sorted.core.colIdx,\n weights: sorted.core.weights,\n arcToEdge: sorted.core.arcToEdge,\n edgeToArc: sorted.core.edgeToArc,\n flags: sorted.flags,\n arena: sorted.core.arena\n };\n}\nfunction orderIndependentFullChecks(s) {\n checkI5Orientation(s);\n checkI6(s, true);\n checkI8NaN(s);\n checkI11Bijection(s);\n const tables = [\n [\"nodes\", s.nodes],\n [\"edges\", s.edges],\n [\"graph\", s.graph]\n ];\n for (const [name, table] of tables) {\n for (const column of table) {\n checkUniqueColumn(name, column);\n }\n }\n}\nfunction resolveOptions(options) {\n const level = options.validate ?? \"full\";\n if (!VALIDATION_LEVELS.has(level)) {\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unsupported validation level ${level}`, {\n field: \"validate\",\n found: level,\n reason: \"unsupported option\"\n });\n }\n return { level, copy: options.copy === true, sortRows: options.sortRows !== false };\n}\nfunction fromCsr(input, options = {}) {\n const { level, copy, sortRows } = resolveOptions(options);\n checkShape(input);\n const resolved = resolveCore(input, level);\n const { directed, nodeCount } = input;\n const claims = input.flags;\n let core;\n if (copy || needsCopy(resolved)) {\n core = copyCoreIntoArena(coreArraysOf(resolved, null));\n } else {\n core = coreArraysOf(resolved, detectArena(resolved));\n }\n const trustClaims = level !== \"full\";\n let flags;\n if (trustClaims && fullyClaimed(claims)) {\n flags = applyClaims(\n {\n ...claims,\n weighted: core.weights !== null,\n arcToEdgeIsIdentity: directed && core.arcToEdge === null\n },\n claims\n );\n } else {\n const computed = flagsOf(directed, nodeCount, core, resolved.selfLoopCount);\n flags = trustClaims ? applyClaims(computed, claims) : computed;\n }\n const parts = {\n label: null,\n serial: null,\n directed,\n nodeCount,\n edgeCount: resolved.edgeCount,\n arcCount: resolved.arcCount,\n selfLoopCount: resolved.selfLoopCount,\n rowPtr: core.rowPtr,\n colIdx: core.colIdx,\n weights: core.weights,\n arcToEdge: core.arcToEdge,\n edgeToArc: core.edgeToArc,\n flags,\n ids: idMapOf(input, level, copy),\n nodes: tableOf(\"node\", nodeCount, input.nodeColumns, copy),\n edges: tableOf(\"edge\", resolved.edgeCount, input.edgeColumns, copy),\n graph: createTable(\"graph\", 1),\n extensions: /* @__PURE__ */ new Map(),\n meta: resolveGraphMeta(input.meta),\n arena: core.arena,\n checksum: false\n };\n const candidate = createSnapshot(parts);\n if (sortRows && !rowsSorted(candidate)) {\n if (level !== \"none\") {\n validateStructure(candidate);\n }\n if (level === \"full\") {\n orderIndependentFullChecks(candidate);\n }\n const rebuiltParts = rebuildSorted(candidate, parts);\n const rebuilt = createSnapshot({\n ...rebuiltParts,\n flags: trustClaims ? applyClaims(rebuiltParts.flags, claims) : rebuiltParts.flags\n });\n if (level === \"full\") {\n if (!directed) {\n compareRows(candidate, rebuilt);\n }\n verifyClaims(claims, rebuilt.flags);\n }\n return rebuilt;\n }\n if (level === \"structure\") {\n validateStructure(candidate);\n } else if (level === \"full\") {\n validateFull(candidate);\n verifyClaims(claims, candidate.flags);\n }\n return candidate;\n}\nconst PRESENCE_FLAGS = [\"weighted\", \"arcToEdgeIsIdentity\"];\nfunction applyClaims(computed, claims) {\n if (claims === void 0) {\n return computed;\n }\n const out = { ...computed };\n for (const name of FLAG_NAMES) {\n const value = claims[name];\n if (value === void 0) {\n continue;\n }\n if (PRESENCE_FLAGS.includes(name)) {\n if (value !== computed[name]) {\n throw invariantViolation(\n \"I9\",\n `flag ${name} is claimed ${value} but the arrays say ${computed[name]}`,\n {\n flag: name,\n found: value,\n expected: computed[name]\n }\n );\n }\n continue;\n }\n out[name] = value;\n }\n return out;\n}\nfunction splitOptions(directed, options) {\n if (options.directed !== void 0 && options.directed !== directed) {\n throw new GraphFormatError(\n \"E_DIRECTED\",\n `options.directed (${String(options.directed)}) disagrees with the input's directed (${String(directed)})`,\n { reason: \"direction mismatch\", directed, found: options.directed }\n );\n }\n return {\n builder: {\n directed,\n weighted: options.weighted,\n weightDtype: options.weightDtype,\n duplicateEdges: options.duplicateEdges,\n selfLoops: options.selfLoops,\n addMissingNodes: options.addMissingNodes,\n expectedNodes: options.expectedNodes,\n expectedEdges: options.expectedEdges\n },\n freeze: {\n label: options.label,\n prepare: options.prepare,\n arena: options.arena,\n release: options.release,\n profile: options.profile,\n checksum: options.checksum\n }\n };\n}\nfunction isTypedArrayData(value) {\n return ArrayBuffer.isView(value);\n}\nfunction stageColumn(builder, domain, rows, name, value) {\n const data = isTypedArrayData(value) ? value : value.data;\n const decl = isTypedArrayData(value) ? {} : value.decl;\n if (ArrayBuffer.isView(data)) {\n if (domain === \"node\") {\n builder.setNodeColumn(name, data, decl);\n } else {\n builder.setEdgeColumn(name, data, decl);\n }\n return;\n }\n const column = columnFromValues(domain, rows, name, data, decl);\n const declaration = { ...metaToDecl(column.meta), name, dtype: column.dtype };\n const handle = domain === \"node\" ? builder.declareNodeColumn(declaration) : builder.declareEdgeColumn(declaration);\n for (let row = 0; row < rows; row++) {\n if (!column.isSet(row)) {\n continue;\n }\n const cell = column.value(row);\n if (domain === \"node\") {\n builder.setNodeValue(handle, row, cell);\n } else {\n builder.setEdgeValue(handle, row, cell);\n }\n }\n}\nfunction lengthError(field, expected, found) {\n return new GraphFormatError(\"E_COLUMN_LENGTH\", `${field} has ${found} entries, expected ${expected}`, {\n field,\n expected,\n found\n });\n}\nfunction resolveNodeCount(input) {\n const { nodeCount, ids } = input;\n if (nodeCount !== void 0 && (!Number.isInteger(nodeCount) || nodeCount < 0)) {\n throw new GraphFormatError(\"E_INDEX_RANGE\", `nodeCount ${nodeCount} is not a non-negative integer`, {\n field: \"nodeCount\",\n found: nodeCount\n });\n }\n if (ids !== void 0) {\n if (nodeCount !== void 0 && nodeCount !== ids.length) {\n throw lengthError(\"ids\", nodeCount, ids.length);\n }\n return ids.length;\n }\n if (nodeCount === void 0) {\n throw new GraphFormatError(\"E_INDEX_RANGE\", \"nodeCount is required when no ids are given\", {\n field: \"nodeCount\"\n });\n }\n return nodeCount;\n}\nfunction addIds(builder, ids) {\n const indices = builder.addNodes(ids);\n for (let i = 0; i < indices.length; i++) {\n if (indices[i] !== i) {\n const id = ids[i];\n throw new GraphFormatError(\"E_DUPLICATE_ID\", `ids[${i}] repeats the id of index ${indices[i]}`, {\n id,\n index: indices[i],\n position: i\n });\n }\n }\n}\nfunction fromEdgeArrays(input, options = {}) {\n const { src, dst, weights } = input;\n if (dst.length !== src.length) {\n throw lengthError(\"dst\", src.length, dst.length);\n }\n if (weights !== void 0 && weights.length !== src.length) {\n throw lengthError(\"weights\", src.length, weights.length);\n }\n const nodeCount = resolveNodeCount(input);\n const edgeCount = src.length;\n const split = splitOptions(input.directed, options);\n const builderOptions = {\n ...split.builder,\n weightDtype: options.weightDtype ?? (weights instanceof Float64Array ? \"f64\" : void 0),\n expectedNodes: options.expectedNodes ?? nodeCount,\n expectedEdges: options.expectedEdges ?? edgeCount\n };\n const builder = new GraphBuilder(builderOptions);\n if (input.ids === void 0) {\n builder.addAnonymousNodes(nodeCount);\n } else {\n addIds(builder, input.ids);\n }\n builder.addEdges(src, dst, weights);\n if (input.nodeColumns !== void 0) {\n for (const name of Object.keys(input.nodeColumns)) {\n stageColumn(builder, \"node\", nodeCount, name, input.nodeColumns[name]);\n }\n }\n if (input.edgeColumns !== void 0) {\n for (const name of Object.keys(input.edgeColumns)) {\n stageColumn(builder, \"edge\", edgeCount, name, input.edgeColumns[name]);\n }\n }\n if (input.meta !== void 0) {\n builder.setMeta(input.meta);\n }\n return builder.freeze(split.freeze);\n}\nconst SOURCE_KEYS = [\"source\", \"src\", \"from\"];\nconst TARGET_KEYS = [\"target\", \"dst\", \"to\"];\nconst CANONICAL_INTEGER = /^-?(0|[1-9][0-9]*)$/;\nfunction hasKey(record, key) {\n return Object.prototype.hasOwnProperty.call(record, key);\n}\nfunction invalidId(field, value, rule) {\n return new GraphFormatError(\n \"E_INVALID_ID\",\n `${field} value of type ${typeof value} is not a legal id under \"${rule}\"`,\n {\n field,\n found: typeof value,\n rule\n }\n );\n}\nfunction coerceId(value, rule, field) {\n switch (rule) {\n case \"keep\":\n if (typeof value === \"string\" || typeof value === \"number\") {\n return value;\n }\n throw invalidId(field, value, rule);\n case \"canonical\":\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\") {\n if (CANONICAL_INTEGER.test(value) && value !== \"-0\") {\n const n = Number(value);\n return Number.isSafeInteger(n) ? n : value;\n }\n return value;\n }\n throw invalidId(field, value, rule);\n case \"string\":\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\" || value === null) {\n return String(value);\n }\n throw invalidId(field, value, rule);\n case \"number\":\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\") {\n return Number(value);\n }\n throw invalidId(field, value, rule);\n default: {\n const name = rule;\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown id coercion \"${name}\"`, {\n field: \"ids\",\n found: name,\n reason: \"unsupported option\"\n });\n }\n }\n}\nfunction endpointOf(record, explicit, defaults) {\n if (explicit !== void 0) {\n return { key: hasKey(record, explicit) ? explicit : null, value: record[explicit] };\n }\n for (const key of defaults) {\n if (hasKey(record, key)) {\n return { key, value: record[key] };\n }\n }\n return { key: null, value: void 0 };\n}\nfunction missingEndpoint(field, keys, edge) {\n return new GraphFormatError(\n \"E_INVALID_ID\",\n `edge record ${edge} has no ${field} (keys tried: ${keys.join(\", \")})`,\n {\n field,\n keys: [...keys],\n edge,\n reason: \"missing endpoint\"\n }\n );\n}\nclass AttributePolicy {\n /**\n * Resolve the `columns` option.\n * @param columns - the option value; default \"infer\"\n */\n constructor(columns) {\n this.handles = { node: /* @__PURE__ */ new Map(), edge: /* @__PURE__ */ new Map() };\n if (columns === void 0 || columns === \"infer\") {\n this.mode = \"infer\";\n this.declared = /* @__PURE__ */ new Map();\n return;\n }\n if (columns === \"json\" || columns === \"none\") {\n this.mode = columns;\n this.declared = /* @__PURE__ */ new Map();\n return;\n }\n if (typeof columns === \"string\") {\n const found = columns;\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unsupported columns option \"${found}\"`, {\n field: \"columns\",\n found,\n reason: \"unsupported option\"\n });\n }\n const declared = /* @__PURE__ */ new Map();\n const list = columns;\n for (const decl of list) {\n if (typeof decl.name !== \"string\" || decl.name.length === 0) {\n throw new GraphFormatError(\"E_COLUMN_TYPE\", \"a column declaration needs a non-empty name\", {\n field: \"name\",\n found: decl.name\n });\n }\n if (declared.has(decl.name)) {\n throw new GraphFormatError(\"E_COLUMN_EXISTS\", `column \"${decl.name}\" is declared twice`, {\n column: decl.name\n });\n }\n declared.set(decl.name, decl);\n }\n this.mode = \"declared\";\n this.declared = declared;\n }\n /**\n * Whether any attribute key is read at all.\n * @returns false under \"none\"\n */\n get readsAttributes() {\n return this.mode !== \"none\";\n }\n /**\n * Write one attribute cell according to the policy.\n * @param builder - the builder\n * @param domain - \"node\" or \"edge\"\n * @param row - the node index or logical edge index\n * @param key - the record key\n * @param value - the cell value\n */\n write(builder, domain, row, key, value) {\n switch (this.mode) {\n case \"none\":\n return;\n case \"infer\":\n if (domain === \"node\") {\n builder.setNodeValue(key, row, value);\n } else {\n builder.setEdgeValue(key, row, value);\n }\n return;\n case \"json\":\n case \"declared\": {\n const handle = this.handleOf(builder, domain, key);\n if (handle === null) {\n return;\n }\n if (domain === \"node\") {\n builder.setNodeValue(handle, row, value);\n } else {\n builder.setEdgeValue(handle, row, value);\n }\n return;\n }\n default: {\n const name = this.mode;\n throw new GraphFormatError(\"E_UNSUPPORTED\", `unknown attribute mode ${name}`, { found: name });\n }\n }\n }\n /**\n * The handle of a key's column in one table, declaring it on first use: a json column under\n * \"json\", the caller's declaration under \"declared\" (an undeclared key has no column).\n * @param builder - the builder\n * @param domain - \"node\" or \"edge\"\n * @param key - the record key\n * @returns the handle, or null when the key is not stored\n */\n handleOf(builder, domain, key) {\n const cache = this.handles[domain];\n const cached = cache.get(key);\n if (cached !== void 0) {\n return cached;\n }\n let decl;\n if (this.mode === \"json\") {\n decl = { name: key, dtype: \"json\" };\n } else {\n const declared = this.declared.get(key);\n if (declared === void 0) {\n return null;\n }\n decl = declared;\n }\n const handle = domain === \"node\" ? builder.declareNodeColumn(decl) : builder.declareEdgeColumn(decl);\n cache.set(key, handle);\n return handle;\n }\n}\nfunction rulesOf(input) {\n return {\n nodeId: input.nodeId === void 0 ? \"id\" : input.nodeId,\n edgeSource: input.edgeSource,\n edgeTarget: input.edgeTarget,\n edgeWeight: input.edgeWeight === void 0 ? \"weight\" : input.edgeWeight,\n ids: assertOneOf(\"ids\", input.ids, [\"keep\", \"canonical\", \"string\", \"number\"]) ?? \"keep\",\n attributes: new AttributePolicy(input.columns)\n };\n}\nfunction positionalEndpoint(builder, value, field, edge) {\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < 0) {\n throw new GraphFormatError(\n \"E_INVALID_ID\",\n `edge record ${edge}: ${field} ${String(value)} is not a node index`,\n {\n field,\n found: value,\n edge,\n reason: \"not an index\"\n }\n );\n }\n const bound = builder.nodeBound;\n if (value >= bound) {\n if (!builder.options.addMissingNodes) {\n throw new GraphFormatError(\"E_UNKNOWN_NODE\", `edge record ${edge}: node index ${value} does not exist`, {\n index: value,\n field,\n edge\n });\n }\n builder.addAnonymousNodes(value - bound + 1);\n }\n return value;\n}\nfunction weightOf(record, key, edge) {\n if (!hasKey(record, key)) {\n return void 0;\n }\n const raw = record[key];\n if (raw === void 0 || raw === null) {\n return void 0;\n }\n if (typeof raw !== \"number\") {\n throw new GraphFormatError(\"E_INVALID_WEIGHT\", `edge record ${edge}: weight \"${key}\" is not a number`, {\n key,\n found: typeof raw,\n edge\n });\n }\n return raw;\n}\nfunction pushNodes(builder, rules, nodes) {\n const { nodeId, attributes } = rules;\n let position = 0;\n for (const record of nodes) {\n let index;\n if (nodeId === null) {\n index = builder.addAnonymousNodes(1);\n } else {\n if (!hasKey(record, nodeId)) {\n throw new GraphFormatError(\"E_INVALID_ID\", `node record ${position} has no \"${nodeId}\" key`, {\n field: nodeId,\n node: position,\n reason: \"missing id\"\n });\n }\n index = builder.addNode(coerceId(record[nodeId], rules.ids, nodeId));\n }\n if (attributes.readsAttributes) {\n for (const key of Object.keys(record)) {\n if (key !== nodeId) {\n attributes.write(builder, \"node\", index, key, record[key]);\n }\n }\n }\n position++;\n }\n}\nfunction pushEdges(builder, rules, edges) {\n const { nodeId, edgeWeight, attributes } = rules;\n let position = 0;\n for (const record of edges) {\n const source = endpointOf(record, rules.edgeSource, SOURCE_KEYS);\n const target = endpointOf(record, rules.edgeTarget, TARGET_KEYS);\n if (source.key === null) {\n throw missingEndpoint(\n \"source\",\n rules.edgeSource === void 0 ? SOURCE_KEYS : [rules.edgeSource],\n position\n );\n }\n if (target.key === null) {\n throw missingEndpoint(\n \"target\",\n rules.edgeTarget === void 0 ? TARGET_KEYS : [rules.edgeTarget],\n position\n );\n }\n const weight = edgeWeight === null ? void 0 : weightOf(record, edgeWeight, position);\n let edge;\n if (nodeId === null) {\n const u = positionalEndpoint(builder, source.value, \"source\", position);\n const v = positionalEndpoint(builder, target.value, \"target\", position);\n edge = builder.addEdgeByIndex(u, v, weight);\n } else {\n edge = builder.addEdge(\n coerceId(source.value, rules.ids, \"source\"),\n coerceId(target.value, rules.ids, \"target\"),\n weight\n );\n }\n if (attributes.readsAttributes) {\n for (const key of Object.keys(record)) {\n if (key !== source.key && key !== target.key && key !== edgeWeight) {\n attributes.write(builder, \"edge\", edge, key, record[key]);\n }\n }\n }\n position++;\n }\n}\nfunction fromRecords(input, options = {}) {\n const rules = rulesOf(input);\n const split = splitOptions(input.directed, options);\n const builderOptions = {\n ...split.builder,\n weightDtype: options.weightDtype ?? \"f64\"\n };\n const builder = new GraphBuilder(builderOptions);\n if (input.nodes !== void 0) {\n pushNodes(builder, rules, input.nodes);\n }\n pushEdges(builder, rules, input.edges);\n return builder.freezeWithReport(split.freeze);\n}\nexport {\n AttributeTable,\n FORMAT_VERSION,\n GraphBuilder,\n GraphFormatError,\n GraphSnapshot,\n INVALID_INDEX,\n MAX_COUNT,\n NodeIdMap,\n SNAPSHOT_BRAND,\n equalsTopology,\n expandEdges,\n foldArcs,\n fromByteChunks,\n fromBytes,\n fromCsr,\n fromEdgeArrays,\n fromRecords,\n fromWire,\n gatherArray,\n gatherColumn,\n gpuEligibility,\n isGraphSnapshot,\n makeMask,\n maskCount,\n maskSet,\n maskTest,\n maskToIndices,\n paddedU32View,\n remapArray,\n remapColumn,\n renumberPartition,\n scatterArray,\n withComponents\n};\n//# sourceMappingURL=graph-format.js.map\n","import { type AdjacencyView, INVALID_INDEX, type U32 } from \"@graphty/graph-format\";\n\n/** Result of the index-based BFS (graph-format design 14.2 Port 1). @public */\nexport interface BfsResult {\n /** Visit order, one entry per visited node; a subarray of length `visitedCount`. */\n readonly order: U32;\n /** Parent of every node, INVALID_INDEX for the start node and for unvisited nodes. */\n readonly parent: U32;\n /** Hop depth of every node, INVALID_INDEX for unvisited nodes. */\n readonly depth: U32;\n /** How many nodes were visited. */\n readonly visitedCount: number;\n}\n\n/** Options of the index-based BFS. @public */\nexport interface BfsOptions {\n /** Stop expanding at this depth; unbounded when omitted. */\n readonly maxDepth?: number | undefined;\n}\n\n/**\n * Breadth-first search over out-neighbours. Takes any `AdjacencyView`, so `s.reverse()` gives an\n * in-neighbour BFS with no extra code.\n * @param g - The adjacency to traverse\n * @param start - The node index to start from\n * @param options - Traversal options\n * @returns The visit order, the parent array, the depth array and the visited count\n * @public\n */\nexport function breadthFirstSearch(g: AdjacencyView, start: number, options: BfsOptions = {}): BfsResult {\n const { nodeCount, rowPtr, colIdx } = g;\n const parent = new Uint32Array(nodeCount).fill(INVALID_INDEX);\n const depth = new Uint32Array(nodeCount).fill(INVALID_INDEX);\n const order = new Uint32Array(nodeCount);\n const maxDepth = options.maxDepth ?? INVALID_INDEX;\n let head = 0;\n let tail = 0;\n order[tail++] = start;\n depth[start] = 0;\n while (head < tail) {\n const u = order[head++];\n const d = depth[u];\n if (d >= maxDepth) {\n continue;\n }\n const end = rowPtr[u + 1];\n for (let a = rowPtr[u]; a < end; a++) {\n const v = colIdx[a];\n if (depth[v] === INVALID_INDEX) {\n depth[v] = d + 1;\n parent[v] = u;\n order[tail++] = v;\n }\n }\n }\n return { order: order.subarray(0, tail), parent, depth, visitedCount: tail };\n}\n","import type { AdjacencyView, GraphSnapshot } from \"@graphty/graph-format\";\n\n/** Options of the index-based common-neighbour score. @public */\nexport interface CommonNeighborsOptions {\n /** Intersect out(u) with in(v) instead of the two undirected rows. */\n readonly directed?: boolean | undefined;\n}\n\n/**\n * The number of distinct common neighbours of two nodes, by a merge of their sorted rows.\n * @param s - The snapshot\n * @param u - A node index\n * @param v - A node index\n * @param o - Options\n * @returns The count of distinct common neighbours\n * @public\n */\nexport function commonNeighborsScore(s: GraphSnapshot, u: number, v: number, o: CommonNeighborsOptions = {}): number {\n const fwd: AdjacencyView = s;\n const bwd: AdjacencyView = o.directed === true ? s.reverse() : s;\n let i = fwd.rowPtr[u];\n const iEnd = fwd.rowPtr[u + 1];\n let j = bwd.rowPtr[v];\n const jEnd = bwd.rowPtr[v + 1];\n let count = 0;\n while (i < iEnd && j < jEnd) {\n const a = fwd.colIdx[i];\n const b = bwd.colIdx[j];\n if (a === b) {\n count++;\n i++;\n j++;\n while (i < iEnd && fwd.colIdx[i] === a) {\n i++;\n }\n while (j < jEnd && bwd.colIdx[j] === b) {\n j++;\n }\n } else if (a < b) {\n i++;\n } else {\n j++;\n }\n }\n return count;\n}\n","import { renumberPartition, type U32 } from \"@graphty/graph-format\";\n\n/**\n * Index-keyed union-find over `[0, size)` with union by rank and path halving. The legacy\n * `UnionFind` (`src/data-structures/union-find.ts`) is NodeId-keyed and stays where it is.\n * @public\n */\nexport class IntUnionFind {\n private readonly parent: U32;\n private readonly rank: U32;\n\n /**\n * Create a union-find whose every element is a singleton set.\n * @param size - The number of elements, each initially its own singleton set\n */\n constructor(size: number) {\n this.parent = new Uint32Array(size);\n this.rank = new Uint32Array(size);\n for (let i = 0; i < size; i++) {\n this.parent[i] = i;\n }\n }\n\n /**\n * Find the representative of an element's set, halving the path on the way up.\n * @param x - An element index\n * @returns The representative of x's set\n */\n find(x: number): number {\n let node = x;\n while (this.parent[node] !== node) {\n this.parent[node] = this.parent[this.parent[node]]; // path halving\n node = this.parent[node];\n }\n return node;\n }\n\n /**\n * Merge the sets of two elements, attaching the shallower tree under the deeper one.\n * @param a - An element index\n * @param b - An element index\n * @returns True when the two sets were distinct and have now been merged\n */\n union(a: number, b: number): boolean {\n const ra = this.find(a);\n const rb = this.find(b);\n if (ra === rb) {\n return false;\n }\n if (this.rank[ra] < this.rank[rb]) {\n this.parent[ra] = rb;\n } else if (this.rank[ra] > this.rank[rb]) {\n this.parent[rb] = ra;\n } else {\n this.parent[rb] = ra;\n this.rank[ra]++;\n }\n return true;\n }\n\n /**\n * Dense labels in FIRST-SEEN order, which is what makes `groups()` identical to the legacy\n * iteration order and identical to the GPU's after its own `renumberPartition` readback\n * (design 9.7's connectedComponents row).\n * @returns The labels and the number of distinct sets\n */\n toLabels(): { readonly labels: U32; readonly count: number } {\n const roots = new Uint32Array(this.parent.length);\n for (let i = 0; i < roots.length; i++) {\n roots[i] = this.find(i);\n }\n return renumberPartition(roots);\n }\n}\n","import { type GraphSnapshot, type U32 } from \"@graphty/graph-format\";\n\nimport { IntUnionFind } from \"./structures/union-find.js\";\n\n/** A partition of the node set (graph-format design 14.2's result table, line 3738). @public */\nexport interface LabelResult {\n /** Dense label per node index, in first-seen order. */\n readonly labels: U32;\n /** Number of distinct labels. */\n readonly count: number;\n /**\n * Node indices grouped by label, computed once and cached.\n * @returns One array per label\n */\n groups(): U32[];\n}\n\nfunction withGroups(labels: U32, count: number): LabelResult {\n let cached: U32[] | null = null;\n return {\n labels,\n count,\n groups(): U32[] {\n if (cached === null) {\n const sizes = new Uint32Array(count);\n for (let i = 0; i < labels.length; i++) {\n sizes[labels[i]]++;\n }\n const out: U32[] = [];\n for (let c = 0; c < count; c++) {\n out.push(new Uint32Array(sizes[c]));\n }\n const fill = new Uint32Array(count);\n for (let i = 0; i < labels.length; i++) {\n const c = labels[i];\n out[c][fill[c]++] = i;\n }\n cached = out;\n }\n return cached;\n },\n };\n}\n\nfunction unionEdges(s: GraphSnapshot): LabelResult {\n const uf = new IntUnionFind(s.nodeCount);\n const el = s.edgeList();\n for (let e = 0; e < s.edgeCount; e++) {\n uf.union(el.src[e], el.dst[e]);\n }\n const { labels, count } = uf.toLabels();\n return withGroups(labels, count);\n}\n\n/**\n * Connected components of an UNDIRECTED snapshot.\n * @param s - An undirected snapshot\n * @returns The partition\n * @public\n */\nexport function connectedComponents(s: GraphSnapshot): LabelResult {\n if (s.directed) {\n throw new Error(\n \"Connected components requires an undirected graph. Use weaklyConnectedComponents, or pass s.toUndirected().snapshot.\",\n );\n }\n return unionEdges(s);\n}\n\n/**\n * Weakly connected components: the same union-find pass with the direction check dropped.\n * @param s - Any snapshot\n * @returns The partition\n * @public\n */\nexport function weaklyConnectedComponents(s: GraphSnapshot): LabelResult {\n return unionEdges(s);\n}\n","import type { U32 } from \"@graphty/graph-format\";\n\n/**\n * The source node of an arc, by binary search on `rowPtr`. `GraphSnapshot` exposes `arcSource(a)`\n * (`graph-format/src/snapshot/graph-snapshot.ts:544`), but an `AdjacencyView` -- which is what the\n * Port 1 and Port 2 signatures take, so that `reverse()` works as an input for free -- does not,\n * so the predecessor walk carries its own.\n * @param rowPtr - The view's nodeCount + 1 row offsets\n * @param arc - An arc index in `[0, arcCount)`\n * @returns The node index whose row contains the arc\n * @public\n */\nexport function arcSourceIn(rowPtr: U32, arc: number): number {\n let lo = 0;\n let hi = rowPtr.length - 1; // nodeCount\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (rowPtr[mid + 1] <= arc) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n return lo;\n}\n","import { type F64, INVALID_INDEX, type U32 } from \"@graphty/graph-format\";\n\n/**\n * A binary min-heap over node indices with O(log n) decrease-key, keyed by `Float64Array` values\n * (graph-format design 14.2, `graph-format-design.md:3771`). `pushOrDecrease` is the only operation\n * Dijkstra's inner loop needs: it inserts an absent node and decreases a present one, so the heap\n * never holds a stale duplicate and `pop()` needs no \"is this entry current\" check.\n * @public\n */\nexport class IndexedMinHeap {\n private readonly heap: U32; // slot -> node\n private readonly slot: U32; // node -> slot, INVALID_INDEX when absent\n private readonly key: F64; // node -> key\n private size = 0;\n\n /**\n * Create an empty heap over node indices in `[0, capacity)`.\n * @param capacity - The number of distinct node indices the heap may hold\n */\n constructor(capacity: number) {\n this.heap = new Uint32Array(capacity);\n this.slot = new Uint32Array(capacity).fill(INVALID_INDEX);\n this.key = new Float64Array(capacity);\n }\n\n /**\n * Whether the heap holds no entries.\n * @returns True when the heap holds no entries\n */\n isEmpty(): boolean {\n return this.size === 0;\n }\n\n /**\n * Insert a node that is not in the heap.\n * @param node - The node index\n * @param key - Its key\n */\n push(node: number, key: number): void {\n this.key[node] = key;\n this.heap[this.size] = node;\n this.slot[node] = this.size;\n this.size++;\n this.siftUp(this.size - 1);\n }\n\n /**\n * Insert the node, or lower its key if it is already present and the new key is smaller.\n * @param node - The node index\n * @param key - Its candidate key\n */\n pushOrDecrease(node: number, key: number): void {\n const at = this.slot[node];\n if (at === INVALID_INDEX) {\n this.push(node, key);\n return;\n }\n if (key < this.key[node]) {\n this.key[node] = key;\n this.siftUp(at);\n }\n }\n\n /**\n * Remove and return the node with the smallest key. Undefined behaviour on an empty heap;\n * callers guard with `isEmpty()`.\n * @returns The node index\n */\n pop(): number {\n const top = this.heap[0];\n this.slot[top] = INVALID_INDEX;\n this.size--;\n if (this.size > 0) {\n const moved = this.heap[this.size];\n this.heap[0] = moved;\n this.slot[moved] = 0;\n this.siftDown(0);\n }\n return top;\n }\n\n private siftUp(from: number): void {\n let at = from;\n const node = this.heap[at];\n const key = this.key[node];\n while (at > 0) {\n const parent = (at - 1) >> 1;\n const parentNode = this.heap[parent];\n if (this.key[parentNode] <= key) {\n break;\n }\n this.heap[at] = parentNode;\n this.slot[parentNode] = at;\n at = parent;\n }\n this.heap[at] = node;\n this.slot[node] = at;\n }\n\n private siftDown(from: number): void {\n let at = from;\n const node = this.heap[at];\n const key = this.key[node];\n for (;;) {\n const left = 2 * at + 1;\n if (left >= this.size) {\n break;\n }\n const right = left + 1;\n const child = right < this.size && this.key[this.heap[right]] < this.key[this.heap[left]] ? right : left;\n const childNode = this.heap[child];\n if (key <= this.key[childNode]) {\n break;\n }\n this.heap[at] = childNode;\n this.slot[childNode] = at;\n at = child;\n }\n this.heap[at] = node;\n this.slot[node] = at;\n }\n}\n","import { type AdjacencyView, INVALID_INDEX, type NumericVector, type U32 } from \"@graphty/graph-format\";\n\nimport { arcSourceIn } from \"./structures/arc-source.js\";\nimport { IndexedMinHeap } from \"./structures/min-heap.js\";\n\n/**\n * Single-source shortest paths, index-based (graph-format design 14.2 Port 2, line 3860).\n * `dist` is a `NumericVector` rather than the design's `F64` because ONE declaration serves both\n * the CPU port (which produces a `Float64Array`) and the dispatcher's decoration of an\n * accelerator's f32 result (plan decision PD-3, departure DEP-8A-C).\n * @public\n */\nexport interface SsspResult {\n /** Distance per node; +Infinity for unreached nodes. */\n readonly dist: NumericVector;\n /** The ARC that relaxed each node; INVALID_INDEX for the source and for unreached nodes. */\n readonly predArc: U32;\n /**\n * Node indices from the source to `target` inclusive; empty when `target` is unreached.\n * @param target - The node index to walk back from\n */\n pathTo(target: number): U32;\n /**\n * LOGICAL EDGE indices along that path, one fewer than `pathTo`; this is what graphty-element's\n * `isInPath` writes through. Empty when `target` is unreached.\n * @param target - The node index to walk back from\n */\n pathEdges(target: number): U32;\n}\n\n/** Options of the index-based SSSP. @public */\nexport interface SsspOptions {\n /** Stop relaxing beyond this distance. */\n readonly cutoff?: number | undefined;\n /** Per-arc weight override, arcCount long -- the facade passes `expandEdges(s, shadow.data)`. */\n readonly weights?: NumericVector | undefined;\n}\n\n/**\n * Walk the predecessor arcs back from `target` and return the node path, source first.\n * @param g - The adjacency the search ran on\n * @param predArc - The search's predecessor-arc array\n * @param source - The search's source node index\n * @param target - The node to walk back from\n * @returns Node indices from source to target inclusive, or an empty array when unreached\n * @public\n */\nexport function walkPredArcs(g: AdjacencyView, predArc: U32, source: number, target: number): U32 {\n if (target === source) {\n return Uint32Array.of(source);\n }\n if (predArc[target] === INVALID_INDEX) {\n return new Uint32Array(0);\n }\n const reversed: number[] = [target];\n let node = target;\n while (node !== source) {\n node = arcSourceIn(g.rowPtr, predArc[node]);\n reversed.push(node);\n }\n const out = new Uint32Array(reversed.length);\n for (let i = 0; i < reversed.length; i++) {\n out[i] = reversed[reversed.length - 1 - i];\n }\n return out;\n}\n\n/**\n * Walk the predecessor arcs back from `target` and return the logical edges on the path.\n * @param g - The adjacency the search ran on\n * @param predArc - The search's predecessor-arc array\n * @param source - The search's source node index\n * @param target - The node to walk back from\n * @returns Logical edge indices from source to target, or an empty array when unreached\n * @public\n */\nexport function walkPredEdges(g: AdjacencyView, predArc: U32, source: number, target: number): U32 {\n if (target === source || predArc[target] === INVALID_INDEX) {\n return new Uint32Array(0);\n }\n const reversed: number[] = [];\n let node = target;\n while (node !== source) {\n const arc = predArc[node];\n reversed.push(g.arcToEdge[arc]); // the EXACT parallel edge, not a (u, v) lookup\n node = arcSourceIn(g.rowPtr, arc);\n }\n const out = new Uint32Array(reversed.length);\n for (let i = 0; i < reversed.length; i++) {\n out[i] = reversed[reversed.length - 1 - i];\n }\n return out;\n}\n\n/**\n * Dijkstra over an adjacency view, with the predecessor recorded as the relaxing ARC so a parallel\n * edge on the path is identified exactly.\n * @param g - The adjacency to search\n * @param source - The node index to start from\n * @param options - Cutoff and per-arc weight override\n * @returns The distances, the predecessor arcs, and the two path accessors\n * @public\n */\nexport function dijkstra(g: AdjacencyView, source: number, options: SsspOptions = {}): SsspResult {\n const { nodeCount, rowPtr, colIdx } = g;\n const weights: NumericVector | null = options.weights ?? g.weights;\n const dist = new Float64Array(nodeCount).fill(Infinity);\n const predArc = new Uint32Array(nodeCount).fill(INVALID_INDEX);\n const heap = new IndexedMinHeap(nodeCount);\n const cutoff = options.cutoff ?? Infinity;\n dist[source] = 0;\n heap.push(source, 0);\n while (!heap.isEmpty()) {\n const u = heap.pop();\n const du = dist[u];\n const end = rowPtr[u + 1];\n for (let a = rowPtr[u]; a < end; a++) {\n const w = weights === null ? 1 : weights[a];\n const v = colIdx[a];\n const dv = du + w;\n if (dv < dist[v] && dv <= cutoff) {\n dist[v] = dv;\n predArc[v] = a;\n heap.pushOrDecrease(v, dv);\n }\n }\n }\n return {\n dist,\n predArc,\n pathTo: (target: number): U32 => walkPredArcs(g, predArc, source, target),\n pathEdges: (target: number): U32 => walkPredEdges(g, predArc, source, target),\n };\n}\n","import type { GraphSnapshot, NumericVector, U32 } from \"@graphty/graph-format\";\n\nimport { IntUnionFind } from \"./structures/union-find.js\";\n\n/** Options of the index-based MST. @public */\nexport interface MstOptions {\n /** Per-arc weight override, arcCount long; gathered back to per-edge through `edgeToArc`. */\n readonly weights?: NumericVector | undefined;\n}\n\n/** Result of the index-based MST (graph-format design 14.2's result table, line 3745). @public */\nexport interface MstResult {\n /** Logical edge indices of the spanning forest, in the order they were accepted. */\n readonly edges: U32;\n /** Sum of the accepted edges' weights. */\n readonly totalWeight: number;\n}\n\n/**\n * Kruskal's minimum spanning forest over logical edges.\n *\n * The sort is a comparator over an f64 key array, tie-broken by edge index, rather than the\n * design's radix sort on the f32 bit pattern (plan departure DEP-8A-D): the tie-break makes it\n * stable by construction and it has to serve both the f32 arc array and an f64 override.\n * @param s - The snapshot\n * @param o - The optional per-arc weight override\n * @returns The accepted edge indices and their total weight\n * @public\n */\nexport function kruskalMST(s: GraphSnapshot, o: MstOptions = {}): MstResult {\n const el = s.edgeList();\n const m = s.edgeCount;\n const keys = new Float64Array(m);\n if (o.weights !== undefined) {\n // The override is per ARC; edgeList().arc holds the arc of each edge's declared orientation.\n for (let e = 0; e < m; e++) {\n keys[e] = o.weights[el.arc[e]];\n }\n } else if (el.weights !== null) {\n for (let e = 0; e < m; e++) {\n keys[e] = el.weights[e];\n }\n } else {\n keys.fill(1);\n }\n const order: number[] = new Array<number>(m);\n for (let e = 0; e < m; e++) {\n order[e] = e;\n }\n order.sort((a, b) => keys[a] - keys[b] || a - b);\n const uf = new IntUnionFind(s.nodeCount);\n const accepted = new Uint32Array(Math.max(s.nodeCount - 1, 0));\n let taken = 0;\n let totalWeight = 0;\n for (const e of order) {\n if (uf.union(el.src[e], el.dst[e])) {\n accepted[taken++] = e;\n totalWeight += keys[e];\n }\n }\n return { edges: accepted.subarray(0, taken), totalWeight };\n}\n","import type { F64, GraphSnapshot, NumericVector } from \"@graphty/graph-format\";\n\n/** Options of the index-based PageRank (graph-format design 14.2 Port 3, line 3892). @public */\nexport interface PageRankOptions {\n /** Probability of following a link; default 0.85. */\n readonly dampingFactor?: number | undefined;\n /** Iteration cap; default 100. */\n readonly maxIterations?: number | undefined;\n /** L1 convergence tolerance; default 1e-6. */\n readonly tolerance?: number | undefined;\n /** Use the snapshot's arc weights; default false. */\n readonly weighted?: boolean | undefined;\n}\n\n/** Result of the index-based PageRank. @public */\nexport interface PageRankResult {\n /** Score per node index. */\n readonly scores: F64;\n /** Iterations actually run. */\n readonly iterations: number;\n /** Whether the L1 delta fell below the tolerance. */\n readonly converged: boolean;\n}\n\n/**\n * PageRank by pull over `reverse()`, with the dangling mass redistributed uniformly.\n * @param s - A DIRECTED snapshot\n * @param o - Algorithm options\n * @returns The scores, the iteration count and the convergence flag\n * @public\n */\nexport function pageRank(s: GraphSnapshot, o: PageRankOptions = {}): PageRankResult {\n if (!s.directed) {\n throw new Error(\"PageRank requires a directed graph\");\n }\n const n = s.nodeCount;\n const d = o.dampingFactor ?? 0.85;\n const maxIter = o.maxIterations ?? 100;\n const tol = o.tolerance ?? 1e-6;\n const rev = s.reverse();\n const weighted = o.weighted === true && rev.weights !== null;\n const outW: NumericVector = weighted ? s.weightedOutDegree() : s.outDegree();\n let rank = new Float64Array(n).fill(1 / n);\n let next = new Float64Array(n);\n let it = 0;\n let converged = false;\n for (; it < maxIter && !converged; it++) {\n let dangling = 0;\n for (let u = 0; u < n; u++) {\n if (outW[u] === 0) {\n dangling += rank[u];\n }\n }\n const base = (1 - d) / n + (d * dangling) / n;\n let delta = 0;\n for (let v = 0; v < n; v++) {\n let acc = 0;\n const end = rev.rowPtr[v + 1];\n for (let a = rev.rowPtr[v]; a < end; a++) {\n const u = rev.colIdx[a];\n const ow = outW[u];\n if (ow > 0) {\n acc += (rank[u] * (weighted && rev.weights !== null ? rev.weights[a] : 1)) / ow;\n }\n }\n next[v] = base + d * acc;\n delta += Math.abs(next[v] - rank[v]);\n }\n [rank, next] = [next, rank];\n converged = delta < tol;\n }\n return { scores: rank, iterations: it, converged };\n}\n","/**\n * Conversion from the legacy `Graph` class to a frozen graph-format snapshot\n * (graph-format design 14.1 rule 4, 14.6 row A1). This is the ONLY bridge between the legacy\n * Map-of-Maps surface and `indexed.*`; nothing under `src/indexed/` other than this file imports\n * `../core/graph.js`.\n * @module\n */\n\nimport { GraphBuilder, type GraphSnapshot } from \"@graphty/graph-format\";\n\nimport type { Graph } from \"../core/graph.js\";\n\n/** Options of {@link toSnapshot}. @public */\nexport interface ToSnapshotOptions {\n /**\n * Record FNV-1a checksums at freeze so a caller can assert `snapshot.validate({ checksum: true })`\n * (graph-format design 14.2's first port rule: views are shared, so a port that writes into one\n * has to fail a test rather than corrupt the next call). Default false; the test suites set it.\n */\n readonly checksum?: boolean | undefined;\n}\n\ninterface CacheEntry {\n readonly mutationCount: number;\n readonly checksum: boolean;\n readonly snapshot: GraphSnapshot;\n}\n\n/**\n * One entry per graph, REPLACED rather than appended to on a mutation. The entry holds the\n * mutationCount it was built at, which is what makes a stale hit impossible -- the bug the old\n * `WeakMap<Graph, CSRGraph>` cache had (graph-format design 14.1 rule 4).\n */\nconst SNAPSHOT_CACHE = new WeakMap<Graph, CacheEntry>();\n\n/**\n * Freeze a legacy `Graph` into a `GraphSnapshot`, memoised on the graph's `mutationCount`.\n *\n * The builder is created with `weightDtype: \"f64\"` so a legacy graph's double weights survive\n * exactly: at freeze, graph-format keeps the original values in an f64 edge column with role\n * `weight` (the \"shadow\") whenever at least one of them is not f32-exact, and costs nothing when\n * they all are (graph-format design section 3.7, `graph-format/src/builder/freeze.ts:332-360`).\n * A weighted `indexed.*` port reproduces legacy f64 results by passing\n * `expandEdges(s, shadow.data)` as its per-arc `weights` override.\n *\n * Every legacy edge carries a weight (`Graph.addEdge` defaults it to 1), so the builder's\n * `weighted: \"auto\"` always allocates the arc weight array -- 4 bytes per arc. That is truthful\n * rather than wasteful: the legacy graph really does store the value.\n * @param graph - The legacy graph to convert\n * @param options - Conversion options\n * @returns A frozen snapshot of the graph's current topology and weights\n * @public\n */\nexport function toSnapshot(graph: Graph, options: ToSnapshotOptions = {}): GraphSnapshot {\n const checksum = options.checksum === true;\n const cached = SNAPSHOT_CACHE.get(graph);\n // A checksummed snapshot answers a plain request; a plain one cannot answer a checksummed\n // request -- validate({ checksum: true }) throws E_INVALID_SNAPSHOT (\"no-checksum\") when none\n // were recorded (graph-format/src/types/snapshot.ts:401-405).\n if (cached !== undefined && cached.mutationCount === graph.mutationCount && (cached.checksum || !checksum)) {\n return cached.snapshot;\n }\n const builder = new GraphBuilder({\n directed: graph.isDirected,\n weightDtype: \"f64\",\n expectedNodes: graph.nodeCount,\n expectedEdges: graph.totalEdgeCount,\n });\n for (const node of graph.nodes()) {\n builder.addNode(node.id);\n }\n for (const edge of graph.edges()) {\n builder.addEdge(edge.source, edge.target, edge.weight);\n }\n const snapshot = builder.freeze({ label: \"algorithms.toSnapshot\", checksum });\n SNAPSHOT_CACHE.set(graph, { mutationCount: graph.mutationCount, checksum, snapshot });\n return snapshot;\n}\n","/**\n * The accelerator seam of `@graphty/algorithms` (WebGPU design section 9.2). It contains NO\n * WebGPU types: an accelerator is anything that satisfies `AlgorithmAccelerator` structurally,\n * and this package never imports the GPU package (design section 9.1, the dependency direction).\n *\n * `accelerated(acc)` is the ONE dispatcher object (design section 9.2, the dispatcher rule); the\n * spelling is `accelerated(acc).pageRank(s, options)`, never\n * `runAlgorithm(snapshot, { accelerator })`. There is no try/catch anywhere below: an accelerator\n * method that throws propagates its throw unchanged, because a silent CPU fallback would hide a\n * broken device behind a slow answer.\n * @module\n */\n\nimport type { F32, F64, GraphSnapshot, NumericVector, U32 } from \"@graphty/graph-format\";\n\nimport type { BfsOptions } from \"./bfs.js\";\nimport { type SsspOptions, type SsspResult, walkPredArcs, walkPredEdges } from \"./dijkstra.js\";\nimport * as indexed from \"./index.js\";\nimport type { MstOptions } from \"./mst.js\";\nimport type { PageRankOptions } from \"./pagerank.js\";\n\n// ============================================================ result shapes (design 9.2 lines 2909-2922)\n// Scores may be f32 (an accelerator) or f64 (the CPU ports), so every score field is NumericVector.\n\n/** A score vector with its convergence report. @public */\nexport interface ScoresResultLike {\n readonly scores: NumericVector;\n readonly iterations: number;\n readonly converged: boolean;\n}\n/** ScoresResultLike plus the mass held by dangling nodes. @public */\nexport interface PageRankResultLike extends ScoresResultLike {\n readonly danglingMass?: number | undefined;\n}\n/** The two HITS vectors with their convergence report. @public */\nexport interface HitsResultLike {\n readonly hubs: NumericVector;\n readonly authorities: NumericVector;\n readonly iterations: number;\n readonly converged: boolean;\n}\n/** A partition: dense labels, a count, and the grouped node indices. @public */\nexport interface LabelResultLike {\n readonly labels: U32;\n readonly count: number;\n groups(): U32[];\n}\n/** A breadth-first traversal. @public */\nexport interface BfsResultLike {\n readonly depth: U32;\n readonly parent: U32;\n readonly order: U32;\n readonly visitedCount: number;\n}\n/** Single-source distances plus the relaxing arc per node. @public */\nexport interface SsspResultLike {\n readonly dist: NumericVector;\n readonly predArc: U32;\n}\n/** SsspResultLike plus the negative-cycle flag. @public */\nexport interface BellmanFordResultLike extends SsspResultLike {\n readonly hasNegativeCycle: boolean;\n}\n/** A per-logical-edge score vector. @public */\nexport interface EdgeScoresResultLike {\n readonly scores: NumericVector;\n}\n/** An all-pairs distance matrix, row-major, n by n. @public */\nexport interface ApspResultLike {\n readonly dist: NumericVector;\n readonly n: number;\n}\n/** Per-node coreness. @public */\nexport interface CorenessResultLike {\n readonly coreness: U32;\n}\n/** A spanning forest as logical edge indices. @public */\nexport interface MstResultLike {\n readonly edges: U32;\n readonly totalWeight: number;\n}\n/** A partition with its modularity. @public */\nexport interface CommunityResultLike extends LabelResultLike {\n readonly modularity: number;\n}\n\n// ============================================================ the injected object (design 9.2 lines 2925-2948)\n\n/**\n * The structural contract an injected accelerator satisfies. EVERY member except `kind` is\n * optional: an accelerator declares only what it implements, and the dispatcher runs the CPU port\n * for everything else. The list is the design's, in full, so that an accelerator written against\n * it needs no change as the ports land.\n * @public\n */\nexport interface AlgorithmAccelerator {\n readonly kind: string;\n pageRank?(s: GraphSnapshot, options?: PageRankOptions): Promise<PageRankResultLike>;\n personalizedPageRank?(\n s: GraphSnapshot,\n personalization: F32 | F64,\n options?: PageRankOptions,\n ): Promise<PageRankResultLike>;\n hits?(s: GraphSnapshot, options?: HitsOptionsLike): Promise<HitsResultLike>;\n eigenvectorCentrality?(s: GraphSnapshot, options?: HitsOptionsLike): Promise<ScoresResultLike>;\n katzCentrality?(s: GraphSnapshot, options?: HitsOptionsLike): Promise<ScoresResultLike>;\n connectedComponents?(s: GraphSnapshot): Promise<LabelResultLike>;\n weaklyConnectedComponents?(s: GraphSnapshot): Promise<LabelResultLike>;\n breadthFirstSearch?(s: GraphSnapshot, source: number, options?: BfsOptions): Promise<BfsResultLike>;\n sssp?(s: GraphSnapshot, source: number, options?: SsspOptions): Promise<SsspResultLike>;\n bellmanFord?(s: GraphSnapshot, source: number, options?: SsspOptions): Promise<BellmanFordResultLike>;\n closenessCentrality?(s: GraphSnapshot, options?: HitsOptionsLike): Promise<ScoresResultLike>;\n betweennessCentrality?(s: GraphSnapshot, options?: BetweennessAcceleratorOptions): Promise<ScoresResultLike>;\n edgeBetweennessCentrality?(\n s: GraphSnapshot,\n options?: BetweennessAcceleratorOptions,\n ): Promise<EdgeScoresResultLike>;\n allPairsShortestPath?(s: GraphSnapshot, options?: SsspOptions): Promise<ApspResultLike>;\n kCoreDecomposition?(s: GraphSnapshot): Promise<CorenessResultLike>;\n triangleCount?(s: GraphSnapshot): Promise<{ readonly perNode: U32; readonly total: number }>;\n labelPropagation?(s: GraphSnapshot, options?: HitsOptionsLike): Promise<LabelResultLike>;\n minimumSpanningTree?(s: GraphSnapshot, options?: MstOptions): Promise<MstResultLike>;\n louvain?(s: GraphSnapshot, options?: HitsOptionsLike): Promise<CommunityResultLike>;\n release?(s: GraphSnapshot): void;\n dispose?(): void;\n}\n\n/**\n * The option shape of the power-iteration family until each one's `indexed.*` port lands and\n * brings its real option type (plan decision PD-2's \"NOT TOUCHED\" rows). It is DELIBERATELY not\n * `Record<string, unknown>`: these three are the members every one of those algorithms takes, so\n * an accelerator can honour them today and the type narrows rather than widens as ports arrive.\n * @public\n */\nexport interface HitsOptionsLike {\n readonly maxIterations?: number | undefined;\n readonly tolerance?: number | undefined;\n readonly weighted?: boolean | undefined;\n}\n\n/**\n * Betweenness options as the accelerator sees them: node INDICES, which is the only form that\n * means anything on a snapshot (plan decision PD-5).\n * @public\n */\nexport interface BetweennessAcceleratorOptions {\n readonly normalized?: boolean | undefined;\n readonly endpoints?: boolean | undefined;\n readonly sources?: readonly number[] | undefined;\n readonly k?: number | undefined;\n}\n\n// ============================================================ the dispatcher (design 9.2 lines 2950-2957)\n\n/**\n * The async dispatcher: one method per accelerable `indexed.*` function. Each delegates to the\n * accelerator when it has the method and runs the CPU port otherwise, wrapped in `Promise.resolve`\n * so both paths are async and graphty-element's `async run()` adapters treat them alike.\n *\n * The list GROWS with the A2 ports -- each port PR adds its method. Today it carries the six whose\n * ports exist (plan departure DEP-8A-E).\n * @public\n */\nexport interface AcceleratedAlgorithms {\n readonly accelerator: AlgorithmAccelerator | null;\n pageRank(s: GraphSnapshot, options?: PageRankOptions): Promise<PageRankResultLike>;\n sssp(s: GraphSnapshot, source: number, options?: SsspOptions): Promise<SsspResult>;\n breadthFirstSearch(s: GraphSnapshot, source: number, options?: BfsOptions): Promise<BfsResultLike>;\n connectedComponents(s: GraphSnapshot): Promise<LabelResultLike>;\n weaklyConnectedComponents(s: GraphSnapshot): Promise<LabelResultLike>;\n minimumSpanningTree(s: GraphSnapshot, options?: MstOptions): Promise<MstResultLike>;\n}\n\n/**\n * Attach `pathTo` / `pathEdges` to an accelerator's bare `{ dist, predArc }`, so both paths return\n * the design's `SsspResult` and the element keeps ONE result-writing loop. The GPU package cannot\n * attach them itself: it must not depend on the CPU package at runtime (design 9.2 line 2971, D3).\n * @param s - The snapshot the search ran on\n * @param source - The search's source node index\n * @param like - The accelerator's result\n * @returns The decorated result\n */\nfunction decorateSssp(s: GraphSnapshot, source: number, like: SsspResultLike): SsspResult {\n const { predArc } = like;\n return {\n dist: like.dist,\n predArc,\n pathTo: (target: number): U32 => walkPredArcs(s, predArc, source, target),\n pathEdges: (target: number): U32 => walkPredEdges(s, predArc, source, target),\n };\n}\n\n/**\n * Build the dispatcher for an accelerator, or for none.\n * @param acc - The injected accelerator, or `null` / `undefined` for the CPU path\n * @returns A dispatcher whose methods delegate where they can and run the CPU port otherwise\n * @public\n */\nexport function accelerated(acc: AlgorithmAccelerator | null | undefined): AcceleratedAlgorithms {\n return {\n accelerator: acc ?? null,\n pageRank: (s, options) =>\n acc?.pageRank !== undefined ? acc.pageRank(s, options) : Promise.resolve(indexed.pageRank(s, options)),\n sssp: (s, source, options) =>\n acc?.sssp !== undefined\n ? acc.sssp(s, source, options).then((like) => decorateSssp(s, source, like))\n : Promise.resolve(indexed.dijkstra(s, source, options)),\n breadthFirstSearch: (s, source, options) =>\n acc?.breadthFirstSearch !== undefined\n ? acc.breadthFirstSearch(s, source, options)\n : Promise.resolve(indexed.breadthFirstSearch(s, source, options)),\n connectedComponents: (s) =>\n acc?.connectedComponents !== undefined\n ? acc.connectedComponents(s)\n : Promise.resolve(indexed.connectedComponents(s)),\n weaklyConnectedComponents: (s) =>\n acc?.weaklyConnectedComponents !== undefined\n ? acc.weaklyConnectedComponents(s)\n : Promise.resolve(indexed.weaklyConnectedComponents(s)),\n minimumSpanningTree: (s, options) =>\n acc?.minimumSpanningTree !== undefined\n ? acc.minimumSpanningTree(s, options)\n : Promise.resolve(indexed.kruskalMST(s, options)),\n };\n}\n"],"names":["this","SparseTypedFastBitSet_1","require$$0","Type","SparseTypedFastBitSet","index","TypedFastBitSet_1","TypedFastBitSet","exports","require$$1","nodeId","breadthFirstSearch","hasNegativeCycle","element","dijkstra","pageRank","result","connectedComponents","weaklyConnectedComponents","kruskalMST","calculateModularity","getTotalEdgeWeight","getNodeDegree","nodeLabel","getNeighborCommunities","u","v","graphToAdjacencySet","degreeV","communities","clusterAssignments","commonNeighborsScore","leftIndices","rightIndices","arcSourceIn","indexed.pageRank","indexed.dijkstra","indexed.breadthFirstSearch","indexed.connectedComponents","indexed.weaklyConnectedComponents","indexed.kruskalMST"],"mappings":"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","x_google_ignoreList":[1,2,3,4]}
|