twokeys 2.0.2 → 2.2.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/README.md +63 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +470 -1
- package/dist/index.d.ts +470 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["randomInteger","max","randomSeries","count","series","i","randomPoint","dimension","point","randomPoints","points","Series","options","arr","a","b","offset","len","mid","total","num","data","freq","maxCount","val","modes","result","hinges","copy","hingeCount","per","howMany","step","fragment","first","second","multiple","base","iqr","extra","results","sorted","outer","min","fences","ties","up","down","ranked","tiedRank","tiedNumbers","reset","incr","decr","item","usable","low","lows","high","highs","bins","width","includeZero","binned","zeroOffset","extremes","calculatedWidth","areIntegers","binCount","bin","original","smoothed","residuals","x","passes","current","end","pass","changed","third","tmp","median","antepenultimate","penultimate","last","t1","t2","f1","left","right","next","floor","multiplier","weight","nextCurrent","jittered","w","value","med","h","n","letters","medDepth","medValue","depth","letterIdx","lowerIdx","upperIdx","lower","upper","spread","leafDigits","scale","stems","stem","leaf","sortedStems","stemStrings","leavesRecord","display","stemStr","leaves","Points","Twokeys","index_default"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Twokeys - A small data exploration and manipulation library\n * Named after John Tukey, pioneer of exploratory data analysis (EDA)\n *\n * Features:\n * - Summary statistics (mean, median, mode, quartiles)\n * - Binning (histogram-like grouping)\n * - Smoothing (Hanning filter and median smoothing)\n * - Ranking and ranking analysis\n * - Outlier detection (using Tukey fences)\n * - Data transforms (logarithms, roots, inverses)\n */\n\nexport interface SeriesOptions {\n data?: number[];\n}\n\nexport interface PointsOptions {\n data?: number[][];\n dimensionality?: number;\n count?: number;\n}\n\nexport interface MedianResult {\n datum: number;\n depth: number;\n}\n\nexport interface ModeResult {\n count: number;\n data: number[];\n}\n\nexport interface RankInfo {\n rank: number;\n peers: number;\n}\n\nexport interface RankedResult {\n up: Record<number, RankInfo>;\n down: Record<number, RankInfo>;\n groups: {\n up: (number | number[])[];\n down: (number | number[])[];\n };\n}\n\nexport interface BinnedResult {\n bins: number;\n width: number;\n binned: Record<\n number,\n {\n from: number;\n to: number;\n data: number[];\n }\n >;\n}\n\nexport interface SeriesDescription {\n original: number[];\n summary: {\n median: MedianResult;\n mean: number;\n mode: ModeResult;\n hinges: MedianResult[];\n adjacent: number[];\n outliers: number[];\n outer: number[];\n outside: number[];\n inside: number[];\n extremes: number[];\n iqr: number;\n fences: number[];\n };\n smooths: {\n smooth: number[];\n hanning: number[];\n };\n transforms: {\n logs: number[];\n roots: number[];\n inverse: number[];\n };\n counts: [number, number][];\n sorted: number[];\n ranked: RankedResult;\n binned: BinnedResult;\n}\n\nexport interface PointsDescription {\n original: number[][];\n}\n\n// Constants\nconst DEFAULT_MAX_RANDOM_INTEGER = 100;\nconst DEFAULT_MIN_RANDOM_INTEGER = 0;\nconst DEFAULT_RANDOM_SERIES_COUNT = 1000;\nconst DEFAULT_OUTLIER_MULTIPLE = 1.5;\nconst DEFAULT_JITTER_MULTIPLIER = 1;\nconst DEFAULT_SPLIT_PASSES = 2;\nconst DEFAULT_MAX_RANDOM_DIMENSIONALITY = 2;\n\n// Utility functions\nfunction randomInteger(max: number = DEFAULT_MAX_RANDOM_INTEGER): number {\n return Math.floor(Math.random() * max);\n}\n\nfunction randomSeries(\n count: number = DEFAULT_RANDOM_SERIES_COUNT,\n max: number = DEFAULT_MAX_RANDOM_INTEGER\n): number[] {\n const series: number[] = [];\n for (let i = 0; i < count; i++) {\n series.push(randomInteger(max));\n }\n return series;\n}\n\nfunction randomPoint(\n dimension: number = DEFAULT_MAX_RANDOM_DIMENSIONALITY,\n max: number = DEFAULT_MAX_RANDOM_INTEGER\n): number[] {\n const point: number[] = [];\n for (let i = 0; i < dimension; i++) {\n point.push(Math.floor((Math.random() * (max / 10)) % max));\n }\n return point;\n}\n\nfunction randomPoints(\n count: number = DEFAULT_RANDOM_SERIES_COUNT,\n dimension: number = DEFAULT_MAX_RANDOM_DIMENSIONALITY,\n max: number = DEFAULT_MAX_RANDOM_INTEGER\n): number[][] {\n const points: number[][] = [];\n for (let i = 0; i < count; i++) {\n points.push(randomPoint(dimension, max));\n }\n return points;\n}\n\n/**\n * Series class for 1D data exploration\n */\nexport class Series {\n private data: {\n original: number[];\n sorted?: number[];\n median?: number;\n medianDepth?: number;\n mean?: number;\n mode?: ModeResult;\n extremes?: number[];\n counts?: [number, number][];\n hinges?: MedianResult[];\n iqr?: number;\n fences?: number[];\n outer?: number[];\n outside?: number[];\n inside?: number[];\n outliers?: number[];\n ranked?: RankedResult;\n adjacent?: number[];\n binned?: BinnedResult;\n logs?: number[];\n roots?: number[];\n inverse?: number[];\n hanning?: number[];\n smooth?: number[];\n rough?: number[];\n description?: SeriesDescription;\n };\n\n constructor(options: SeriesOptions = {}) {\n this.data = {\n original: options.data ?? randomSeries(),\n };\n }\n\n // Sort\n sorted(): number[] {\n if (!this.data.sorted) {\n this.data.sorted = this.getSorted(this.data.original);\n }\n return this.data.sorted;\n }\n\n private getSorted(arr: number[]): number[] {\n return [...arr].sort((a, b) => {\n if (a > b) return 1;\n if (a === b) return 0;\n return -1;\n });\n }\n\n // Median\n median(): MedianResult {\n this.sorted();\n if (this.data.median === undefined) {\n this.data.median = this.getMedian(this.data.sorted!);\n }\n if (this.data.medianDepth === undefined) {\n this.data.medianDepth = this.getMedianDepth(this.data.sorted!);\n }\n return {\n datum: this.data.median,\n depth: this.data.medianDepth,\n };\n }\n\n private getMedianDepth(arr: number[], offset: number = 0): number {\n if (!arr.length) return NaN;\n return offset + (arr.length + 1) / 2;\n }\n\n private getMedian(arr: number[]): number {\n const len = arr.length;\n if (!len) return NaN;\n if (len === 1) return arr[0];\n\n const mid = Math.floor(len / 2);\n if (len % 2 === 0) {\n return (arr[mid - 1] + arr[mid]) / 2;\n }\n return arr[mid];\n }\n\n // Mean\n mean(): number {\n if (this.data.mean === undefined) {\n this.data.mean = this.getMean(this.data.original);\n }\n return this.data.mean;\n }\n\n private getMean(arr: number[]): number {\n if (!arr.length) return NaN;\n let total = 0;\n for (const num of arr) {\n total += num;\n }\n return total / arr.length;\n }\n\n // Mode\n mode(): ModeResult {\n if (!this.data.mode) {\n this.sorted();\n this.data.mode = this.getMode(this.data.sorted!);\n }\n return this.data.mode;\n }\n\n private getMode(data: number[]): ModeResult {\n if (!data.length) {\n return { count: 0, data: [] };\n }\n\n // Count frequencies\n const freq: Record<number, number> = {};\n let maxCount = 0;\n\n for (const val of data) {\n freq[val] = (freq[val] || 0) + 1;\n if (freq[val] > maxCount) {\n maxCount = freq[val];\n }\n }\n\n // Find all values with max frequency\n const modes: number[] = [];\n for (const [val, count] of Object.entries(freq)) {\n if (count === maxCount) {\n modes.push(Number(val));\n }\n }\n\n return {\n count: maxCount,\n data: modes.sort((a, b) => a - b),\n };\n }\n\n // Extremes\n extremes(): number[] {\n if (!this.data.extremes) {\n this.sorted();\n this.data.extremes = this.getExtremes(this.data.sorted!);\n }\n return this.data.extremes;\n }\n\n private getExtremes(data: number[]): number[] {\n if (!data.length) return [];\n return [data[0], data[data.length - 1]];\n }\n\n // Counts\n counts(): [number, number][] {\n if (!this.data.counts) {\n this.sorted();\n this.data.counts = this.getCounts(this.data.sorted!);\n }\n return this.data.counts;\n }\n\n private getCounts(data: number[]): [number, number][] {\n const freq = new Map<number, number>();\n for (const val of data) {\n freq.set(val, (freq.get(val) || 0) + 1);\n }\n const result: [number, number][] = [];\n for (const [val, count] of freq) {\n result.push([val, count]);\n }\n return result.sort((a, b) => a[0] - b[0]);\n }\n\n // Hinges (quartiles)\n hinges(): MedianResult[] {\n if (!this.data.hinges) {\n this.sorted();\n this.data.hinges = this.getHinges(this.data.sorted!);\n }\n return this.data.hinges;\n }\n\n private getHinges(\n arr: number[],\n hinges: number = 2,\n result: MedianResult[] = []\n ): MedianResult[] {\n const copy = [...arr];\n const total = copy.length;\n\n let hingeCount = hinges;\n if (hingeCount % 2 !== 0) {\n hingeCount++;\n }\n\n if (total <= hingeCount || hingeCount <= 0) {\n return result;\n }\n\n const per = Math.floor(total / hingeCount);\n const howMany = Math.floor(total / per) - 1;\n\n for (let step = 0; step <= howMany; step++) {\n const fragment = copy.slice(step * per, step * per + per);\n result.push({\n datum: this.getMedian(fragment),\n depth: this.getMedianDepth(fragment, step * per),\n });\n }\n\n return result;\n }\n\n // IQR (Interquartile Range)\n iqr(): number {\n if (this.data.iqr === undefined) {\n this.hinges();\n this.data.iqr = this.getIQR(this.data.hinges!);\n }\n return this.data.iqr;\n }\n\n private getIQR(hinges: MedianResult[]): number {\n const first = hinges[0]?.datum;\n const second = hinges[1]?.datum;\n if (first === undefined || second === undefined) {\n return NaN;\n }\n return Math.abs(first - second);\n }\n\n // Fences\n fences(): number[] {\n if (!this.data.fences) {\n this.median();\n this.iqr();\n this.data.fences = this.getFences();\n }\n return this.data.fences;\n }\n\n private getFences(multiple: number = DEFAULT_OUTLIER_MULTIPLE): number[] {\n const base = this.data.median;\n const iqr = this.data.iqr;\n if (base === undefined || iqr === undefined || isNaN(iqr)) {\n return [];\n }\n const extra = iqr * multiple;\n return [base - extra, base + extra];\n }\n\n // Outer fences\n outer(): number[] {\n if (!this.data.outer) {\n this.median();\n this.iqr();\n this.data.outer = this.getOuter();\n }\n return this.data.outer;\n }\n\n private getOuter(multiple: number = DEFAULT_OUTLIER_MULTIPLE): number[] {\n const base = this.data.median;\n const iqr = this.data.iqr;\n if (base === undefined || iqr === undefined || isNaN(iqr)) {\n return [];\n }\n const extra = 2 * iqr * multiple;\n return [base - extra, base + extra];\n }\n\n // Outside values\n outside(): number[] {\n if (!this.data.outside) {\n this.outer();\n this.data.outside = this.getOutside();\n }\n return this.data.outside;\n }\n\n private getOutside(): number[] {\n const results: number[] = [];\n const sorted = this.data.sorted!;\n const outer = this.data.outer;\n if (!outer || outer.length === 0) return [];\n const min = Math.min(...outer);\n const max = Math.max(...outer);\n for (const num of sorted) {\n if (num > max || num < min) {\n results.push(num);\n }\n }\n return results;\n }\n\n // Inside values\n inside(): number[] {\n if (!this.data.inside) {\n this.fences();\n this.data.inside = this.getInside();\n }\n return this.data.inside;\n }\n\n private getInside(): number[] {\n const results: number[] = [];\n const sorted = this.data.sorted!;\n const fences = this.data.fences;\n if (!fences || fences.length === 0) return [];\n const min = Math.min(...fences);\n const max = Math.max(...fences);\n for (const num of sorted) {\n if (num < max && num > min) {\n results.push(num);\n }\n }\n return results;\n }\n\n // Outliers\n outliers(): number[] {\n if (!this.data.outliers) {\n this.fences();\n this.data.outliers = this.getOutliers();\n }\n return this.data.outliers;\n }\n\n private getOutliers(): number[] {\n const results: number[] = [];\n const sorted = this.data.sorted!;\n const fences = this.data.fences!;\n if (fences.length === 0) return [];\n const min = Math.min(...fences);\n const max = Math.max(...fences);\n for (const num of sorted) {\n if (num > max || num < min) {\n results.push(num);\n }\n }\n return results;\n }\n\n // Ranked\n ranked(): RankedResult {\n if (!this.data.ranked) {\n this.sorted();\n this.data.ranked = this.getRanked(this.data.sorted!);\n }\n return this.data.ranked;\n }\n\n private getRanked(arr: number[], ties: boolean = true): RankedResult {\n const up: Record<number, RankInfo> = {};\n const down: Record<number, RankInfo> = {};\n const total = arr.length;\n const ranked: (number | number[])[] = [];\n\n let tiedRank = NaN;\n let tiedNumbers: number[] = [];\n\n const reset = () => {\n tiedRank = NaN;\n tiedNumbers = [];\n };\n\n for (let i = 0; i < arr.length; i++) {\n const num = arr[i];\n\n if (!ties) {\n up[num] = { rank: i + 1, peers: 0 };\n down[num] = { rank: total - i, peers: 0 };\n } else {\n const incr = i + 1;\n const decr = i - 1;\n\n if (num === arr[decr]) {\n if (!isNaN(tiedRank) && tiedNumbers.length === 0) {\n tiedNumbers.push(num);\n ranked.push(tiedNumbers);\n reset();\n } else {\n tiedNumbers.push(num);\n tiedRank = decr;\n }\n if (num !== arr[incr]) {\n ranked.push(tiedNumbers);\n reset();\n }\n } else {\n if (num !== arr[incr]) {\n if (tiedNumbers.length > 0) {\n ranked.push(tiedNumbers);\n reset();\n } else {\n ranked.push(num);\n }\n } else {\n tiedNumbers.push(num);\n }\n }\n }\n }\n\n let offset = 0;\n for (let i = 0; i < ranked.length; i++) {\n const item = ranked[i];\n if (typeof item === 'number') {\n down[item] = { rank: i + 1 + offset, peers: 0 };\n up[item] = { rank: total - i - offset, peers: 0 };\n } else if (Array.isArray(item)) {\n offset += item.length;\n const usable = item[0];\n down[usable] = { rank: i + 1 + offset, peers: item.length };\n up[usable] = { rank: total - i - offset, peers: item.length };\n } else {\n offset += 1;\n }\n }\n\n return {\n up,\n down,\n groups: {\n down: [...ranked],\n up: [...ranked].reverse(),\n },\n };\n }\n\n // Adjacent\n adjacent(): number[] {\n if (!this.data.adjacent) {\n this.fences();\n this.data.adjacent = this.getAdjacent(this.data.sorted!, this.data.fences!);\n }\n return this.data.adjacent;\n }\n\n private getAdjacent(arr: number[], fences: number[]): number[] {\n if (fences.length === 0) return [];\n\n const low = fences[0];\n const lows: number[] = [];\n const high = fences[1];\n const highs: number[] = [];\n\n for (const val of arr) {\n if (val > low) lows.push(val);\n if (val < high) highs.push(val);\n }\n\n lows.sort((a, b) => a - b);\n highs.sort((a, b) => a - b);\n\n return [lows[0], highs[highs.length - 1]];\n }\n\n // Binned\n binned(bins: number = NaN): BinnedResult {\n if (!this.data.binned) {\n this.sorted();\n this.extremes();\n this.data.binned = this.getBinned(this.data.sorted!, bins);\n }\n return this.data.binned;\n }\n\n private getBinned(\n arr: number[],\n bins: number = 10,\n width: number = NaN,\n includeZero: boolean = true\n ): BinnedResult {\n const binned: Record<number, { from: number; to: number; data: number[] }> = {};\n const total = arr.length;\n const zeroOffset = includeZero ? 0 : 1;\n\n if (total === 0) {\n return { bins: 0, width: NaN, binned: {} };\n }\n\n const extremes = this.data.extremes!;\n let calculatedWidth = width;\n\n if (extremes && isNaN(calculatedWidth) && extremes.length === 2) {\n calculatedWidth = (extremes[1] - extremes[0]) / (Math.log(arr.length) / Math.LN2);\n calculatedWidth = Math.floor(calculatedWidth);\n\n let areIntegers = true;\n for (const item of arr) {\n if (item % 1 !== 0) {\n areIntegers = false;\n break;\n }\n }\n if (areIntegers) {\n calculatedWidth = Math.floor(calculatedWidth);\n }\n }\n\n let binCount = Math.floor(extremes[1] / calculatedWidth) + 1;\n if (!binCount || binCount < 1) {\n binCount = 1;\n }\n\n for (const val of arr) {\n const bin = Math.floor((val - zeroOffset) / calculatedWidth);\n if (!binned[bin]) {\n binned[bin] = {\n from: bin * calculatedWidth + zeroOffset,\n to: (bin + 1) * calculatedWidth + zeroOffset - 1,\n data: [],\n };\n }\n binned[bin].data.push(val);\n }\n\n return {\n bins: binCount,\n width: calculatedWidth,\n binned,\n };\n }\n\n // Transforms\n logs(): number[] {\n if (!this.data.logs) {\n this.data.logs = this.getLogs(this.data.original);\n }\n return this.data.logs;\n }\n\n private getLogs(arr: number[]): number[] {\n return arr.map((val) => Math.log(val));\n }\n\n roots(): number[] {\n if (!this.data.roots) {\n this.data.roots = this.getRoots(this.data.original);\n }\n return this.data.roots;\n }\n\n private getRoots(arr: number[]): number[] {\n return arr.map((val) => Math.sqrt(val));\n }\n\n inverse(): number[] {\n if (!this.data.inverse) {\n this.data.inverse = this.getInverse(this.data.original);\n }\n return this.data.inverse;\n }\n\n private getInverse(arr: number[]): number[] {\n return arr.map((val) => 1 / val);\n }\n\n // Smoothing\n hanning(): number[] {\n if (!this.data.hanning) {\n this.data.hanning = this.getSkipMeans(this.data.original);\n }\n return this.data.hanning;\n }\n\n private getSkipMeans(arr: number[]): number[] {\n const results: number[] = [];\n for (let i = 0; i < arr.length; i++) {\n if (i !== 0 && i !== arr.length - 1) {\n results.push((arr[i] + arr[i + 1]) / 2);\n }\n }\n results.unshift(arr[0]);\n results.push(arr[arr.length - 1]);\n return results;\n }\n\n smooth(): number[] {\n if (!this.data.smooth) {\n this.sorted();\n this.data.smooth = this.getSmooth(this.data.original);\n }\n this.data.rough = this.getRough(this.data.original, this.data.smooth);\n return this.data.smooth;\n }\n\n private getRough(original: number[], smoothed: number[]): number[] {\n const residuals: number[] = [];\n for (let x = 0; x < original.length; x++) {\n residuals.push(original[x] - smoothed[x]);\n }\n return residuals;\n }\n\n private getSmooth(arr: number[], passes: number = 3): number[] {\n let smoothed = [...arr];\n smoothed = this.smoothMedian(smoothed, passes);\n smoothed = this.smoothExtremes(smoothed, -1);\n smoothed = this.smoothSplit(smoothed, 2);\n smoothed = this.smoothMedian(smoothed, passes);\n smoothed = this.smoothExtremes(smoothed, -1);\n smoothed = this.smoothMedian(smoothed, passes);\n return smoothed;\n }\n\n private smoothExtremes(\n arr: number[],\n passes: number = 1,\n current: number = 0,\n end: 'both' | 'head' | 'tail' = 'both'\n ): number[] {\n const len = arr.length;\n if (len <= 2) return [...arr];\n\n const result = [...arr];\n\n for (let pass = current; pass < passes || passes === -1; pass++) {\n let changed = false;\n\n if (end === 'both' || end === 'head') {\n const first = result[0];\n const second = result[1];\n const third = result[2];\n const tmp = second - 2 * (third - second);\n // Median of three: sort and pick middle\n const median =\n first <= second\n ? second <= tmp\n ? second\n : first <= tmp\n ? tmp\n : first\n : first <= tmp\n ? first\n : second <= tmp\n ? tmp\n : second;\n if (result[0] !== median) {\n result[0] = median;\n changed = true;\n }\n }\n\n if (end === 'both' || end === 'tail') {\n const antepenultimate = result[len - 3];\n const penultimate = result[len - 2];\n const last = result[len - 1];\n const tmp = penultimate - 2 * (antepenultimate - penultimate);\n const median =\n last <= penultimate\n ? penultimate <= tmp\n ? penultimate\n : last <= tmp\n ? tmp\n : last\n : last <= tmp\n ? last\n : penultimate <= tmp\n ? tmp\n : penultimate;\n if (result[len - 1] !== median) {\n result[len - 1] = median;\n changed = true;\n }\n }\n\n if (passes === -1 && !changed) {\n break;\n }\n }\n return result;\n }\n\n private smoothSplit(\n arr: number[],\n passes: number = DEFAULT_SPLIT_PASSES,\n current: number = 0\n ): number[] {\n let result = [...arr];\n const len = arr.length;\n\n for (let pass = current; pass < passes || passes === -1; pass++) {\n let changed = false;\n\n for (let i = 2; i < len - 1; i++) {\n const num = result[i];\n const t1 = result[i - 1];\n const t2 = result[i - 2];\n const f1 = result[i + 1];\n\n if (num === t1 && ((t1 > t2 && num > f1) || (t1 < t2 && num < f1))) {\n // Apply smoothExtremes at split point in-place\n const left = this.smoothExtremes(result.slice(0, i));\n const right = this.smoothExtremes(result.slice(i));\n result = left.concat(right);\n changed = true;\n }\n }\n\n if (passes === -1 && !changed) {\n return result;\n }\n }\n return result;\n }\n\n private smoothMedian(arr: number[], passes: number = 1, current: number = 0): number[] {\n let result = arr;\n const len = arr.length;\n if (len <= 2) return [...arr];\n\n for (let pass = current; pass < passes || passes === -1; pass++) {\n const next = new Array<number>(len);\n next[0] = result[0];\n next[len - 1] = result[len - 1];\n\n let changed = false;\n for (let i = 1; i < len - 1; i++) {\n const val = result[i];\n const smoothed = Math.min(Math.max(result[i - 1], val), result[i + 1]);\n next[i] = smoothed;\n if (smoothed !== val) changed = true;\n }\n\n if (passes === -1 && !changed) {\n return result;\n }\n result = next;\n }\n return result;\n }\n\n private jitter(\n arr: number[],\n passes: number = 1,\n floor: number = NaN,\n multiplier: number = DEFAULT_JITTER_MULTIPLIER,\n weight: number = NaN,\n current: number = 0\n ): number[] {\n const nextCurrent = current + 1;\n const copy = [...arr];\n\n if (nextCurrent <= passes) {\n const jittered: number[] = [];\n for (const num of copy) {\n let w = weight;\n if (!w && !isNaN(w)) {\n w = (1 + Math.floor(num / 10)) * (Math.random() > 0.5 ? 1 : -1);\n }\n let value = num + Math.floor(Math.random() * multiplier * w);\n if (!isNaN(floor) && value < floor) {\n value = floor;\n }\n jittered.push(value);\n }\n return this.jitter(jittered, passes, floor, multiplier, weight, nextCurrent);\n }\n return copy;\n }\n\n // Trimean (Tukey's trimean: (Q1 + 2*median + Q3) / 4)\n trimean(): number {\n const med = this.median();\n const h = this.hinges();\n if (h.length < 2) return med.datum;\n return (h[0].datum + 2 * med.datum + h[1].datum) / 4;\n }\n\n // Letter values (depth-based summaries beyond hinges)\n letterValues(): Array<{ letter: string; depth: number; lower: number; upper: number; mid: number; spread: number }> {\n this.sorted();\n const n = this.data.sorted!.length;\n if (n < 2) return [];\n\n const letters = ['M', 'F', 'E', 'D', 'C', 'B', 'A', 'Z', 'Y', 'X', 'W', 'V', 'U', 'T', 'S'];\n const results: Array<{ letter: string; depth: number; lower: number; upper: number; mid: number; spread: number }> = [];\n\n // M = median\n const medDepth = (n + 1) / 2;\n const medValue = this.median().datum;\n results.push({\n letter: 'M',\n depth: medDepth,\n lower: medValue,\n upper: medValue,\n mid: medValue,\n spread: 0,\n });\n\n // Subsequent letter values\n let depth = medDepth;\n let letterIdx = 1;\n\n while (depth > 1 && letterIdx < letters.length) {\n depth = Math.floor((Math.floor(depth) + 1) / 2);\n if (depth < 1) break;\n\n const lowerIdx = Math.ceil(depth) - 1;\n const upperIdx = n - Math.ceil(depth);\n\n if (lowerIdx < 0 || upperIdx >= n || lowerIdx >= upperIdx) break;\n\n const lower = this.data.sorted![lowerIdx];\n const upper = this.data.sorted![upperIdx];\n const mid = (lower + upper) / 2;\n const spread = upper - lower;\n\n results.push({\n letter: letters[letterIdx],\n depth,\n lower,\n upper,\n mid,\n spread,\n });\n\n letterIdx++;\n }\n\n return results;\n }\n\n // Rough (residuals: original - smooth)\n rough(): number[] {\n if (!this.data.rough) {\n this.smooth();\n }\n return this.data.rough || [];\n }\n\n // Stem-and-leaf display (text-based visualization)\n stemLeaf(leafDigits: number = 1): { stems: string[]; leaves: Record<string, string[]>; display: string[] } {\n this.sorted();\n const data = this.data.sorted!;\n if (!data.length) return { stems: [], leaves: {}, display: [] };\n\n const scale = Math.pow(10, leafDigits);\n const stems = new Map<number, number[]>();\n\n for (const val of data) {\n const stem = Math.floor(val / scale);\n const leaf = Math.abs(Math.round(val % scale));\n if (!stems.has(stem)) {\n stems.set(stem, []);\n }\n stems.get(stem)!.push(leaf);\n }\n\n const sortedStems = Array.from(stems.keys()).sort((a, b) => a - b);\n const stemStrings: string[] = [];\n const leavesRecord: Record<string, string[]> = {};\n const display: string[] = [];\n\n for (const stem of sortedStems) {\n const stemStr = String(stem);\n stemStrings.push(stemStr);\n const leaves = stems.get(stem)!.sort((a, b) => a - b).map(String);\n leavesRecord[stemStr] = leaves;\n display.push(`${stemStr.padStart(4)} | ${leaves.join(' ')}`);\n }\n\n return { stems: stemStrings, leaves: leavesRecord, display };\n }\n\n // Mid-summaries (averages of symmetric quantile pairs)\n midSummaries(): Array<{ depth: number; mid: number; spread: number }> {\n const lv = this.letterValues();\n return lv.map(({ depth, mid, spread }) => ({ depth, mid, spread }));\n }\n\n // Describe - full summary\n describe(): SeriesDescription {\n this.data.description = {\n original: this.data.original,\n summary: {\n median: this.median(),\n mean: this.mean(),\n mode: this.mode(),\n hinges: this.hinges(),\n adjacent: this.adjacent(),\n outliers: this.outliers(),\n outer: this.outer(),\n outside: this.outside(),\n inside: this.inside(),\n extremes: this.extremes(),\n iqr: this.iqr(),\n fences: this.fences(),\n },\n smooths: {\n smooth: this.smooth(),\n hanning: this.hanning(),\n },\n transforms: {\n logs: this.logs(),\n roots: this.roots(),\n inverse: this.inverse(),\n },\n counts: this.counts(),\n sorted: this.sorted(),\n ranked: this.ranked(),\n binned: this.binned(),\n };\n return this.data.description;\n }\n}\n\n/**\n * Points class for n-dimensional data exploration\n */\nexport class Points {\n private data: {\n original: number[][];\n description?: PointsDescription;\n };\n private dimension: number;\n private count: number;\n\n constructor(options: PointsOptions | number = {}) {\n if (typeof options === 'number') {\n this.count = options;\n this.dimension = DEFAULT_MAX_RANDOM_DIMENSIONALITY;\n this.data = {\n original: randomPoints(this.count, this.dimension),\n };\n } else {\n this.dimension = options.dimensionality ?? 2;\n this.count = options.count ?? 100;\n this.data = {\n original: options.data ?? randomPoints(this.count, this.dimension),\n };\n }\n }\n\n describe(): PointsDescription {\n this.data.description = {\n original: this.data.original,\n };\n return this.data.description;\n }\n}\n\n/**\n * Main Twokeys class - factory for Series and Points\n */\nexport class Twokeys {\n public smoothed: boolean = false;\n\n // Constants\n static readonly DEFAULT_MAX_RANDOM_INTEGER = DEFAULT_MAX_RANDOM_INTEGER;\n static readonly DEFAULT_MIN_RANDOM_INTEGER = DEFAULT_MIN_RANDOM_INTEGER;\n static readonly DEFAULT_RANDOM_SERIES_COUNT = DEFAULT_RANDOM_SERIES_COUNT;\n static readonly DEFAULT_OUTLIER_MULTIPLE = DEFAULT_OUTLIER_MULTIPLE;\n static readonly DEFAULT_JITTER_MULTIPLIER = DEFAULT_JITTER_MULTIPLIER;\n static readonly DEFAULT_SPLIT_PASSES = DEFAULT_SPLIT_PASSES;\n static readonly DEFAULT_MAX_RANDOM_DIMENSIONALITY = DEFAULT_MAX_RANDOM_DIMENSIONALITY;\n\n // Static factory methods\n static Series = Series;\n static Points = Points;\n\n // Utility methods\n static randomInteger = randomInteger;\n static randomSeries = randomSeries;\n static randomPoint = randomPoint;\n static randomPoints = randomPoints;\n}\n\n// Default export\nexport default Twokeys;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/graph.ts","../src/gds.ts","../src/index.ts"],"names":["GraphAlgorithmError","code","message","MinPriorityQueue","value","priority","top","last","index","cursor","parent","current","parentItem","left","right","smallest","leftItem","rightItem","currentSmallest","cursorItem","smallestItem","defaultTieBreaker","canonicalUndirectedEdge","undirectedEdgeKey","edge","asNodeId","input","DisjointSet","nodes","nodeId","root","leftRoot","rightRoot","leftRank","rightRank","dedupeNodeList","edges","seen","ordered","node","normalizeWeight","weight","initializeNeighborMap","nodeIds","map","maybeUpdateEdge","from","to","outgoing","existing","buildNormalizedEdgeMap","directed","neighbors","toNeighborList","edgeMap","neighborsByNode","targetId","createIncomingByNode","incomingByNode","fromId","neighbor","incoming","toEdgeList","hasNegativeWeights","adjacency","reconstructPath","source","target","previousByNode","reversed","previous","sumNeighborWeights","sum","collectUniqueUndirectedEdges","byKey","canonical","key","computeModularity","communityByNode","uniqueEdges","totalEdgeWeight","degreeByNode","totalWeightByCommunity","internalWeightByCommunity","community","degree","fromCommunity","toCommunity","modularity","totalWeight","internal","buildCommunityResult","labelsByNode","iterations","converged","algorithm","communitiesRaw","label","members","communities","buildNeighborIdSetMap","output","set","computeSimilarityScore","leftId","rightId","neighborSets","metric","leftSize","rightSize","iterate","lookup","common","adamicAdar","resourceAllocation","union","overlapDenominator","routeDistanceForPath","path","total","toId","pathKey","hasSamePrefix","prefix","chooseShortestPathAlgorithm","requested","hasNegative","runDijkstra","distanceByNode","settled","queue","item","currentDistance","nextDistance","existingDistance","runBellmanFord","totalNodes","iteration","changed","fromDistance","candidate","negativeCycleNodes","toDistance","explored","distance","runShortestPathEngine","requestedAlgorithm","createRandom","seed","state","squaredDistance","delta","euclideanDistance","normalizePoints","points","mode","dimensionality","point","means","mins","maxs","axis","ranges","max","min","range","variances","stdDevs","variance","stdDev","initializeCentroids","k","random","useKMeansPlusPlus","centroids","selected","first","distanceWeights","pointIndex","bestDistance","centroid","threshold","running","pickedIndex","runSingleKMeans","maxIterations","tolerance","assignments","inertia","bestCluster","clusterIndex","nextCentroids","counts","count","farthestIndex","farthestDistance","assigned","maxShift","next","computeSilhouette","clusters","cluster","clusterMembers","counted","ownCluster","ownMembers","neighborIndex","b","distanceToCluster","denominator","routeDistanceFromMatrix","route","distanceMatrix","optimizeRouteTwoOpt","passes","best","pass","improved","start","end","head","middle","tail","candidateDistance","createDeterministicStartList","options","starts","used","pool","swapIndex","desiredCount","buildGreedyRoute","returnToStart","unvisited","nextNode","distances","computeMstLowerBound","visited","buildGraphAdjacency","stronglyConnectedComponents","components","indexByNode","lowLinkByNode","stack","inStack","strongConnect","currentLow","neighborLow","component","member","firstLeft","firstRight","componentByNode","componentIndex","weaklyConnectedComponents","topologicalSort","tieBreaker","priorityByNode","priorityAccessor","compareNodes","priorityDelta","indegree","targets","order","orderSet","leftovers","directedScc","selfLoopNodes","cycleNodes","degreeCentrality","outDegree","inDegree","closenessCentrality","totalOthers","engine","negativeCycle","reachableCount","distanceSum","harmonicSum","score","normalized","betweennessCentrality","predecessors","sigma","distanceToNode","sigmaToNode","knownDistance","dependency","sigmaNode","dependencyNode","predecessor","sigmaPredecessor","contribution","normalization","records","raw","pageRank","dampingFactor","initialScore","outgoingWeightSum","scores","teleportMass","sinkMass","sinkContribution","outgoingWeight","transfer","scoreSum","scoreDelta","maxScore","byNode","minimumSpanningTree","candidateByKey","candidates","weightDelta","fromDelta","disjointSet","roots","componentCount","articulationPointsAndBridges","discoveredAt","lowLink","parentByNode","articulationPoints","bridgeByKey","discoveryCounter","visit","childCount","discoveredNeighbor","lowNode","lowNeighbor","discoveredNode","bridges","toDelta","analyzeGraph","scc","weak","articulation","dedupedNodes","orderedNodeIds","betweennessByNode","pageRankByNode","error","defaultScore","shortestPath","reachable","labelPropagationCommunities","nodeOrder","labelByNode","scoreByLabel","neighborLabel","currentLabel","bestLabel","bestScore","candidateLabel","louvainCommunities","maxPasses","totalDegree","communityWeight","nodeDegree","edgeWeightByCommunity","bestGain","edgeWeight","candidateWeight","gain","nodeSimilarity","minScore","orderedNodes","pairs","leftIndex","rightIndex","leftDelta","pair","kNearestNeighbors","otherId","predictLinks","limit","allowExistingEdges","sourceFilterSet","targetFilterSet","existingEdgeKeys","predictions","prediction","linkPrediction","aStarShortestPath","heuristic","_nodeId","_targetId","gScore","closedSet","startHeuristic","known","estimate","allPairsShortestPaths","chosenAlgorithm","distanceBySource","previousBySource","prev","yenKShortestPaths","shortestPathAlgorithm","accepted","pathIndex","spurIndex","spurNode","rootPath","rootNodeExclusion","removedEdgeKeys","pathRecord","filteredEdges","spurPath","totalPath","totalDistance","distanceDelta","maximumFlow","sink","originalEdges","residual","addResidualEdge","capacity","originalIndex","fromEdges","toEdges","forwardIndex","reverseIndex","maxFlow","augmentations","flowByOriginal","queueIndex","edgesFromNode","edgeIndex","bottleneck","parentEntry","reverse","reachableFromSource","partitionQueue","partitionCursor","sourcePartition","sinkPartition","cutEdges","flowByEdge","minCostMaxFlow","edgeProjection","originals","cost","targetFlowRaw","targetFlow","flow","sinkDistance","kMeansClustering","clusterCount","nInit","baseSeed","transform","normalizedPoints","bestSeed","attempt","run","indices","silhouette","kMeansAuto","minK","maxK","bestResult","bestK","result","currentSilhouette","bestSilhouette","travelingSalesmanApprox","twoOptPasses","previousMatrix","bestRoute","candidateRoute","unreachableNodes","complete","segments","lowerBound","optimalityGap","GraphCatalog","name","normalizedName","projection","flowEdges","steps","step","stepId","exhaustiveKind","createGraphCatalog","gds","DEFAULT_MAX_RANDOM_INTEGER","DEFAULT_MIN_RANDOM_INTEGER","DEFAULT_RANDOM_SERIES_COUNT","DEFAULT_OUTLIER_MULTIPLE","DEFAULT_JITTER_MULTIPLIER","DEFAULT_SPLIT_PASSES","DEFAULT_MAX_RANDOM_DIMENSIONALITY","randomInteger","randomSeries","series","i","randomPoint","dimension","randomPoints","Series","arr","a","offset","len","mid","num","data","freq","maxCount","val","modes","hinges","copy","hingeCount","per","howMany","fragment","second","multiple","base","iqr","extra","results","sorted","outer","fences","ties","up","down","ranked","tiedRank","tiedNumbers","reset","incr","decr","usable","low","lows","high","highs","bins","width","includeZero","binned","zeroOffset","extremes","calculatedWidth","areIntegers","binCount","bin","original","smoothed","residuals","x","third","tmp","median","antepenultimate","penultimate","t1","t2","f1","floor","multiplier","nextCurrent","jittered","w","med","h","letters","medDepth","medValue","depth","letterIdx","lowerIdx","upperIdx","lower","upper","spread","leafDigits","scale","stems","stem","leaf","sortedStems","stemStrings","leavesRecord","display","stemStr","leaves","Points","Twokeys","index_default"],"mappings":"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","file":"index.cjs","sourcesContent":["export type GraphNodeInput<NodeId extends string = string> =\n | NodeId\n | { id: NodeId };\n\nexport interface GraphEdge<NodeId extends string = string> {\n from: NodeId;\n to: NodeId;\n weight?: number;\n}\n\nexport interface GraphBuildOptions {\n directed?: boolean;\n}\n\nexport interface GraphNeighbor<NodeId extends string = string> {\n id: NodeId;\n weight: number;\n}\n\nexport interface GraphAdjacency<NodeId extends string = string> {\n nodes: NodeId[];\n neighborsByNode: Map<NodeId, GraphNeighbor<NodeId>[]>;\n incomingByNode: Map<NodeId, GraphNeighbor<NodeId>[]>;\n edges: Array<Required<GraphEdge<NodeId>>>;\n directed: boolean;\n}\n\nexport type GraphAlgorithmErrorCode =\n | 'NEGATIVE_WEIGHT'\n | 'NEGATIVE_CYCLE'\n | 'INVALID_ARGUMENT';\n\nexport class GraphAlgorithmError extends Error {\n readonly code: GraphAlgorithmErrorCode;\n\n constructor(code: GraphAlgorithmErrorCode, message: string) {\n super(message);\n this.name = 'GraphAlgorithmError';\n this.code = code;\n }\n}\n\nexport interface TopologicalSortOptions<NodeId extends string = string> {\n tieBreaker?: (left: NodeId, right: NodeId) => number;\n priority?: (nodeId: NodeId) => number;\n priorityByNode?: Map<NodeId, number> | Partial<Record<NodeId, number>>;\n}\n\nexport interface TopologicalSortResult<NodeId extends string = string> {\n order: NodeId[];\n cycleNodes: NodeId[];\n isDag: boolean;\n}\n\nexport interface StronglyConnectedComponentsOptions extends GraphBuildOptions {}\n\nexport interface StronglyConnectedComponentsResult<NodeId extends string = string> {\n components: NodeId[][];\n componentByNode: Map<NodeId, number>;\n}\n\nexport interface WeaklyConnectedComponentsResult<NodeId extends string = string> {\n components: NodeId[][];\n componentByNode: Map<NodeId, number>;\n}\n\nexport interface DegreeCentralityRecord {\n inDegree: number;\n outDegree: number;\n degree: number;\n normalized: number;\n}\n\nexport type ClosenessCentralityMode = 'classic' | 'harmonic';\n\nexport interface ClosenessCentralityRecord {\n reachableCount: number;\n distanceSum: number;\n score: number;\n normalized: number;\n mode: ClosenessCentralityMode;\n negativeCycle: boolean;\n}\n\nexport interface BetweennessCentralityRecord {\n raw: number;\n normalized: number;\n}\n\nexport interface PageRankOptions extends GraphBuildOptions {\n dampingFactor?: number;\n tolerance?: number;\n maxIterations?: number;\n}\n\nexport interface PageRankRecord {\n score: number;\n normalized: number;\n rank: number;\n}\n\nexport interface PageRankResult<NodeId extends string = string> {\n byNode: Map<NodeId, PageRankRecord>;\n order: NodeId[];\n iterations: number;\n converged: boolean;\n dampingFactor: number;\n}\n\nexport interface MinimumSpanningTreeOptions<NodeId extends string = string> {\n tieBreaker?: (left: NodeId, right: NodeId) => number;\n}\n\nexport interface MinimumSpanningTreeResult<NodeId extends string = string> {\n edges: Array<Required<GraphEdge<NodeId>>>;\n totalWeight: number;\n componentCount: number;\n spanning: boolean;\n}\n\nexport interface ArticulationBridgeResult<NodeId extends string = string> {\n articulationPoints: NodeId[];\n bridges: Array<Required<GraphEdge<NodeId>>>;\n}\n\nexport interface GraphAnalysisResult<NodeId extends string = string> {\n degree: Map<NodeId, DegreeCentralityRecord>;\n closeness: Map<NodeId, ClosenessCentralityRecord>;\n betweenness: Map<NodeId, BetweennessCentralityRecord>;\n pageRank: Map<NodeId, PageRankRecord>;\n stronglyConnectedComponents: NodeId[][];\n weaklyConnectedComponents: NodeId[][];\n articulationPoints: NodeId[];\n bridges: Array<Required<GraphEdge<NodeId>>>;\n}\n\nexport interface GraphAnalysisOptions extends GraphBuildOptions {\n closenessMode?: ClosenessCentralityMode;\n shortestPathAlgorithm?: ShortestPathAlgorithm;\n pageRankOptions?: Omit<PageRankOptions, 'directed'>;\n}\n\nexport type ShortestPathAlgorithm = 'auto' | 'dijkstra' | 'bellman-ford';\n\nexport interface ShortestPathOptions extends GraphBuildOptions {\n algorithm?: ShortestPathAlgorithm;\n failOnNegativeCycle?: boolean;\n}\n\nexport interface ShortestPathResult<NodeId extends string = string> {\n source: NodeId;\n target: NodeId;\n path: NodeId[];\n distance: number;\n reachable: boolean;\n explored: number;\n algorithm: ShortestPathAlgorithm;\n hasNegativeWeights: boolean;\n negativeCycle: boolean;\n}\n\nexport interface LabelPropagationOptions<NodeId extends string = string>\n extends GraphBuildOptions {\n maxIterations?: number;\n tieBreaker?: (left: NodeId, right: NodeId) => number;\n}\n\nexport interface LouvainOptions<NodeId extends string = string>\n extends GraphBuildOptions {\n maxPasses?: number;\n tolerance?: number;\n tieBreaker?: (left: NodeId, right: NodeId) => number;\n}\n\nexport interface CommunityDetectionResult<NodeId extends string = string> {\n communities: NodeId[][];\n communityByNode: Map<NodeId, number>;\n iterations: number;\n converged: boolean;\n algorithm: 'label-propagation' | 'louvain';\n modularity: number;\n}\n\nexport type SimilarityMetric =\n | 'common-neighbors'\n | 'jaccard'\n | 'cosine'\n | 'overlap'\n | 'adamic-adar'\n | 'resource-allocation'\n | 'preferential-attachment';\n\nexport interface SimilarityOptions extends GraphBuildOptions {\n metric?: SimilarityMetric;\n minScore?: number;\n}\n\nexport interface NodeSimilarityRecord<NodeId extends string = string> {\n left: NodeId;\n right: NodeId;\n score: number;\n metric: SimilarityMetric;\n rank: number;\n}\n\nexport interface NodeSimilarityResult<NodeId extends string = string> {\n metric: SimilarityMetric;\n pairs: NodeSimilarityRecord<NodeId>[];\n}\n\nexport interface KNearestNeighborsOptions extends GraphBuildOptions {\n metric?: SimilarityMetric;\n k?: number;\n minScore?: number;\n}\n\nexport interface KNearestNeighbor<NodeId extends string = string> {\n nodeId: NodeId;\n score: number;\n}\n\nexport interface KNearestNeighborsResult<NodeId extends string = string> {\n metric: SimilarityMetric;\n k: number;\n neighborsByNode: Map<NodeId, KNearestNeighbor<NodeId>[]>;\n}\n\nexport interface LinkPredictionOptions<NodeId extends string = string>\n extends GraphBuildOptions {\n metric?: SimilarityMetric;\n limit?: number;\n minScore?: number;\n allowExistingEdges?: boolean;\n sourceFilter?: NodeId[];\n targetFilter?: NodeId[];\n}\n\nexport interface LinkPredictionRecord<NodeId extends string = string> {\n from: NodeId;\n to: NodeId;\n score: number;\n metric: SimilarityMetric;\n rank: number;\n}\n\nexport interface LinkPredictionResult<NodeId extends string = string> {\n metric: SimilarityMetric;\n predictions: LinkPredictionRecord<NodeId>[];\n}\n\nexport interface AStarOptions<NodeId extends string = string>\n extends GraphBuildOptions {\n heuristic?: (nodeId: NodeId, targetId: NodeId) => number;\n}\n\nexport interface AStarResult<NodeId extends string = string> {\n source: NodeId;\n target: NodeId;\n path: NodeId[];\n distance: number;\n reachable: boolean;\n explored: number;\n estimatedDistance: number;\n}\n\nexport interface PathRecord<NodeId extends string = string> {\n path: NodeId[];\n distance: number;\n}\n\nexport interface YenKShortestPathsOptions extends GraphBuildOptions {\n k?: number;\n shortestPathAlgorithm?: ShortestPathAlgorithm;\n}\n\nexport interface YenKShortestPathsResult<NodeId extends string = string> {\n source: NodeId;\n target: NodeId;\n paths: PathRecord<NodeId>[];\n complete: boolean;\n}\n\nexport interface AllPairsShortestPathsOptions extends GraphBuildOptions {\n algorithm?: ShortestPathAlgorithm;\n failOnNegativeCycle?: boolean;\n}\n\nexport interface AllPairsShortestPathsResult<NodeId extends string = string> {\n nodes: NodeId[];\n distanceBySource: Map<NodeId, Map<NodeId, number>>;\n previousBySource: Map<NodeId, Map<NodeId, NodeId>>;\n algorithm: ShortestPathAlgorithm;\n hasNegativeWeights: boolean;\n negativeCycle: boolean;\n}\n\nexport interface FlowEdge<NodeId extends string = string> {\n from: NodeId;\n to: NodeId;\n capacity: number;\n cost?: number;\n}\n\nexport interface FlowEdgeResult<NodeId extends string = string> {\n from: NodeId;\n to: NodeId;\n flow: number;\n capacity: number;\n}\n\nexport interface MaximumFlowOptions extends GraphBuildOptions {}\n\nexport interface MaximumFlowResult<NodeId extends string = string> {\n source: NodeId;\n sink: NodeId;\n maxFlow: number;\n augmentations: number;\n flowByEdge: FlowEdgeResult<NodeId>[];\n sourcePartition: NodeId[];\n sinkPartition: NodeId[];\n cutEdges: Array<Required<GraphEdge<NodeId>>>;\n}\n\nexport interface MinCostMaxFlowOptions extends GraphBuildOptions {\n targetFlow?: number;\n}\n\nexport interface MinCostFlowEdgeResult<NodeId extends string = string>\n extends FlowEdgeResult<NodeId> {\n cost: number;\n}\n\nexport interface MinCostMaxFlowResult<NodeId extends string = string> {\n source: NodeId;\n sink: NodeId;\n flow: number;\n cost: number;\n complete: boolean;\n augmentations: number;\n flowByEdge: MinCostFlowEdgeResult<NodeId>[];\n}\n\nexport type KMeansNormalization = 'none' | 'zscore' | 'minmax';\n\nexport interface KMeansOptions {\n maxIterations?: number;\n tolerance?: number;\n seed?: number;\n nInit?: number;\n normalization?: KMeansNormalization;\n useKMeansPlusPlus?: boolean;\n}\n\nexport interface KMeansCluster {\n centroid: number[];\n indices: number[];\n}\n\nexport interface KMeansResult {\n assignments: number[];\n clusters: KMeansCluster[];\n iterations: number;\n inertia: number;\n converged: boolean;\n silhouette: number | null;\n selectedSeed: number;\n}\n\nexport interface KMeansAutoOptions extends KMeansOptions {\n kMin?: number;\n kMax?: number;\n}\n\nexport interface KMeansAutoCandidate {\n k: number;\n silhouette: number | null;\n inertia: number;\n}\n\nexport interface KMeansAutoResult extends KMeansResult {\n selectedK: number;\n candidates: KMeansAutoCandidate[];\n}\n\nexport interface TravelingSalesmanOptions<NodeId extends string = string>\n extends GraphBuildOptions {\n start?: NodeId;\n returnToStart?: boolean;\n twoOptPasses?: number;\n multiStartCount?: number;\n startCandidates?: NodeId[];\n seed?: number;\n shortestPathAlgorithm?: ShortestPathAlgorithm;\n}\n\nexport interface TravelingSalesmanSegment<NodeId extends string = string> {\n from: NodeId;\n to: NodeId;\n distance: number;\n path: NodeId[];\n}\n\nexport interface TravelingSalesmanResult<NodeId extends string = string> {\n order: NodeId[];\n distance: number;\n segments: TravelingSalesmanSegment<NodeId>[];\n visitedCount: number;\n complete: boolean;\n unreachableNodes: NodeId[];\n lowerBound: number;\n optimalityGap: number | null;\n}\n\ninterface SingleSourceShortestResult<NodeId extends string = string> {\n distanceByNode: Map<NodeId, number>;\n previousByNode: Map<NodeId, NodeId>;\n explored: number;\n negativeCycleNodes: Set<NodeId>;\n}\n\ninterface ShortestPathEngineResult<NodeId extends string = string> {\n algorithm: ShortestPathAlgorithm;\n result: SingleSourceShortestResult<NodeId>;\n hasNegativeWeights: boolean;\n}\n\ninterface PointNormalizationTransform {\n normalize: (point: number[]) => number[];\n denormalize: (point: number[]) => number[];\n}\n\ninterface KMeansRunResult {\n assignments: number[];\n centroidsNormalized: number[][];\n iterations: number;\n inertia: number;\n converged: boolean;\n}\n\nclass MinPriorityQueue<Value> {\n private heap: Array<{ priority: number; value: Value }> = [];\n\n get size(): number {\n return this.heap.length;\n }\n\n push(value: Value, priority: number): void {\n this.heap.push({ priority, value });\n this.siftUp(this.heap.length - 1);\n }\n\n pop(): { priority: number; value: Value } | undefined {\n if (this.heap.length === 0) {\n return undefined;\n }\n\n const top = this.heap[0];\n const last = this.heap.pop();\n\n if (this.heap.length > 0 && last) {\n this.heap[0] = last;\n this.siftDown(0);\n }\n\n return top;\n }\n\n private siftUp(index: number): void {\n let cursor = index;\n\n while (cursor > 0) {\n const parent = Math.floor((cursor - 1) / 2);\n const current = this.heap[cursor];\n const parentItem = this.heap[parent];\n\n if (!current || !parentItem) {\n return;\n }\n if (parentItem.priority <= current.priority) {\n return;\n }\n\n this.heap[parent] = current;\n this.heap[cursor] = parentItem;\n cursor = parent;\n }\n }\n\n private siftDown(index: number): void {\n let cursor = index;\n\n while (true) {\n const left = cursor * 2 + 1;\n const right = cursor * 2 + 2;\n let smallest = cursor;\n\n const current = this.heap[smallest];\n const leftItem = this.heap[left];\n const rightItem = this.heap[right];\n\n if (current && leftItem && leftItem.priority < current.priority) {\n smallest = left;\n }\n\n const currentSmallest = this.heap[smallest];\n if (\n currentSmallest &&\n rightItem &&\n rightItem.priority < currentSmallest.priority\n ) {\n smallest = right;\n }\n\n if (smallest === cursor) {\n return;\n }\n\n const cursorItem = this.heap[cursor];\n const smallestItem = this.heap[smallest];\n if (!cursorItem || !smallestItem) {\n return;\n }\n\n this.heap[cursor] = smallestItem;\n this.heap[smallest] = cursorItem;\n cursor = smallest;\n }\n }\n}\n\nfunction defaultTieBreaker(left: string, right: string): number {\n return left.localeCompare(right);\n}\n\nfunction canonicalUndirectedEdge<NodeId extends string>(\n left: NodeId,\n right: NodeId,\n): { from: NodeId; to: NodeId } {\n return defaultTieBreaker(left, right) <= 0\n ? { from: left, to: right }\n : { from: right, to: left };\n}\n\nfunction undirectedEdgeKey<NodeId extends string>(left: NodeId, right: NodeId): string {\n const edge = canonicalUndirectedEdge(left, right);\n return `${edge.from}\\u0000${edge.to}`;\n}\n\nfunction asNodeId<NodeId extends string>(input: GraphNodeInput<NodeId>): NodeId {\n return typeof input === 'string' ? input : input.id;\n}\n\nclass DisjointSet<NodeId extends string> {\n private parent = new Map<NodeId, NodeId>();\n\n private rank = new Map<NodeId, number>();\n\n constructor(nodes: NodeId[]) {\n for (const nodeId of nodes) {\n this.parent.set(nodeId, nodeId);\n this.rank.set(nodeId, 0);\n }\n }\n\n find(nodeId: NodeId): NodeId {\n const parent = this.parent.get(nodeId);\n if (!parent || parent === nodeId) {\n return nodeId;\n }\n\n const root = this.find(parent);\n this.parent.set(nodeId, root);\n return root;\n }\n\n union(left: NodeId, right: NodeId): boolean {\n const leftRoot = this.find(left);\n const rightRoot = this.find(right);\n if (leftRoot === rightRoot) {\n return false;\n }\n\n const leftRank = this.rank.get(leftRoot) ?? 0;\n const rightRank = this.rank.get(rightRoot) ?? 0;\n\n if (leftRank < rightRank) {\n this.parent.set(leftRoot, rightRoot);\n return true;\n }\n\n if (leftRank > rightRank) {\n this.parent.set(rightRoot, leftRoot);\n return true;\n }\n\n this.parent.set(rightRoot, leftRoot);\n this.rank.set(leftRoot, leftRank + 1);\n return true;\n }\n}\n\nfunction dedupeNodeList<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n): NodeId[] {\n const seen = new Set<NodeId>();\n const ordered: NodeId[] = [];\n\n for (const node of nodes) {\n const nodeId = asNodeId(node);\n if (!seen.has(nodeId)) {\n seen.add(nodeId);\n ordered.push(nodeId);\n }\n }\n\n for (const edge of edges) {\n if (!seen.has(edge.from)) {\n seen.add(edge.from);\n ordered.push(edge.from);\n }\n if (!seen.has(edge.to)) {\n seen.add(edge.to);\n ordered.push(edge.to);\n }\n }\n\n return ordered;\n}\n\nfunction normalizeWeight(weight: number | undefined): number {\n if (weight === undefined) {\n return 1;\n }\n\n if (!Number.isFinite(weight)) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n `Graph edge weight must be finite, received ${weight}`,\n );\n }\n\n return weight;\n}\n\nfunction initializeNeighborMap<NodeId extends string>(\n nodeIds: NodeId[],\n): Map<NodeId, Map<NodeId, number>> {\n const map = new Map<NodeId, Map<NodeId, number>>();\n for (const nodeId of nodeIds) {\n map.set(nodeId, new Map<NodeId, number>());\n }\n return map;\n}\n\nfunction maybeUpdateEdge<NodeId extends string>(\n map: Map<NodeId, Map<NodeId, number>>,\n from: NodeId,\n to: NodeId,\n weight: number,\n): void {\n const outgoing = map.get(from);\n if (!outgoing) {\n return;\n }\n\n const existing = outgoing.get(to);\n if (existing === undefined || weight < existing) {\n outgoing.set(to, weight);\n }\n}\n\nfunction buildNormalizedEdgeMap<NodeId extends string>(\n nodeIds: NodeId[],\n edges: GraphEdge<NodeId>[],\n directed: boolean,\n): Map<NodeId, Map<NodeId, number>> {\n const neighbors = initializeNeighborMap(nodeIds);\n\n for (const edge of edges) {\n if (edge.from === edge.to) {\n continue;\n }\n\n const weight = normalizeWeight(edge.weight);\n if (!neighbors.has(edge.from) || !neighbors.has(edge.to)) {\n continue;\n }\n\n maybeUpdateEdge(neighbors, edge.from, edge.to, weight);\n if (!directed) {\n maybeUpdateEdge(neighbors, edge.to, edge.from, weight);\n }\n }\n\n return neighbors;\n}\n\nfunction toNeighborList<NodeId extends string>(\n edgeMap: Map<NodeId, Map<NodeId, number>>,\n): Map<NodeId, GraphNeighbor<NodeId>[]> {\n const neighborsByNode = new Map<NodeId, GraphNeighbor<NodeId>[]>();\n\n for (const [nodeId, outgoing] of edgeMap.entries()) {\n const neighbors: GraphNeighbor<NodeId>[] = [];\n for (const [targetId, weight] of outgoing.entries()) {\n neighbors.push({ id: targetId, weight });\n }\n neighborsByNode.set(nodeId, neighbors);\n }\n\n return neighborsByNode;\n}\n\nfunction createIncomingByNode<NodeId extends string>(\n nodeIds: NodeId[],\n neighborsByNode: Map<NodeId, GraphNeighbor<NodeId>[]>,\n): Map<NodeId, GraphNeighbor<NodeId>[]> {\n const incomingByNode = new Map<NodeId, GraphNeighbor<NodeId>[]>();\n for (const nodeId of nodeIds) {\n incomingByNode.set(nodeId, []);\n }\n\n for (const [fromId, neighbors] of neighborsByNode.entries()) {\n for (const neighbor of neighbors) {\n const incoming = incomingByNode.get(neighbor.id);\n if (!incoming) {\n continue;\n }\n incoming.push({ id: fromId, weight: neighbor.weight });\n }\n }\n\n return incomingByNode;\n}\n\nfunction toEdgeList<NodeId extends string>(\n neighborsByNode: Map<NodeId, GraphNeighbor<NodeId>[]>,\n): Array<Required<GraphEdge<NodeId>>> {\n const edges: Array<Required<GraphEdge<NodeId>>> = [];\n for (const [fromId, neighbors] of neighborsByNode.entries()) {\n for (const neighbor of neighbors) {\n edges.push({\n from: fromId,\n to: neighbor.id,\n weight: neighbor.weight,\n });\n }\n }\n return edges;\n}\n\nfunction hasNegativeWeights<NodeId extends string>(\n adjacency: GraphAdjacency<NodeId>,\n): boolean {\n for (const edge of adjacency.edges) {\n if (edge.weight < 0) {\n return true;\n }\n }\n return false;\n}\n\nfunction reconstructPath<NodeId extends string>(\n source: NodeId,\n target: NodeId,\n previousByNode: Map<NodeId, NodeId>,\n): NodeId[] {\n if (source === target) {\n return [source];\n }\n\n const reversed: NodeId[] = [target];\n let cursor: NodeId | undefined = target;\n\n while (cursor && cursor !== source) {\n const previous = previousByNode.get(cursor);\n if (!previous) {\n return [];\n }\n reversed.push(previous);\n cursor = previous;\n }\n\n reversed.reverse();\n return reversed[0] === source ? reversed : [];\n}\n\nfunction sumNeighborWeights<NodeId extends string>(\n neighbors: GraphNeighbor<NodeId>[],\n): number {\n return neighbors.reduce((sum, neighbor) => sum + neighbor.weight, 0);\n}\n\nfunction collectUniqueUndirectedEdges<NodeId extends string>(\n adjacency: GraphAdjacency<NodeId>,\n): Array<Required<GraphEdge<NodeId>>> {\n const byKey = new Map<string, Required<GraphEdge<NodeId>>>();\n\n for (const edge of adjacency.edges) {\n const canonical = canonicalUndirectedEdge(edge.from, edge.to);\n const key = undirectedEdgeKey(canonical.from, canonical.to);\n const existing = byKey.get(key);\n if (!existing || edge.weight < existing.weight - 1e-12) {\n byKey.set(key, {\n from: canonical.from,\n to: canonical.to,\n weight: edge.weight,\n });\n }\n }\n\n return Array.from(byKey.values());\n}\n\nfunction computeModularity<NodeId extends string>(\n adjacency: GraphAdjacency<NodeId>,\n communityByNode: Map<NodeId, number>,\n): number {\n const uniqueEdges = collectUniqueUndirectedEdges(adjacency);\n let totalEdgeWeight = 0;\n for (const edge of uniqueEdges) {\n totalEdgeWeight += edge.weight;\n }\n\n if (!Number.isFinite(totalEdgeWeight) || totalEdgeWeight <= 0) {\n return 0;\n }\n\n const degreeByNode = new Map<NodeId, number>();\n for (const nodeId of adjacency.nodes) {\n degreeByNode.set(\n nodeId,\n sumNeighborWeights(adjacency.neighborsByNode.get(nodeId) ?? []),\n );\n }\n\n const totalWeightByCommunity = new Map<number, number>();\n const internalWeightByCommunity = new Map<number, number>();\n\n for (const nodeId of adjacency.nodes) {\n const community = communityByNode.get(nodeId);\n if (community === undefined) {\n continue;\n }\n const degree = degreeByNode.get(nodeId) ?? 0;\n totalWeightByCommunity.set(\n community,\n (totalWeightByCommunity.get(community) ?? 0) + degree,\n );\n }\n\n for (const edge of uniqueEdges) {\n const fromCommunity = communityByNode.get(edge.from);\n const toCommunity = communityByNode.get(edge.to);\n if (fromCommunity === undefined || toCommunity === undefined) {\n continue;\n }\n if (fromCommunity !== toCommunity) {\n continue;\n }\n\n internalWeightByCommunity.set(\n fromCommunity,\n (internalWeightByCommunity.get(fromCommunity) ?? 0) + edge.weight,\n );\n }\n\n let modularity = 0;\n for (const [community, totalWeight] of totalWeightByCommunity.entries()) {\n const internal = internalWeightByCommunity.get(community) ?? 0;\n modularity +=\n internal / totalEdgeWeight -\n Math.pow(totalWeight / (2 * totalEdgeWeight), 2);\n }\n\n return modularity;\n}\n\nfunction buildCommunityResult<NodeId extends string>(\n adjacency: GraphAdjacency<NodeId>,\n labelsByNode: Map<NodeId, number>,\n iterations: number,\n converged: boolean,\n algorithm: CommunityDetectionResult<NodeId>['algorithm'],\n): CommunityDetectionResult<NodeId> {\n const communitiesRaw = new Map<number, NodeId[]>();\n for (const nodeId of adjacency.nodes) {\n const label = labelsByNode.get(nodeId);\n if (label === undefined) {\n continue;\n }\n const members = communitiesRaw.get(label) ?? [];\n members.push(nodeId);\n communitiesRaw.set(label, members);\n }\n\n const communities = Array.from(communitiesRaw.values()).map((members) =>\n [...members].sort(defaultTieBreaker),\n );\n communities.sort((left, right) =>\n defaultTieBreaker(left[0] ?? '', right[0] ?? ''),\n );\n\n const communityByNode = new Map<NodeId, number>();\n for (let index = 0; index < communities.length; index += 1) {\n for (const nodeId of communities[index] ?? []) {\n communityByNode.set(nodeId, index);\n }\n }\n\n return {\n communities,\n communityByNode,\n iterations,\n converged,\n algorithm,\n modularity: computeModularity(adjacency, communityByNode),\n };\n}\n\nfunction buildNeighborIdSetMap<NodeId extends string>(\n adjacency: GraphAdjacency<NodeId>,\n): Map<NodeId, Set<NodeId>> {\n const output = new Map<NodeId, Set<NodeId>>();\n\n for (const nodeId of adjacency.nodes) {\n output.set(nodeId, new Set<NodeId>());\n }\n\n for (const [nodeId, neighbors] of adjacency.neighborsByNode.entries()) {\n const set = output.get(nodeId);\n if (!set) {\n continue;\n }\n for (const neighbor of neighbors) {\n set.add(neighbor.id);\n }\n }\n\n return output;\n}\n\nfunction computeSimilarityScore<NodeId extends string>(\n leftId: NodeId,\n rightId: NodeId,\n neighborSets: Map<NodeId, Set<NodeId>>,\n metric: SimilarityMetric,\n): number {\n const left = neighborSets.get(leftId) ?? new Set<NodeId>();\n const right = neighborSets.get(rightId) ?? new Set<NodeId>();\n const leftSize = left.size;\n const rightSize = right.size;\n\n const iterate = leftSize <= rightSize ? left : right;\n const lookup = iterate === left ? right : left;\n let common = 0;\n let adamicAdar = 0;\n let resourceAllocation = 0;\n\n for (const neighbor of iterate) {\n if (!lookup.has(neighbor)) {\n continue;\n }\n\n common += 1;\n const degree = neighborSets.get(neighbor)?.size ?? 0;\n if (degree > 1) {\n adamicAdar += 1 / Math.log(degree);\n }\n if (degree > 0) {\n resourceAllocation += 1 / degree;\n }\n }\n\n if (metric === 'common-neighbors') {\n return common;\n }\n if (metric === 'preferential-attachment') {\n return leftSize * rightSize;\n }\n if (metric === 'adamic-adar') {\n return adamicAdar;\n }\n if (metric === 'resource-allocation') {\n return resourceAllocation;\n }\n if (metric === 'jaccard') {\n const union = leftSize + rightSize - common;\n return union > 0 ? common / union : 0;\n }\n if (metric === 'cosine') {\n return leftSize > 0 && rightSize > 0\n ? common / Math.sqrt(leftSize * rightSize)\n : 0;\n }\n\n const overlapDenominator = Math.min(leftSize, rightSize);\n return overlapDenominator > 0 ? common / overlapDenominator : 0;\n}\n\nfunction routeDistanceForPath<NodeId extends string>(\n path: NodeId[],\n adjacency: GraphAdjacency<NodeId>,\n): number {\n if (path.length <= 1) {\n return 0;\n }\n\n let total = 0;\n for (let index = 1; index < path.length; index += 1) {\n const fromId = path[index - 1];\n const toId = path[index];\n if (!fromId || !toId) {\n return Number.POSITIVE_INFINITY;\n }\n\n const weight = adjacency.neighborsByNode\n .get(fromId)\n ?.find((neighbor) => neighbor.id === toId)?.weight;\n if (weight === undefined || !Number.isFinite(weight)) {\n return Number.POSITIVE_INFINITY;\n }\n total += weight;\n }\n\n return total;\n}\n\nfunction pathKey<NodeId extends string>(path: NodeId[]): string {\n return path.join('\\u0000');\n}\n\nfunction hasSamePrefix<NodeId extends string>(\n path: NodeId[],\n prefix: NodeId[],\n): boolean {\n if (prefix.length > path.length) {\n return false;\n }\n for (let index = 0; index < prefix.length; index += 1) {\n if (path[index] !== prefix[index]) {\n return false;\n }\n }\n return true;\n}\n\nfunction chooseShortestPathAlgorithm(\n requested: ShortestPathAlgorithm,\n hasNegative: boolean,\n): ShortestPathAlgorithm {\n if (requested === 'auto') {\n return hasNegative ? 'bellman-ford' : 'dijkstra';\n }\n return requested;\n}\n\nfunction runDijkstra<NodeId extends string>(\n adjacency: GraphAdjacency<NodeId>,\n source: NodeId,\n): SingleSourceShortestResult<NodeId> {\n if (hasNegativeWeights(adjacency)) {\n throw new GraphAlgorithmError(\n 'NEGATIVE_WEIGHT',\n 'Dijkstra cannot run on negative graph weights.',\n );\n }\n\n const distanceByNode = new Map<NodeId, number>();\n const previousByNode = new Map<NodeId, NodeId>();\n const settled = new Set<NodeId>();\n const queue = new MinPriorityQueue<NodeId>();\n\n for (const nodeId of adjacency.nodes) {\n distanceByNode.set(nodeId, Number.POSITIVE_INFINITY);\n }\n\n distanceByNode.set(source, 0);\n queue.push(source, 0);\n\n while (queue.size > 0) {\n const item = queue.pop();\n if (!item) {\n break;\n }\n\n const nodeId = item.value;\n if (settled.has(nodeId)) {\n continue;\n }\n settled.add(nodeId);\n\n const currentDistance = distanceByNode.get(nodeId);\n if (currentDistance === undefined || !Number.isFinite(currentDistance)) {\n continue;\n }\n\n const neighbors = adjacency.neighborsByNode.get(nodeId) ?? [];\n for (const neighbor of neighbors) {\n const nextDistance = currentDistance + neighbor.weight;\n const existingDistance = distanceByNode.get(neighbor.id);\n\n if (\n existingDistance === undefined ||\n nextDistance < existingDistance - 1e-12\n ) {\n distanceByNode.set(neighbor.id, nextDistance);\n previousByNode.set(neighbor.id, nodeId);\n queue.push(neighbor.id, nextDistance);\n }\n }\n }\n\n return {\n distanceByNode,\n previousByNode,\n explored: settled.size,\n negativeCycleNodes: new Set<NodeId>(),\n };\n}\n\nfunction runBellmanFord<NodeId extends string>(\n adjacency: GraphAdjacency<NodeId>,\n source: NodeId,\n): SingleSourceShortestResult<NodeId> {\n const distanceByNode = new Map<NodeId, number>();\n const previousByNode = new Map<NodeId, NodeId>();\n\n for (const nodeId of adjacency.nodes) {\n distanceByNode.set(nodeId, Number.POSITIVE_INFINITY);\n }\n distanceByNode.set(source, 0);\n\n const totalNodes = adjacency.nodes.length;\n\n for (let iteration = 0; iteration < totalNodes - 1; iteration += 1) {\n let changed = false;\n\n for (const edge of adjacency.edges) {\n const fromDistance = distanceByNode.get(edge.from);\n if (fromDistance === undefined || !Number.isFinite(fromDistance)) {\n continue;\n }\n\n const candidate = fromDistance + edge.weight;\n const current = distanceByNode.get(edge.to);\n if (current === undefined || candidate < current - 1e-12) {\n distanceByNode.set(edge.to, candidate);\n previousByNode.set(edge.to, edge.from);\n changed = true;\n }\n }\n\n if (!changed) {\n break;\n }\n }\n\n const negativeCycleNodes = new Set<NodeId>();\n const queue: NodeId[] = [];\n\n for (const edge of adjacency.edges) {\n const fromDistance = distanceByNode.get(edge.from);\n const toDistance = distanceByNode.get(edge.to);\n\n if (\n fromDistance !== undefined &&\n Number.isFinite(fromDistance) &&\n toDistance !== undefined &&\n fromDistance + edge.weight < toDistance - 1e-12\n ) {\n if (!negativeCycleNodes.has(edge.to)) {\n negativeCycleNodes.add(edge.to);\n queue.push(edge.to);\n }\n if (!negativeCycleNodes.has(edge.from)) {\n negativeCycleNodes.add(edge.from);\n queue.push(edge.from);\n }\n }\n }\n\n let cursor = 0;\n while (cursor < queue.length) {\n const nodeId = queue[cursor];\n cursor += 1;\n if (!nodeId) {\n continue;\n }\n\n for (const neighbor of adjacency.neighborsByNode.get(nodeId) ?? []) {\n if (!negativeCycleNodes.has(neighbor.id)) {\n negativeCycleNodes.add(neighbor.id);\n queue.push(neighbor.id);\n }\n }\n }\n\n if (negativeCycleNodes.size > 0) {\n for (const nodeId of negativeCycleNodes) {\n distanceByNode.set(nodeId, Number.NEGATIVE_INFINITY);\n previousByNode.delete(nodeId);\n }\n }\n\n let explored = 0;\n for (const nodeId of adjacency.nodes) {\n const distance = distanceByNode.get(nodeId);\n if (distance !== undefined && Number.isFinite(distance)) {\n explored += 1;\n }\n }\n\n return {\n distanceByNode,\n previousByNode,\n explored,\n negativeCycleNodes,\n };\n}\n\nfunction runShortestPathEngine<NodeId extends string>(\n adjacency: GraphAdjacency<NodeId>,\n source: NodeId,\n requestedAlgorithm: ShortestPathAlgorithm,\n): ShortestPathEngineResult<NodeId> {\n const hasNegative = hasNegativeWeights(adjacency);\n const algorithm = chooseShortestPathAlgorithm(requestedAlgorithm, hasNegative);\n\n if (algorithm === 'dijkstra') {\n return {\n algorithm,\n result: runDijkstra(adjacency, source),\n hasNegativeWeights: hasNegative,\n };\n }\n\n return {\n algorithm,\n result: runBellmanFord(adjacency, source),\n hasNegativeWeights: hasNegative,\n };\n}\n\nfunction createRandom(seed: number | undefined): () => number {\n if (seed === undefined || !Number.isFinite(seed)) {\n return Math.random;\n }\n\n let state = (Math.floor(seed) >>> 0) || 1;\n return () => {\n state = (state * 1664525 + 1013904223) >>> 0;\n return state / 4294967296;\n };\n}\n\nfunction squaredDistance(left: number[], right: number[]): number {\n let sum = 0;\n for (let index = 0; index < left.length; index += 1) {\n const delta = (left[index] ?? 0) - (right[index] ?? 0);\n sum += delta * delta;\n }\n return sum;\n}\n\nfunction euclideanDistance(left: number[], right: number[]): number {\n return Math.sqrt(squaredDistance(left, right));\n}\n\nfunction normalizePoints(\n points: number[][],\n mode: KMeansNormalization,\n): PointNormalizationTransform {\n const dimensionality = points[0]?.length ?? 0;\n\n if (mode === 'none') {\n return {\n normalize: (point) => [...point],\n denormalize: (point) => [...point],\n };\n }\n\n const means = new Array<number>(dimensionality).fill(0);\n const mins = new Array<number>(dimensionality).fill(Number.POSITIVE_INFINITY);\n const maxs = new Array<number>(dimensionality).fill(Number.NEGATIVE_INFINITY);\n\n for (const point of points) {\n for (let axis = 0; axis < dimensionality; axis += 1) {\n const value = point[axis] ?? 0;\n means[axis] = (means[axis] ?? 0) + value;\n mins[axis] = Math.min(mins[axis] ?? value, value);\n maxs[axis] = Math.max(maxs[axis] ?? value, value);\n }\n }\n\n for (let axis = 0; axis < dimensionality; axis += 1) {\n means[axis] = (means[axis] ?? 0) / points.length;\n }\n\n if (mode === 'minmax') {\n const ranges = maxs.map((max, axis) => {\n const min = mins[axis] ?? 0;\n return max - min;\n });\n\n return {\n normalize: (point) =>\n point.map((value, axis) => {\n const min = mins[axis] ?? 0;\n const range = ranges[axis] ?? 0;\n if (Math.abs(range) < 1e-12) {\n return 0;\n }\n return (value - min) / range;\n }),\n denormalize: (point) =>\n point.map((value, axis) => {\n const min = mins[axis] ?? 0;\n const range = ranges[axis] ?? 0;\n return value * range + min;\n }),\n };\n }\n\n const variances = new Array<number>(dimensionality).fill(0);\n for (const point of points) {\n for (let axis = 0; axis < dimensionality; axis += 1) {\n const delta = (point[axis] ?? 0) - (means[axis] ?? 0);\n variances[axis] = (variances[axis] ?? 0) + delta * delta;\n }\n }\n\n const stdDevs = variances.map((variance) => Math.sqrt(variance / points.length));\n\n return {\n normalize: (point) =>\n point.map((value, axis) => {\n const stdDev = stdDevs[axis] ?? 0;\n if (stdDev < 1e-12) {\n return 0;\n }\n return (value - (means[axis] ?? 0)) / stdDev;\n }),\n denormalize: (point) =>\n point.map((value, axis) => {\n const stdDev = stdDevs[axis] ?? 0;\n return value * stdDev + (means[axis] ?? 0);\n }),\n };\n}\n\nfunction initializeCentroids(\n points: number[][],\n k: number,\n random: () => number,\n useKMeansPlusPlus: boolean,\n): number[][] {\n if (points.length === 0) {\n return [];\n }\n\n if (!useKMeansPlusPlus) {\n const centroids: number[][] = [];\n const selected = new Set<number>();\n while (centroids.length < k) {\n const index = Math.floor(random() * points.length);\n if (selected.has(index)) {\n continue;\n }\n selected.add(index);\n centroids.push([...(points[index] ?? points[0] ?? [])]);\n }\n return centroids;\n }\n\n const centroids: number[][] = [];\n const selected = new Set<number>();\n\n const first = Math.floor(random() * points.length);\n selected.add(first);\n centroids.push([...(points[first] ?? points[0] ?? [])]);\n\n while (centroids.length < k) {\n const distanceWeights = new Array<number>(points.length).fill(0);\n let totalWeight = 0;\n\n for (let pointIndex = 0; pointIndex < points.length; pointIndex += 1) {\n if (selected.has(pointIndex)) {\n continue;\n }\n\n const point = points[pointIndex];\n if (!point) {\n continue;\n }\n\n let bestDistance = Number.POSITIVE_INFINITY;\n for (const centroid of centroids) {\n bestDistance = Math.min(bestDistance, squaredDistance(point, centroid));\n }\n\n distanceWeights[pointIndex] = bestDistance;\n totalWeight += bestDistance;\n }\n\n if (!Number.isFinite(totalWeight) || totalWeight <= 0) {\n for (let pointIndex = 0; pointIndex < points.length; pointIndex += 1) {\n if (!selected.has(pointIndex)) {\n selected.add(pointIndex);\n centroids.push([...(points[pointIndex] ?? points[0] ?? [])]);\n break;\n }\n }\n continue;\n }\n\n const threshold = random() * totalWeight;\n let running = 0;\n let pickedIndex = -1;\n\n for (let pointIndex = 0; pointIndex < points.length; pointIndex += 1) {\n if (selected.has(pointIndex)) {\n continue;\n }\n running += distanceWeights[pointIndex] ?? 0;\n if (running >= threshold) {\n pickedIndex = pointIndex;\n break;\n }\n }\n\n if (pickedIndex < 0) {\n for (let pointIndex = 0; pointIndex < points.length; pointIndex += 1) {\n if (!selected.has(pointIndex)) {\n pickedIndex = pointIndex;\n break;\n }\n }\n }\n\n if (pickedIndex < 0) {\n break;\n }\n\n selected.add(pickedIndex);\n centroids.push([...(points[pickedIndex] ?? points[0] ?? [])]);\n }\n\n return centroids;\n}\n\nfunction runSingleKMeans(\n points: number[][],\n k: number,\n random: () => number,\n maxIterations: number,\n tolerance: number,\n useKMeansPlusPlus: boolean,\n): KMeansRunResult {\n const dimensionality = points[0]?.length ?? 0;\n let centroids = initializeCentroids(points, k, random, useKMeansPlusPlus);\n\n if (centroids.length !== k) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n 'Unable to initialize centroids for k-means.',\n );\n }\n\n const assignments = new Array<number>(points.length).fill(-1);\n let iterations = 0;\n let converged = false;\n let inertia = Number.POSITIVE_INFINITY;\n\n while (iterations < maxIterations) {\n iterations += 1;\n let changed = false;\n inertia = 0;\n\n for (let pointIndex = 0; pointIndex < points.length; pointIndex += 1) {\n const point = points[pointIndex];\n if (!point) {\n continue;\n }\n\n let bestCluster = 0;\n let bestDistance = Number.POSITIVE_INFINITY;\n\n for (let clusterIndex = 0; clusterIndex < centroids.length; clusterIndex += 1) {\n const centroid = centroids[clusterIndex];\n if (!centroid) {\n continue;\n }\n const distance = squaredDistance(point, centroid);\n if (distance < bestDistance) {\n bestDistance = distance;\n bestCluster = clusterIndex;\n }\n }\n\n inertia += bestDistance;\n if (assignments[pointIndex] !== bestCluster) {\n assignments[pointIndex] = bestCluster;\n changed = true;\n }\n }\n\n const nextCentroids = new Array<number[]>(k);\n const counts = new Array<number>(k).fill(0);\n\n for (let clusterIndex = 0; clusterIndex < k; clusterIndex += 1) {\n nextCentroids[clusterIndex] = new Array<number>(dimensionality).fill(0);\n }\n\n for (let pointIndex = 0; pointIndex < points.length; pointIndex += 1) {\n const clusterIndex = assignments[pointIndex];\n if (clusterIndex < 0) {\n continue;\n }\n\n const point = points[pointIndex];\n const centroid = nextCentroids[clusterIndex];\n if (!point || !centroid) {\n continue;\n }\n\n counts[clusterIndex] = (counts[clusterIndex] ?? 0) + 1;\n for (let axis = 0; axis < dimensionality; axis += 1) {\n centroid[axis] = (centroid[axis] ?? 0) + (point[axis] ?? 0);\n }\n }\n\n for (let clusterIndex = 0; clusterIndex < k; clusterIndex += 1) {\n const count = counts[clusterIndex] ?? 0;\n if (count > 0) {\n const centroid = nextCentroids[clusterIndex];\n if (!centroid) {\n continue;\n }\n for (let axis = 0; axis < dimensionality; axis += 1) {\n centroid[axis] = (centroid[axis] ?? 0) / count;\n }\n } else {\n let farthestIndex = 0;\n let farthestDistance = -1;\n\n for (let pointIndex = 0; pointIndex < points.length; pointIndex += 1) {\n const assigned = assignments[pointIndex];\n const centroid = centroids[assigned];\n const point = points[pointIndex];\n if (!centroid || !point) {\n continue;\n }\n\n const distance = squaredDistance(point, centroid);\n if (distance > farthestDistance) {\n farthestDistance = distance;\n farthestIndex = pointIndex;\n }\n }\n\n nextCentroids[clusterIndex] = [...(points[farthestIndex] ?? points[0] ?? [])];\n }\n }\n\n let maxShift = 0;\n for (let clusterIndex = 0; clusterIndex < k; clusterIndex += 1) {\n const previous = centroids[clusterIndex];\n const next = nextCentroids[clusterIndex];\n if (!previous || !next) {\n continue;\n }\n maxShift = Math.max(maxShift, Math.sqrt(squaredDistance(previous, next)));\n }\n\n centroids = nextCentroids;\n\n if (!changed || maxShift <= tolerance) {\n converged = true;\n break;\n }\n }\n\n return {\n assignments,\n centroidsNormalized: centroids,\n iterations,\n inertia,\n converged,\n };\n}\n\nfunction computeSilhouette(points: number[][], assignments: number[], k: number): number | null {\n if (points.length <= 1 || k <= 1) {\n return null;\n }\n\n const clusters: number[][] = Array.from({ length: k }, (): number[] => []);\n for (let index = 0; index < assignments.length; index += 1) {\n const cluster = assignments[index] ?? -1;\n if (cluster >= 0 && cluster < k) {\n const clusterMembers = clusters[cluster];\n if (clusterMembers) {\n clusterMembers.push(index);\n }\n }\n }\n\n let total = 0;\n let counted = 0;\n\n for (let index = 0; index < points.length; index += 1) {\n const point = points[index];\n const ownCluster = assignments[index] ?? -1;\n\n if (!point || ownCluster < 0 || ownCluster >= k) {\n continue;\n }\n\n const ownMembers = clusters[ownCluster] ?? [];\n if (ownMembers.length <= 1) {\n continue;\n }\n\n let a = 0;\n for (const neighborIndex of ownMembers) {\n if (neighborIndex === index) {\n continue;\n }\n const neighbor = points[neighborIndex];\n if (!neighbor) {\n continue;\n }\n a += euclideanDistance(point, neighbor);\n }\n a /= ownMembers.length - 1;\n\n let b = Number.POSITIVE_INFINITY;\n\n for (let cluster = 0; cluster < k; cluster += 1) {\n if (cluster === ownCluster) {\n continue;\n }\n\n const members = clusters[cluster] ?? [];\n if (members.length === 0) {\n continue;\n }\n\n let distanceToCluster = 0;\n for (const neighborIndex of members) {\n const neighbor = points[neighborIndex];\n if (!neighbor) {\n continue;\n }\n distanceToCluster += euclideanDistance(point, neighbor);\n }\n distanceToCluster /= members.length;\n b = Math.min(b, distanceToCluster);\n }\n\n if (!Number.isFinite(b)) {\n continue;\n }\n\n const denominator = Math.max(a, b);\n if (denominator <= 0) {\n continue;\n }\n\n total += (b - a) / denominator;\n counted += 1;\n }\n\n if (counted === 0) {\n return null;\n }\n\n return total / counted;\n}\n\nfunction routeDistanceFromMatrix<NodeId extends string>(\n route: NodeId[],\n distanceMatrix: Map<NodeId, Map<NodeId, number>>,\n): number {\n let total = 0;\n\n for (let index = 1; index < route.length; index += 1) {\n const fromId = route[index - 1];\n const toId = route[index];\n if (!fromId || !toId) {\n return Number.POSITIVE_INFINITY;\n }\n\n const distance = distanceMatrix.get(fromId)?.get(toId);\n if (distance === undefined || !Number.isFinite(distance)) {\n return Number.POSITIVE_INFINITY;\n }\n\n total += distance;\n }\n\n return total;\n}\n\nfunction optimizeRouteTwoOpt<NodeId extends string>(\n route: NodeId[],\n distanceMatrix: Map<NodeId, Map<NodeId, number>>,\n passes: number,\n): NodeId[] {\n if (route.length < 4 || passes <= 0) {\n return route;\n }\n\n let best = [...route];\n let bestDistance = routeDistanceFromMatrix(best, distanceMatrix);\n\n if (!Number.isFinite(bestDistance)) {\n return best;\n }\n\n for (let pass = 0; pass < passes; pass += 1) {\n let improved = false;\n\n for (let start = 1; start < best.length - 2; start += 1) {\n for (let end = start + 1; end < best.length - 1; end += 1) {\n const head = best.slice(0, start);\n const middle = best.slice(start, end + 1).reverse();\n const tail = best.slice(end + 1);\n const candidate = head.concat(middle, tail);\n const candidateDistance = routeDistanceFromMatrix(\n candidate,\n distanceMatrix,\n );\n\n if (candidateDistance + 1e-9 < bestDistance) {\n best = candidate;\n bestDistance = candidateDistance;\n improved = true;\n }\n }\n }\n\n if (!improved) {\n break;\n }\n }\n\n return best;\n}\n\nfunction createDeterministicStartList<NodeId extends string>(\n nodes: NodeId[],\n options: TravelingSalesmanOptions<NodeId>,\n): NodeId[] {\n const starts: NodeId[] = [];\n const used = new Set<NodeId>();\n\n if (options.start && nodes.includes(options.start)) {\n starts.push(options.start);\n used.add(options.start);\n }\n\n for (const candidate of options.startCandidates ?? []) {\n if (nodes.includes(candidate) && !used.has(candidate)) {\n starts.push(candidate);\n used.add(candidate);\n }\n }\n\n const random = createRandom(options.seed);\n const pool = nodes.filter((nodeId) => !used.has(nodeId));\n\n for (let index = pool.length - 1; index > 0; index -= 1) {\n const swapIndex = Math.floor(random() * (index + 1));\n const left = pool[index];\n const right = pool[swapIndex];\n if (left !== undefined && right !== undefined) {\n pool[index] = right;\n pool[swapIndex] = left;\n }\n }\n\n const desiredCount = Math.max(\n 1,\n Math.min(nodes.length, options.multiStartCount ?? Math.min(8, nodes.length)),\n );\n\n for (const nodeId of pool) {\n if (starts.length >= desiredCount) {\n break;\n }\n starts.push(nodeId);\n }\n\n if (starts.length === 0 && nodes.length > 0) {\n starts.push(nodes[0]!);\n }\n\n return starts;\n}\n\nfunction buildGreedyRoute<NodeId extends string>(\n start: NodeId,\n nodes: NodeId[],\n distanceMatrix: Map<NodeId, Map<NodeId, number>>,\n returnToStart: boolean,\n): NodeId[] {\n const route: NodeId[] = [start];\n const unvisited = new Set(nodes.filter((nodeId) => nodeId !== start));\n let cursor = start;\n\n while (unvisited.size > 0) {\n let nextNode: NodeId | null = null;\n let nextDistance = Number.POSITIVE_INFINITY;\n\n const distances = distanceMatrix.get(cursor);\n for (const candidate of unvisited) {\n const candidateDistance = distances?.get(candidate) ?? Number.POSITIVE_INFINITY;\n if (candidateDistance < nextDistance) {\n nextDistance = candidateDistance;\n nextNode = candidate;\n }\n }\n\n if (!nextNode || !Number.isFinite(nextDistance)) {\n break;\n }\n\n route.push(nextNode);\n unvisited.delete(nextNode);\n cursor = nextNode;\n }\n\n if (returnToStart && route.length > 1) {\n route.push(start);\n }\n\n return route;\n}\n\nfunction computeMstLowerBound<NodeId extends string>(\n nodes: NodeId[],\n distanceMatrix: Map<NodeId, Map<NodeId, number>>,\n): number {\n if (nodes.length <= 1) {\n return 0;\n }\n\n const visited = new Set<NodeId>();\n visited.add(nodes[0]!);\n let total = 0;\n\n while (visited.size < nodes.length) {\n let bestDistance = Number.POSITIVE_INFINITY;\n let nextNode: NodeId | null = null;\n\n for (const fromId of visited) {\n const distances = distanceMatrix.get(fromId);\n for (const toId of nodes) {\n if (visited.has(toId)) {\n continue;\n }\n\n const distance = distances?.get(toId) ?? Number.POSITIVE_INFINITY;\n if (distance < bestDistance) {\n bestDistance = distance;\n nextNode = toId;\n }\n }\n }\n\n if (!nextNode || !Number.isFinite(bestDistance)) {\n return Number.POSITIVE_INFINITY;\n }\n\n visited.add(nextNode);\n total += bestDistance;\n }\n\n return total;\n}\n\nexport function buildGraphAdjacency<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n options: GraphBuildOptions = {},\n): GraphAdjacency<NodeId> {\n const directed = options.directed ?? true;\n const nodeIds = dedupeNodeList(nodes, edges);\n const edgeMap = buildNormalizedEdgeMap(nodeIds, edges, directed);\n const neighborsByNode = toNeighborList(edgeMap);\n const incomingByNode = createIncomingByNode(nodeIds, neighborsByNode);\n\n return {\n nodes: nodeIds,\n neighborsByNode,\n incomingByNode,\n edges: toEdgeList(neighborsByNode),\n directed,\n };\n}\n\nexport function stronglyConnectedComponents<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n options: StronglyConnectedComponentsOptions = {},\n): StronglyConnectedComponentsResult<NodeId> {\n const adjacency = buildGraphAdjacency(nodes, edges, options);\n const components: NodeId[][] = [];\n\n if (!adjacency.directed) {\n const visited = new Set<NodeId>();\n\n for (const source of adjacency.nodes) {\n if (visited.has(source)) {\n continue;\n }\n\n const queue: NodeId[] = [source];\n visited.add(source);\n const component: NodeId[] = [];\n\n let cursor = 0;\n while (cursor < queue.length) {\n const nodeId = queue[cursor];\n cursor += 1;\n if (!nodeId) {\n continue;\n }\n\n component.push(nodeId);\n for (const neighbor of adjacency.neighborsByNode.get(nodeId) ?? []) {\n if (!visited.has(neighbor.id)) {\n visited.add(neighbor.id);\n queue.push(neighbor.id);\n }\n }\n }\n\n component.sort(defaultTieBreaker);\n components.push(component);\n }\n } else {\n let index = 0;\n const indexByNode = new Map<NodeId, number>();\n const lowLinkByNode = new Map<NodeId, number>();\n const stack: NodeId[] = [];\n const inStack = new Set<NodeId>();\n\n const strongConnect = (nodeId: NodeId): void => {\n indexByNode.set(nodeId, index);\n lowLinkByNode.set(nodeId, index);\n index += 1;\n stack.push(nodeId);\n inStack.add(nodeId);\n\n for (const neighbor of adjacency.neighborsByNode.get(nodeId) ?? []) {\n if (!indexByNode.has(neighbor.id)) {\n strongConnect(neighbor.id);\n const currentLow = lowLinkByNode.get(nodeId) ?? 0;\n const neighborLow = lowLinkByNode.get(neighbor.id) ?? 0;\n lowLinkByNode.set(nodeId, Math.min(currentLow, neighborLow));\n } else if (inStack.has(neighbor.id)) {\n const currentLow = lowLinkByNode.get(nodeId) ?? 0;\n const neighborIndex = indexByNode.get(neighbor.id) ?? 0;\n lowLinkByNode.set(nodeId, Math.min(currentLow, neighborIndex));\n }\n }\n\n if ((lowLinkByNode.get(nodeId) ?? -1) === (indexByNode.get(nodeId) ?? -2)) {\n const component: NodeId[] = [];\n\n while (stack.length > 0) {\n const member = stack.pop();\n if (!member) {\n break;\n }\n inStack.delete(member);\n component.push(member);\n if (member === nodeId) {\n break;\n }\n }\n\n component.sort(defaultTieBreaker);\n components.push(component);\n }\n };\n\n for (const nodeId of adjacency.nodes) {\n if (!indexByNode.has(nodeId)) {\n strongConnect(nodeId);\n }\n }\n }\n\n components.sort((left, right) => {\n const firstLeft = left[0] ?? '';\n const firstRight = right[0] ?? '';\n return defaultTieBreaker(firstLeft, firstRight);\n });\n\n const componentByNode = new Map<NodeId, number>();\n for (let componentIndex = 0; componentIndex < components.length; componentIndex += 1) {\n for (const nodeId of components[componentIndex] ?? []) {\n componentByNode.set(nodeId, componentIndex);\n }\n }\n\n return {\n components,\n componentByNode,\n };\n}\n\nexport function weaklyConnectedComponents<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n): WeaklyConnectedComponentsResult<NodeId> {\n const adjacency = buildGraphAdjacency(nodes, edges, { directed: false });\n const components: NodeId[][] = [];\n const componentByNode = new Map<NodeId, number>();\n const visited = new Set<NodeId>();\n\n for (const source of adjacency.nodes) {\n if (visited.has(source)) {\n continue;\n }\n\n const queue: NodeId[] = [source];\n visited.add(source);\n const component: NodeId[] = [];\n\n let cursor = 0;\n while (cursor < queue.length) {\n const nodeId = queue[cursor];\n cursor += 1;\n if (!nodeId) {\n continue;\n }\n\n component.push(nodeId);\n for (const neighbor of adjacency.neighborsByNode.get(nodeId) ?? []) {\n if (!visited.has(neighbor.id)) {\n visited.add(neighbor.id);\n queue.push(neighbor.id);\n }\n }\n }\n\n component.sort(defaultTieBreaker);\n const componentIndex = components.length;\n components.push(component);\n for (const nodeId of component) {\n componentByNode.set(nodeId, componentIndex);\n }\n }\n\n components.sort((left, right) => {\n const firstLeft = left[0] ?? '';\n const firstRight = right[0] ?? '';\n return defaultTieBreaker(firstLeft, firstRight);\n });\n\n componentByNode.clear();\n for (let componentIndex = 0; componentIndex < components.length; componentIndex += 1) {\n const component = components[componentIndex] ?? [];\n for (const nodeId of component) {\n componentByNode.set(nodeId, componentIndex);\n }\n }\n\n return {\n components,\n componentByNode,\n };\n}\n\nexport function topologicalSort<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n options: TopologicalSortOptions<NodeId> = {},\n): TopologicalSortResult<NodeId> {\n const nodeIds = dedupeNodeList(nodes, edges);\n const tieBreaker =\n options.tieBreaker ??\n ((left: NodeId, right: NodeId) => defaultTieBreaker(left, right));\n const priorityByNode = options.priorityByNode;\n const priorityAccessor =\n options.priority ??\n ((nodeId: NodeId) => {\n if (priorityByNode instanceof Map) {\n return priorityByNode.get(nodeId) ?? 0;\n }\n if (priorityByNode) {\n return priorityByNode[nodeId] ?? 0;\n }\n return 0;\n });\n const compareNodes = (left: NodeId, right: NodeId): number => {\n const priorityDelta = priorityAccessor(right) - priorityAccessor(left);\n if (Math.abs(priorityDelta) > 1e-12) {\n return priorityDelta;\n }\n return tieBreaker(left, right);\n };\n\n const outgoing = new Map<NodeId, Set<NodeId>>();\n const indegree = new Map<NodeId, number>();\n\n for (const nodeId of nodeIds) {\n outgoing.set(nodeId, new Set<NodeId>());\n indegree.set(nodeId, 0);\n }\n\n for (const edge of edges) {\n if (edge.from === edge.to) {\n continue;\n }\n if (!outgoing.has(edge.from) || !outgoing.has(edge.to)) {\n continue;\n }\n\n const targets = outgoing.get(edge.from);\n if (!targets || targets.has(edge.to)) {\n continue;\n }\n\n targets.add(edge.to);\n indegree.set(edge.to, (indegree.get(edge.to) ?? 0) + 1);\n }\n\n const queue = nodeIds\n .filter((nodeId) => (indegree.get(nodeId) ?? 0) === 0)\n .sort(compareNodes);\n\n const order: NodeId[] = [];\n\n while (queue.length > 0) {\n const nodeId = queue.shift();\n if (!nodeId) {\n continue;\n }\n\n order.push(nodeId);\n const targets = Array.from(outgoing.get(nodeId) ?? []).sort(compareNodes);\n\n for (const targetId of targets) {\n const next = (indegree.get(targetId) ?? 0) - 1;\n indegree.set(targetId, next);\n if (next === 0) {\n queue.push(targetId);\n }\n }\n\n queue.sort(compareNodes);\n }\n\n const orderSet = new Set(order);\n const leftovers = nodeIds.filter((nodeId) => !orderSet.has(nodeId));\n leftovers.sort(compareNodes);\n\n const directedScc = stronglyConnectedComponents(nodeIds, edges, { directed: true });\n const selfLoopNodes = new Set<NodeId>(\n edges.filter((edge) => edge.from === edge.to).map((edge) => edge.from),\n );\n\n const cycleNodes = new Set<NodeId>();\n for (const component of directedScc.components) {\n if (component.length > 1) {\n for (const nodeId of component) {\n cycleNodes.add(nodeId);\n }\n } else if (component.length === 1) {\n const nodeId = component[0];\n if (nodeId && selfLoopNodes.has(nodeId)) {\n cycleNodes.add(nodeId);\n }\n }\n }\n\n for (const nodeId of leftovers) {\n cycleNodes.add(nodeId);\n }\n\n for (const nodeId of leftovers) {\n if (!orderSet.has(nodeId)) {\n order.push(nodeId);\n orderSet.add(nodeId);\n }\n }\n\n return {\n order,\n cycleNodes: Array.from(cycleNodes).sort(compareNodes),\n isDag: cycleNodes.size === 0,\n };\n}\n\nexport function degreeCentrality<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n options: GraphBuildOptions = {},\n): Map<NodeId, DegreeCentralityRecord> {\n const adjacency = buildGraphAdjacency(nodes, edges, options);\n const total = adjacency.nodes.length;\n const denominator =\n total <= 1\n ? 1\n : adjacency.directed\n ? 2 * (total - 1)\n : Math.max(1, total - 1);\n\n const output = new Map<NodeId, DegreeCentralityRecord>();\n\n for (const nodeId of adjacency.nodes) {\n const outDegree = adjacency.neighborsByNode.get(nodeId)?.length ?? 0;\n const inDegree = adjacency.incomingByNode.get(nodeId)?.length ?? 0;\n const degree = adjacency.directed ? inDegree + outDegree : outDegree;\n\n output.set(nodeId, {\n inDegree,\n outDegree,\n degree,\n normalized: degree / denominator,\n });\n }\n\n return output;\n}\n\nexport interface ClosenessCentralityOptions extends GraphBuildOptions {\n mode?: ClosenessCentralityMode;\n shortestPathAlgorithm?: ShortestPathAlgorithm;\n}\n\nexport function closenessCentrality<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n options: ClosenessCentralityOptions = {},\n): Map<NodeId, ClosenessCentralityRecord> {\n const adjacency = buildGraphAdjacency(nodes, edges, options);\n const total = adjacency.nodes.length;\n const totalOthers = Math.max(0, total - 1);\n const mode: ClosenessCentralityMode = options.mode ?? 'harmonic';\n const output = new Map<NodeId, ClosenessCentralityRecord>();\n\n for (const source of adjacency.nodes) {\n const engine = runShortestPathEngine(\n adjacency,\n source,\n options.shortestPathAlgorithm ?? 'auto',\n );\n\n const distances = engine.result.distanceByNode;\n const negativeCycle = engine.result.negativeCycleNodes.size > 0;\n let reachableCount = 0;\n let distanceSum = 0;\n let harmonicSum = 0;\n\n for (const target of adjacency.nodes) {\n if (target === source) {\n continue;\n }\n\n const distance = distances.get(target);\n if (distance === undefined || !Number.isFinite(distance) || distance <= 0) {\n continue;\n }\n\n reachableCount += 1;\n distanceSum += distance;\n harmonicSum += 1 / distance;\n }\n\n let score = 0;\n let normalized = 0;\n\n if (!negativeCycle) {\n if (mode === 'classic') {\n score =\n reachableCount > 0 && distanceSum > 0\n ? reachableCount / distanceSum\n : 0;\n normalized = totalOthers > 0 ? score * (reachableCount / totalOthers) : 0;\n } else {\n score = harmonicSum;\n normalized = totalOthers > 0 ? harmonicSum / totalOthers : 0;\n }\n }\n\n output.set(source, {\n reachableCount,\n distanceSum,\n score,\n normalized,\n mode,\n negativeCycle,\n });\n }\n\n return output;\n}\n\nexport function betweennessCentrality<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n options: GraphBuildOptions = {},\n): Map<NodeId, BetweennessCentralityRecord> {\n const adjacency = buildGraphAdjacency(nodes, edges, options);\n if (hasNegativeWeights(adjacency)) {\n throw new GraphAlgorithmError(\n 'NEGATIVE_WEIGHT',\n 'Betweenness centrality requires non-negative graph weights.',\n );\n }\n\n const output = new Map<NodeId, number>();\n for (const nodeId of adjacency.nodes) {\n output.set(nodeId, 0);\n }\n\n for (const source of adjacency.nodes) {\n const stack: NodeId[] = [];\n const predecessors = new Map<NodeId, NodeId[]>();\n const sigma = new Map<NodeId, number>();\n const distance = new Map<NodeId, number>();\n const queue = new MinPriorityQueue<NodeId>();\n const settled = new Set<NodeId>();\n\n for (const nodeId of adjacency.nodes) {\n predecessors.set(nodeId, []);\n sigma.set(nodeId, 0);\n distance.set(nodeId, Number.POSITIVE_INFINITY);\n }\n\n sigma.set(source, 1);\n distance.set(source, 0);\n queue.push(source, 0);\n\n while (queue.size > 0) {\n const item = queue.pop();\n if (!item) {\n break;\n }\n\n const nodeId = item.value;\n if (settled.has(nodeId)) {\n continue;\n }\n\n settled.add(nodeId);\n stack.push(nodeId);\n\n const distanceToNode = distance.get(nodeId);\n if (distanceToNode === undefined || !Number.isFinite(distanceToNode)) {\n continue;\n }\n\n const sigmaToNode = sigma.get(nodeId) ?? 0;\n\n for (const neighbor of adjacency.neighborsByNode.get(nodeId) ?? []) {\n const candidateDistance = distanceToNode + neighbor.weight;\n const knownDistance = distance.get(neighbor.id);\n\n if (\n knownDistance === undefined ||\n candidateDistance < knownDistance - 1e-12\n ) {\n distance.set(neighbor.id, candidateDistance);\n queue.push(neighbor.id, candidateDistance);\n sigma.set(neighbor.id, sigmaToNode);\n predecessors.set(neighbor.id, [nodeId]);\n } else if (\n knownDistance !== undefined &&\n Math.abs(candidateDistance - knownDistance) <= 1e-12\n ) {\n sigma.set(neighbor.id, (sigma.get(neighbor.id) ?? 0) + sigmaToNode);\n predecessors.get(neighbor.id)?.push(nodeId);\n }\n }\n }\n\n const dependency = new Map<NodeId, number>();\n for (const nodeId of adjacency.nodes) {\n dependency.set(nodeId, 0);\n }\n\n while (stack.length > 0) {\n const nodeId = stack.pop();\n if (!nodeId) {\n continue;\n }\n\n const sigmaNode = sigma.get(nodeId) ?? 0;\n const dependencyNode = dependency.get(nodeId) ?? 0;\n\n for (const predecessor of predecessors.get(nodeId) ?? []) {\n const sigmaPredecessor = sigma.get(predecessor) ?? 0;\n if (sigmaNode <= 0) {\n continue;\n }\n\n const contribution =\n (sigmaPredecessor / sigmaNode) * (1 + dependencyNode);\n dependency.set(\n predecessor,\n (dependency.get(predecessor) ?? 0) + contribution,\n );\n }\n\n if (nodeId !== source) {\n output.set(nodeId, (output.get(nodeId) ?? 0) + dependencyNode);\n }\n }\n }\n\n if (!adjacency.directed) {\n for (const nodeId of adjacency.nodes) {\n output.set(nodeId, (output.get(nodeId) ?? 0) / 2);\n }\n }\n\n const total = adjacency.nodes.length;\n const normalization =\n total <= 2\n ? Number.POSITIVE_INFINITY\n : adjacency.directed\n ? (total - 1) * (total - 2)\n : ((total - 1) * (total - 2)) / 2;\n\n const records = new Map<NodeId, BetweennessCentralityRecord>();\n for (const nodeId of adjacency.nodes) {\n const raw = output.get(nodeId) ?? 0;\n records.set(nodeId, {\n raw,\n normalized:\n Number.isFinite(normalization) && normalization > 0\n ? raw / normalization\n : 0,\n });\n }\n\n return records;\n}\n\nexport function pageRank<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n options: PageRankOptions = {},\n): PageRankResult<NodeId> {\n const adjacency = buildGraphAdjacency(nodes, edges, options);\n\n if (hasNegativeWeights(adjacency)) {\n throw new GraphAlgorithmError(\n 'NEGATIVE_WEIGHT',\n 'PageRank requires non-negative graph weights.',\n );\n }\n\n const totalNodes = adjacency.nodes.length;\n if (totalNodes === 0) {\n return {\n byNode: new Map<NodeId, PageRankRecord>(),\n order: [],\n iterations: 0,\n converged: true,\n dampingFactor: options.dampingFactor ?? 0.85,\n };\n }\n\n const dampingFactor = options.dampingFactor ?? 0.85;\n if (\n !Number.isFinite(dampingFactor) ||\n dampingFactor < 0 ||\n dampingFactor >= 1\n ) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n `PageRank dampingFactor must be in [0, 1), received ${dampingFactor}.`,\n );\n }\n\n const tolerance = Math.max(0, options.tolerance ?? 1e-9);\n const maxIterations = Math.max(1, Math.floor(options.maxIterations ?? 200));\n const initialScore = 1 / totalNodes;\n\n const outgoingWeightSum = new Map<NodeId, number>();\n for (const nodeId of adjacency.nodes) {\n const totalWeight = (adjacency.neighborsByNode.get(nodeId) ?? []).reduce(\n (sum, neighbor) => sum + neighbor.weight,\n 0,\n );\n outgoingWeightSum.set(nodeId, totalWeight);\n }\n\n let scores = new Map<NodeId, number>();\n for (const nodeId of adjacency.nodes) {\n scores.set(nodeId, initialScore);\n }\n\n let iterations = 0;\n let converged = false;\n\n for (let iteration = 0; iteration < maxIterations; iteration += 1) {\n iterations = iteration + 1;\n const next = new Map<NodeId, number>();\n const teleportMass = (1 - dampingFactor) / totalNodes;\n\n let sinkMass = 0;\n for (const nodeId of adjacency.nodes) {\n const outgoingWeight = outgoingWeightSum.get(nodeId) ?? 0;\n if (outgoingWeight <= 1e-12) {\n sinkMass += scores.get(nodeId) ?? 0;\n }\n next.set(nodeId, teleportMass);\n }\n\n const sinkContribution = (dampingFactor * sinkMass) / totalNodes;\n if (sinkContribution > 0) {\n for (const nodeId of adjacency.nodes) {\n next.set(nodeId, (next.get(nodeId) ?? 0) + sinkContribution);\n }\n }\n\n for (const nodeId of adjacency.nodes) {\n const outgoingWeight = outgoingWeightSum.get(nodeId) ?? 0;\n if (outgoingWeight <= 1e-12) {\n continue;\n }\n\n const score = scores.get(nodeId) ?? 0;\n for (const neighbor of adjacency.neighborsByNode.get(nodeId) ?? []) {\n const transfer = (dampingFactor * score * neighbor.weight) / outgoingWeight;\n next.set(neighbor.id, (next.get(neighbor.id) ?? 0) + transfer);\n }\n }\n\n let delta = 0;\n for (const nodeId of adjacency.nodes) {\n const previous = scores.get(nodeId) ?? 0;\n const current = next.get(nodeId) ?? 0;\n delta += Math.abs(previous - current);\n }\n\n scores = next;\n if (delta <= tolerance) {\n converged = true;\n break;\n }\n }\n\n let scoreSum = 0;\n for (const nodeId of adjacency.nodes) {\n scoreSum += scores.get(nodeId) ?? 0;\n }\n\n if (!Number.isFinite(scoreSum) || scoreSum <= 0) {\n scores = new Map<NodeId, number>();\n for (const nodeId of adjacency.nodes) {\n scores.set(nodeId, initialScore);\n }\n scoreSum = 1;\n } else if (Math.abs(scoreSum - 1) > 1e-12) {\n for (const nodeId of adjacency.nodes) {\n scores.set(nodeId, (scores.get(nodeId) ?? 0) / scoreSum);\n }\n }\n\n const order = [...adjacency.nodes].sort((left, right) => {\n const scoreDelta = (scores.get(right) ?? 0) - (scores.get(left) ?? 0);\n if (Math.abs(scoreDelta) > 1e-12) {\n return scoreDelta;\n }\n return defaultTieBreaker(left, right);\n });\n\n const maxScore = order.length > 0 ? (scores.get(order[0]!) ?? 0) : 0;\n const byNode = new Map<NodeId, PageRankRecord>();\n for (let index = 0; index < order.length; index += 1) {\n const nodeId = order[index];\n if (!nodeId) {\n continue;\n }\n const score = scores.get(nodeId) ?? 0;\n byNode.set(nodeId, {\n score,\n normalized: maxScore > 0 ? score / maxScore : 0,\n rank: index + 1,\n });\n }\n\n return {\n byNode,\n order,\n iterations,\n converged,\n dampingFactor,\n };\n}\n\nexport function minimumSpanningTree<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n options: MinimumSpanningTreeOptions<NodeId> = {},\n): MinimumSpanningTreeResult<NodeId> {\n const adjacency = buildGraphAdjacency(nodes, edges, { directed: false });\n const tieBreaker =\n options.tieBreaker ??\n ((left: NodeId, right: NodeId) => defaultTieBreaker(left, right));\n const candidateByKey = new Map<string, Required<GraphEdge<NodeId>>>();\n\n for (const edge of adjacency.edges) {\n if (edge.from === edge.to) {\n continue;\n }\n const canonical = canonicalUndirectedEdge(edge.from, edge.to);\n const key = undirectedEdgeKey(canonical.from, canonical.to);\n const existing = candidateByKey.get(key);\n if (!existing || edge.weight < existing.weight - 1e-12) {\n candidateByKey.set(key, {\n from: canonical.from,\n to: canonical.to,\n weight: edge.weight,\n });\n }\n }\n\n const candidates = Array.from(candidateByKey.values());\n candidates.sort((left, right) => {\n const weightDelta = left.weight - right.weight;\n if (Math.abs(weightDelta) > 1e-12) {\n return weightDelta;\n }\n\n const fromDelta = tieBreaker(left.from, right.from);\n if (fromDelta !== 0) {\n return fromDelta;\n }\n return tieBreaker(left.to, right.to);\n });\n\n const disjointSet = new DisjointSet(adjacency.nodes);\n const selected: Array<Required<GraphEdge<NodeId>>> = [];\n let totalWeight = 0;\n\n for (const edge of candidates) {\n if (disjointSet.union(edge.from, edge.to)) {\n selected.push(edge);\n totalWeight += edge.weight;\n }\n }\n\n const roots = new Set<NodeId>();\n for (const nodeId of adjacency.nodes) {\n roots.add(disjointSet.find(nodeId));\n }\n const componentCount = roots.size;\n\n return {\n edges: selected,\n totalWeight,\n componentCount,\n spanning:\n adjacency.nodes.length <= 1 ||\n (componentCount === 1 && selected.length === adjacency.nodes.length - 1),\n };\n}\n\nexport function articulationPointsAndBridges<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n): ArticulationBridgeResult<NodeId> {\n const adjacency = buildGraphAdjacency(nodes, edges, { directed: false });\n const discoveredAt = new Map<NodeId, number>();\n const lowLink = new Map<NodeId, number>();\n const parentByNode = new Map<NodeId, NodeId | null>();\n const articulationPoints = new Set<NodeId>();\n const bridgeByKey = new Map<string, Required<GraphEdge<NodeId>>>();\n\n let discoveryCounter = 0;\n\n const visit = (nodeId: NodeId): void => {\n discoveredAt.set(nodeId, discoveryCounter);\n lowLink.set(nodeId, discoveryCounter);\n discoveryCounter += 1;\n\n let childCount = 0;\n const parent = parentByNode.get(nodeId) ?? null;\n\n for (const neighbor of adjacency.neighborsByNode.get(nodeId) ?? []) {\n const discoveredNeighbor = discoveredAt.get(neighbor.id);\n if (discoveredNeighbor === undefined) {\n parentByNode.set(neighbor.id, nodeId);\n childCount += 1;\n visit(neighbor.id);\n\n const lowNode = lowLink.get(nodeId) ?? 0;\n const lowNeighbor = lowLink.get(neighbor.id) ?? 0;\n lowLink.set(nodeId, Math.min(lowNode, lowNeighbor));\n\n const discoveredNode = discoveredAt.get(nodeId) ?? 0;\n if (parent === null && childCount > 1) {\n articulationPoints.add(nodeId);\n }\n if (parent !== null && lowNeighbor >= discoveredNode) {\n articulationPoints.add(nodeId);\n }\n if (lowNeighbor > discoveredNode) {\n const canonical = canonicalUndirectedEdge(nodeId, neighbor.id);\n const key = undirectedEdgeKey(canonical.from, canonical.to);\n const existing = bridgeByKey.get(key);\n if (!existing || neighbor.weight < existing.weight - 1e-12) {\n bridgeByKey.set(key, {\n from: canonical.from,\n to: canonical.to,\n weight: neighbor.weight,\n });\n }\n }\n } else if (neighbor.id !== parent) {\n const lowNode = lowLink.get(nodeId) ?? 0;\n lowLink.set(nodeId, Math.min(lowNode, discoveredNeighbor));\n }\n }\n };\n\n for (const nodeId of adjacency.nodes) {\n if (!discoveredAt.has(nodeId)) {\n parentByNode.set(nodeId, null);\n visit(nodeId);\n }\n }\n\n const bridges = Array.from(bridgeByKey.values());\n bridges.sort((left, right) => {\n const fromDelta = defaultTieBreaker(left.from, right.from);\n if (fromDelta !== 0) {\n return fromDelta;\n }\n\n const toDelta = defaultTieBreaker(left.to, right.to);\n if (toDelta !== 0) {\n return toDelta;\n }\n\n return left.weight - right.weight;\n });\n\n return {\n articulationPoints: Array.from(articulationPoints).sort(defaultTieBreaker),\n bridges,\n };\n}\n\nexport function analyzeGraph<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n options: GraphAnalysisOptions = {},\n): GraphAnalysisResult<NodeId> {\n const scc = stronglyConnectedComponents(nodes, edges, options);\n const weak = weaklyConnectedComponents(nodes, edges);\n const articulation = articulationPointsAndBridges(nodes, edges);\n const dedupedNodes = dedupeNodeList(nodes, edges);\n const orderedNodeIds = [...dedupedNodes].sort(defaultTieBreaker);\n let betweennessByNode = new Map<NodeId, BetweennessCentralityRecord>();\n let pageRankByNode = new Map<NodeId, PageRankRecord>();\n\n try {\n betweennessByNode = betweennessCentrality(nodes, edges, options);\n } catch (error) {\n if (\n !(error instanceof GraphAlgorithmError) ||\n error.code !== 'NEGATIVE_WEIGHT'\n ) {\n throw error;\n }\n\n betweennessByNode = new Map<NodeId, BetweennessCentralityRecord>();\n for (const nodeId of orderedNodeIds) {\n betweennessByNode.set(nodeId, {\n raw: 0,\n normalized: 0,\n });\n }\n }\n\n try {\n const pageRankResult = pageRank(nodes, edges, {\n directed: options.directed ?? true,\n ...(options.pageRankOptions ?? {}),\n });\n pageRankByNode = pageRankResult.byNode;\n } catch (error) {\n if (\n !(error instanceof GraphAlgorithmError) ||\n error.code !== 'NEGATIVE_WEIGHT'\n ) {\n throw error;\n }\n\n const defaultScore = dedupedNodes.length > 0 ? 1 / dedupedNodes.length : 0;\n pageRankByNode = new Map<NodeId, PageRankRecord>();\n for (let index = 0; index < orderedNodeIds.length; index += 1) {\n const nodeId = orderedNodeIds[index];\n if (!nodeId) {\n continue;\n }\n pageRankByNode.set(nodeId, {\n score: defaultScore,\n normalized: 1,\n rank: index + 1,\n });\n }\n }\n\n return {\n degree: degreeCentrality(nodes, edges, options),\n closeness: closenessCentrality(nodes, edges, {\n ...options,\n mode: options.closenessMode ?? 'harmonic',\n shortestPathAlgorithm: options.shortestPathAlgorithm,\n }),\n betweenness: betweennessByNode,\n pageRank: pageRankByNode,\n stronglyConnectedComponents: scc.components,\n weaklyConnectedComponents: weak.components,\n articulationPoints: articulation.articulationPoints,\n bridges: articulation.bridges,\n };\n}\n\nexport function shortestPath<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n source: NodeId,\n target: NodeId,\n options: ShortestPathOptions = {},\n): ShortestPathResult<NodeId> {\n const adjacency = buildGraphAdjacency(nodes, edges, options);\n if (\n !adjacency.neighborsByNode.has(source) ||\n !adjacency.neighborsByNode.has(target)\n ) {\n return {\n source,\n target,\n path: [],\n distance: Number.POSITIVE_INFINITY,\n reachable: false,\n explored: 0,\n algorithm: options.algorithm ?? 'auto',\n hasNegativeWeights: hasNegativeWeights(adjacency),\n negativeCycle: false,\n };\n }\n\n const engine = runShortestPathEngine(\n adjacency,\n source,\n options.algorithm ?? 'auto',\n );\n\n if (engine.result.negativeCycleNodes.has(target)) {\n if (options.failOnNegativeCycle ?? false) {\n throw new GraphAlgorithmError(\n 'NEGATIVE_CYCLE',\n `Negative cycle reaches target node \"${target}\".`,\n );\n }\n\n return {\n source,\n target,\n path: [],\n distance: Number.NEGATIVE_INFINITY,\n reachable: false,\n explored: engine.result.explored,\n algorithm: engine.algorithm,\n hasNegativeWeights: engine.hasNegativeWeights,\n negativeCycle: true,\n };\n }\n\n const distance =\n engine.result.distanceByNode.get(target) ?? Number.POSITIVE_INFINITY;\n const reachable = Number.isFinite(distance);\n\n const path = reachable\n ? reconstructPath(source, target, engine.result.previousByNode)\n : [];\n\n return {\n source,\n target,\n path,\n distance,\n reachable: reachable && path.length > 0,\n explored: engine.result.explored,\n algorithm: engine.algorithm,\n hasNegativeWeights: engine.hasNegativeWeights,\n negativeCycle: engine.result.negativeCycleNodes.size > 0,\n };\n}\n\nexport function labelPropagationCommunities<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n options: LabelPropagationOptions<NodeId> = {},\n): CommunityDetectionResult<NodeId> {\n const adjacency = buildGraphAdjacency(nodes, edges, {\n directed: options.directed ?? false,\n });\n if (hasNegativeWeights(adjacency)) {\n throw new GraphAlgorithmError(\n 'NEGATIVE_WEIGHT',\n 'Label propagation requires non-negative graph weights.',\n );\n }\n\n const tieBreaker =\n options.tieBreaker ??\n ((left: NodeId, right: NodeId) => defaultTieBreaker(left, right));\n const nodeOrder = [...adjacency.nodes].sort(tieBreaker);\n const labelByNode = new Map<NodeId, number>();\n for (let index = 0; index < nodeOrder.length; index += 1) {\n const nodeId = nodeOrder[index];\n if (nodeId) {\n labelByNode.set(nodeId, index);\n }\n }\n\n const maxIterations = Math.max(1, options.maxIterations ?? 100);\n let iterations = 0;\n let converged = false;\n\n for (let iteration = 0; iteration < maxIterations; iteration += 1) {\n iterations = iteration + 1;\n let changed = false;\n\n for (const nodeId of nodeOrder) {\n const neighbors = adjacency.neighborsByNode.get(nodeId) ?? [];\n if (neighbors.length === 0) {\n continue;\n }\n\n const scoreByLabel = new Map<number, number>();\n for (const neighbor of neighbors) {\n const neighborLabel = labelByNode.get(neighbor.id);\n if (neighborLabel === undefined) {\n continue;\n }\n scoreByLabel.set(\n neighborLabel,\n (scoreByLabel.get(neighborLabel) ?? 0) + neighbor.weight,\n );\n }\n\n const currentLabel = labelByNode.get(nodeId);\n if (currentLabel === undefined || scoreByLabel.size === 0) {\n continue;\n }\n\n let bestLabel = currentLabel;\n let bestScore = Number.NEGATIVE_INFINITY;\n\n for (const [candidateLabel, score] of scoreByLabel.entries()) {\n if (score > bestScore + 1e-12) {\n bestScore = score;\n bestLabel = candidateLabel;\n continue;\n }\n if (Math.abs(score - bestScore) <= 1e-12 && candidateLabel < bestLabel) {\n bestLabel = candidateLabel;\n }\n }\n\n if (bestLabel !== currentLabel) {\n labelByNode.set(nodeId, bestLabel);\n changed = true;\n }\n }\n\n if (!changed) {\n converged = true;\n break;\n }\n }\n\n return buildCommunityResult(\n adjacency,\n labelByNode,\n iterations,\n converged,\n 'label-propagation',\n );\n}\n\nexport function louvainCommunities<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n options: LouvainOptions<NodeId> = {},\n): CommunityDetectionResult<NodeId> {\n const adjacency = buildGraphAdjacency(nodes, edges, {\n directed: options.directed ?? false,\n });\n\n if (hasNegativeWeights(adjacency)) {\n throw new GraphAlgorithmError(\n 'NEGATIVE_WEIGHT',\n 'Louvain requires non-negative graph weights.',\n );\n }\n\n const tieBreaker =\n options.tieBreaker ??\n ((left: NodeId, right: NodeId) => defaultTieBreaker(left, right));\n const nodeOrder = [...adjacency.nodes].sort(tieBreaker);\n const maxPasses = Math.max(1, options.maxPasses ?? 32);\n const tolerance = Math.max(0, options.tolerance ?? 1e-9);\n\n const degreeByNode = new Map<NodeId, number>();\n for (const nodeId of adjacency.nodes) {\n degreeByNode.set(\n nodeId,\n sumNeighborWeights(adjacency.neighborsByNode.get(nodeId) ?? []),\n );\n }\n\n let totalDegree = 0;\n for (const degree of degreeByNode.values()) {\n totalDegree += degree;\n }\n\n const labelByNode = new Map<NodeId, number>();\n const communityWeight = new Map<number, number>();\n for (let index = 0; index < nodeOrder.length; index += 1) {\n const nodeId = nodeOrder[index];\n if (!nodeId) {\n continue;\n }\n labelByNode.set(nodeId, index);\n const degree = degreeByNode.get(nodeId) ?? 0;\n communityWeight.set(index, degree);\n }\n\n if (totalDegree <= 1e-12) {\n return buildCommunityResult(adjacency, labelByNode, 0, true, 'louvain');\n }\n\n let iterations = 0;\n let converged = false;\n\n for (let pass = 0; pass < maxPasses; pass += 1) {\n iterations = pass + 1;\n let changed = false;\n\n for (const nodeId of nodeOrder) {\n const currentLabel = labelByNode.get(nodeId);\n if (currentLabel === undefined) {\n continue;\n }\n\n const nodeDegree = degreeByNode.get(nodeId) ?? 0;\n communityWeight.set(\n currentLabel,\n (communityWeight.get(currentLabel) ?? 0) - nodeDegree,\n );\n\n const edgeWeightByCommunity = new Map<number, number>();\n for (const neighbor of adjacency.neighborsByNode.get(nodeId) ?? []) {\n const candidateLabel = labelByNode.get(neighbor.id);\n if (candidateLabel === undefined) {\n continue;\n }\n\n edgeWeightByCommunity.set(\n candidateLabel,\n (edgeWeightByCommunity.get(candidateLabel) ?? 0) + neighbor.weight,\n );\n }\n\n let bestLabel = currentLabel;\n let bestGain = 0;\n\n for (const [candidateLabel, edgeWeight] of edgeWeightByCommunity.entries()) {\n const candidateWeight = communityWeight.get(candidateLabel) ?? 0;\n const gain = edgeWeight - (candidateWeight * nodeDegree) / totalDegree;\n\n if (gain > bestGain + tolerance) {\n bestGain = gain;\n bestLabel = candidateLabel;\n continue;\n }\n\n if (\n Math.abs(gain - bestGain) <= tolerance &&\n candidateLabel < bestLabel\n ) {\n bestLabel = candidateLabel;\n }\n }\n\n if (bestLabel !== currentLabel && bestGain > tolerance) {\n labelByNode.set(nodeId, bestLabel);\n communityWeight.set(\n bestLabel,\n (communityWeight.get(bestLabel) ?? 0) + nodeDegree,\n );\n changed = true;\n } else {\n communityWeight.set(\n currentLabel,\n (communityWeight.get(currentLabel) ?? 0) + nodeDegree,\n );\n }\n }\n\n if (!changed) {\n converged = true;\n break;\n }\n }\n\n return buildCommunityResult(\n adjacency,\n labelByNode,\n iterations,\n converged,\n 'louvain',\n );\n}\n\nexport function nodeSimilarity<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n options: SimilarityOptions = {},\n): NodeSimilarityResult<NodeId> {\n const adjacency = buildGraphAdjacency(nodes, edges, {\n directed: options.directed ?? false,\n });\n const metric = options.metric ?? 'jaccard';\n const minScore = options.minScore ?? 0;\n const neighborSets = buildNeighborIdSetMap(adjacency);\n const orderedNodes = [...adjacency.nodes].sort(defaultTieBreaker);\n const pairs: Array<Omit<NodeSimilarityRecord<NodeId>, 'rank'>> = [];\n\n for (let leftIndex = 0; leftIndex < orderedNodes.length; leftIndex += 1) {\n const leftId = orderedNodes[leftIndex];\n if (!leftId) {\n continue;\n }\n for (\n let rightIndex = leftIndex + 1;\n rightIndex < orderedNodes.length;\n rightIndex += 1\n ) {\n const rightId = orderedNodes[rightIndex];\n if (!rightId) {\n continue;\n }\n const score = computeSimilarityScore(leftId, rightId, neighborSets, metric);\n if (score < minScore - 1e-12) {\n continue;\n }\n pairs.push({\n left: leftId,\n right: rightId,\n score,\n metric,\n });\n }\n }\n\n pairs.sort((left, right) => {\n const scoreDelta = right.score - left.score;\n if (Math.abs(scoreDelta) > 1e-12) {\n return scoreDelta;\n }\n const leftDelta = defaultTieBreaker(left.left, right.left);\n if (leftDelta !== 0) {\n return leftDelta;\n }\n return defaultTieBreaker(left.right, right.right);\n });\n\n return {\n metric,\n pairs: pairs.map((pair, index) => ({\n ...pair,\n rank: index + 1,\n })),\n };\n}\n\nexport function kNearestNeighbors<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n options: KNearestNeighborsOptions = {},\n): KNearestNeighborsResult<NodeId> {\n const adjacency = buildGraphAdjacency(nodes, edges, {\n directed: options.directed ?? false,\n });\n const metric = options.metric ?? 'jaccard';\n const minScore = options.minScore ?? 0;\n const k = Math.max(1, Math.floor(options.k ?? 5));\n const neighborSets = buildNeighborIdSetMap(adjacency);\n const orderedNodes = [...adjacency.nodes].sort(defaultTieBreaker);\n const neighborsByNode = new Map<NodeId, KNearestNeighbor<NodeId>[]>();\n\n for (const nodeId of orderedNodes) {\n const candidates: KNearestNeighbor<NodeId>[] = [];\n for (const otherId of orderedNodes) {\n if (nodeId === otherId) {\n continue;\n }\n const score = computeSimilarityScore(nodeId, otherId, neighborSets, metric);\n if (score < minScore - 1e-12) {\n continue;\n }\n candidates.push({\n nodeId: otherId,\n score,\n });\n }\n\n candidates.sort((left, right) => {\n const scoreDelta = right.score - left.score;\n if (Math.abs(scoreDelta) > 1e-12) {\n return scoreDelta;\n }\n return defaultTieBreaker(left.nodeId, right.nodeId);\n });\n\n neighborsByNode.set(nodeId, candidates.slice(0, k));\n }\n\n return {\n metric,\n k,\n neighborsByNode,\n };\n}\n\nexport function predictLinks<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n options: LinkPredictionOptions<NodeId> = {},\n): LinkPredictionResult<NodeId> {\n const directed = options.directed ?? false;\n const adjacency = buildGraphAdjacency(nodes, edges, { directed });\n const metric = options.metric ?? 'jaccard';\n const minScore = options.minScore ?? 0;\n const limit = Math.max(1, Math.floor(options.limit ?? 20));\n const allowExistingEdges = options.allowExistingEdges ?? false;\n const neighborSets = buildNeighborIdSetMap(adjacency);\n const orderedNodes = [...adjacency.nodes].sort(defaultTieBreaker);\n const sourceFilterSet = options.sourceFilter\n ? new Set(options.sourceFilter)\n : null;\n const targetFilterSet = options.targetFilter\n ? new Set(options.targetFilter)\n : null;\n const existingEdgeKeys = new Set<string>();\n\n for (const edge of adjacency.edges) {\n if (directed) {\n existingEdgeKeys.add(`${edge.from}\\u0000${edge.to}`);\n } else {\n existingEdgeKeys.add(undirectedEdgeKey(edge.from, edge.to));\n }\n }\n\n const predictions: Array<Omit<LinkPredictionRecord<NodeId>, 'rank'>> = [];\n\n if (directed) {\n for (const fromId of orderedNodes) {\n if (sourceFilterSet && !sourceFilterSet.has(fromId)) {\n continue;\n }\n for (const toId of orderedNodes) {\n if (fromId === toId) {\n continue;\n }\n if (targetFilterSet && !targetFilterSet.has(toId)) {\n continue;\n }\n if (\n !allowExistingEdges &&\n existingEdgeKeys.has(`${fromId}\\u0000${toId}`)\n ) {\n continue;\n }\n\n const score = computeSimilarityScore(fromId, toId, neighborSets, metric);\n if (score < minScore - 1e-12) {\n continue;\n }\n predictions.push({\n from: fromId,\n to: toId,\n score,\n metric,\n });\n }\n }\n } else {\n for (let leftIndex = 0; leftIndex < orderedNodes.length; leftIndex += 1) {\n const fromId = orderedNodes[leftIndex];\n if (!fromId) {\n continue;\n }\n for (\n let rightIndex = leftIndex + 1;\n rightIndex < orderedNodes.length;\n rightIndex += 1\n ) {\n const toId = orderedNodes[rightIndex];\n if (!toId) {\n continue;\n }\n\n if (\n sourceFilterSet &&\n !sourceFilterSet.has(fromId) &&\n !sourceFilterSet.has(toId)\n ) {\n continue;\n }\n if (\n targetFilterSet &&\n !targetFilterSet.has(fromId) &&\n !targetFilterSet.has(toId)\n ) {\n continue;\n }\n if (\n !allowExistingEdges &&\n existingEdgeKeys.has(undirectedEdgeKey(fromId, toId))\n ) {\n continue;\n }\n\n const score = computeSimilarityScore(fromId, toId, neighborSets, metric);\n if (score < minScore - 1e-12) {\n continue;\n }\n predictions.push({\n from: fromId,\n to: toId,\n score,\n metric,\n });\n }\n }\n }\n\n predictions.sort((left, right) => {\n const scoreDelta = right.score - left.score;\n if (Math.abs(scoreDelta) > 1e-12) {\n return scoreDelta;\n }\n const fromDelta = defaultTieBreaker(left.from, right.from);\n if (fromDelta !== 0) {\n return fromDelta;\n }\n return defaultTieBreaker(left.to, right.to);\n });\n\n return {\n metric,\n predictions: predictions.slice(0, limit).map((prediction, index) => ({\n ...prediction,\n rank: index + 1,\n })),\n };\n}\n\nexport function linkPrediction<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n options: LinkPredictionOptions<NodeId> = {},\n): LinkPredictionResult<NodeId> {\n return predictLinks(nodes, edges, options);\n}\n\nexport function aStarShortestPath<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n source: NodeId,\n target: NodeId,\n options: AStarOptions<NodeId> = {},\n): AStarResult<NodeId> {\n const adjacency = buildGraphAdjacency(nodes, edges, options);\n if (hasNegativeWeights(adjacency)) {\n throw new GraphAlgorithmError(\n 'NEGATIVE_WEIGHT',\n 'A* requires non-negative graph weights.',\n );\n }\n\n if (\n !adjacency.neighborsByNode.has(source) ||\n !adjacency.neighborsByNode.has(target)\n ) {\n return {\n source,\n target,\n path: [],\n distance: Number.POSITIVE_INFINITY,\n reachable: false,\n explored: 0,\n estimatedDistance: Number.POSITIVE_INFINITY,\n };\n }\n\n const heuristic =\n options.heuristic ??\n ((_nodeId: NodeId, _targetId: NodeId): number => 0);\n\n const queue = new MinPriorityQueue<NodeId>();\n const gScore = new Map<NodeId, number>();\n const previousByNode = new Map<NodeId, NodeId>();\n const closedSet = new Set<NodeId>();\n\n for (const nodeId of adjacency.nodes) {\n gScore.set(nodeId, Number.POSITIVE_INFINITY);\n }\n\n gScore.set(source, 0);\n const startHeuristic = heuristic(source, target);\n if (!Number.isFinite(startHeuristic)) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n 'A* heuristic must return finite values.',\n );\n }\n queue.push(source, startHeuristic);\n\n let explored = 0;\n\n while (queue.size > 0) {\n const item = queue.pop();\n if (!item) {\n break;\n }\n\n const nodeId = item.value;\n if (closedSet.has(nodeId)) {\n continue;\n }\n closedSet.add(nodeId);\n explored += 1;\n\n if (nodeId === target) {\n break;\n }\n\n const currentDistance = gScore.get(nodeId);\n if (currentDistance === undefined || !Number.isFinite(currentDistance)) {\n continue;\n }\n\n for (const neighbor of adjacency.neighborsByNode.get(nodeId) ?? []) {\n const candidate = currentDistance + neighbor.weight;\n const known = gScore.get(neighbor.id) ?? Number.POSITIVE_INFINITY;\n if (candidate >= known - 1e-12) {\n continue;\n }\n\n const estimate = heuristic(neighbor.id, target);\n if (!Number.isFinite(estimate)) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n 'A* heuristic must return finite values.',\n );\n }\n\n gScore.set(neighbor.id, candidate);\n previousByNode.set(neighbor.id, nodeId);\n queue.push(neighbor.id, candidate + estimate);\n }\n }\n\n const distance = gScore.get(target) ?? Number.POSITIVE_INFINITY;\n const reachable = Number.isFinite(distance);\n const path = reachable ? reconstructPath(source, target, previousByNode) : [];\n\n return {\n source,\n target,\n path,\n distance,\n reachable: reachable && path.length > 0,\n explored,\n estimatedDistance: distance,\n };\n}\n\nexport function allPairsShortestPaths<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n options: AllPairsShortestPathsOptions = {},\n): AllPairsShortestPathsResult<NodeId> {\n const adjacency = buildGraphAdjacency(nodes, edges, options);\n const requestedAlgorithm = options.algorithm ?? 'auto';\n const chosenAlgorithm = chooseShortestPathAlgorithm(\n requestedAlgorithm,\n hasNegativeWeights(adjacency),\n );\n\n const distanceBySource = new Map<NodeId, Map<NodeId, number>>();\n const previousBySource = new Map<NodeId, Map<NodeId, NodeId>>();\n let negativeCycle = false;\n\n for (const source of adjacency.nodes) {\n const engine = runShortestPathEngine(adjacency, source, chosenAlgorithm);\n if (engine.result.negativeCycleNodes.size > 0) {\n negativeCycle = true;\n if (options.failOnNegativeCycle ?? false) {\n throw new GraphAlgorithmError(\n 'NEGATIVE_CYCLE',\n `Negative cycle reaches source node \"${source}\".`,\n );\n }\n }\n\n const distance = new Map<NodeId, number>();\n const previous = new Map<NodeId, NodeId>();\n for (const nodeId of adjacency.nodes) {\n distance.set(\n nodeId,\n engine.result.distanceByNode.get(nodeId) ?? Number.POSITIVE_INFINITY,\n );\n const prev = engine.result.previousByNode.get(nodeId);\n if (prev) {\n previous.set(nodeId, prev);\n }\n }\n\n distanceBySource.set(source, distance);\n previousBySource.set(source, previous);\n }\n\n return {\n nodes: adjacency.nodes,\n distanceBySource,\n previousBySource,\n algorithm: chosenAlgorithm,\n hasNegativeWeights: hasNegativeWeights(adjacency),\n negativeCycle,\n };\n}\n\nexport function yenKShortestPaths<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n source: NodeId,\n target: NodeId,\n options: YenKShortestPathsOptions = {},\n): YenKShortestPathsResult<NodeId> {\n const directed = options.directed ?? true;\n const k = Math.max(1, Math.floor(options.k ?? 3));\n const shortestPathAlgorithm = options.shortestPathAlgorithm ?? 'auto';\n const adjacency = buildGraphAdjacency(nodes, edges, { directed });\n\n if (\n !adjacency.neighborsByNode.has(source) ||\n !adjacency.neighborsByNode.has(target)\n ) {\n return {\n source,\n target,\n paths: [],\n complete: false,\n };\n }\n\n const first = shortestPath(adjacency.nodes, adjacency.edges, source, target, {\n directed,\n algorithm: shortestPathAlgorithm,\n });\n if (!first.reachable || first.path.length === 0) {\n return {\n source,\n target,\n paths: [],\n complete: false,\n };\n }\n\n const accepted: PathRecord<NodeId>[] = [\n {\n path: first.path,\n distance: first.distance,\n },\n ];\n const candidates = new Map<string, PathRecord<NodeId>>();\n\n for (let pathIndex = 1; pathIndex < k; pathIndex += 1) {\n const previous = accepted[pathIndex - 1]?.path ?? [];\n if (previous.length < 2) {\n break;\n }\n\n for (let spurIndex = 0; spurIndex < previous.length - 1; spurIndex += 1) {\n const spurNode = previous[spurIndex];\n if (!spurNode) {\n continue;\n }\n\n const rootPath = previous.slice(0, spurIndex + 1);\n const rootNodeExclusion = new Set(rootPath.slice(0, -1));\n const removedEdgeKeys = new Set<string>();\n\n for (const pathRecord of accepted) {\n if (\n pathRecord.path.length > spurIndex + 1 &&\n hasSamePrefix(pathRecord.path, rootPath)\n ) {\n const fromId = pathRecord.path[spurIndex];\n const toId = pathRecord.path[spurIndex + 1];\n if (fromId && toId) {\n removedEdgeKeys.add(`${fromId}\\u0000${toId}`);\n }\n }\n }\n\n const filteredEdges = adjacency.edges.filter((edge) => {\n if (removedEdgeKeys.has(`${edge.from}\\u0000${edge.to}`)) {\n return false;\n }\n if (rootNodeExclusion.has(edge.from) || rootNodeExclusion.has(edge.to)) {\n return false;\n }\n return true;\n });\n\n const spurPath = shortestPath(\n adjacency.nodes,\n filteredEdges,\n spurNode,\n target,\n {\n directed,\n algorithm: shortestPathAlgorithm,\n },\n );\n\n if (!spurPath.reachable || spurPath.path.length === 0) {\n continue;\n }\n\n const totalPath = rootPath.slice(0, -1).concat(spurPath.path);\n const totalDistance = routeDistanceForPath(totalPath, adjacency);\n if (!Number.isFinite(totalDistance)) {\n continue;\n }\n\n const key = pathKey(totalPath);\n if (!candidates.has(key)) {\n candidates.set(key, {\n path: totalPath,\n distance: totalDistance,\n });\n }\n }\n\n if (candidates.size === 0) {\n break;\n }\n\n const next = Array.from(candidates.values()).sort((left, right) => {\n const distanceDelta = left.distance - right.distance;\n if (Math.abs(distanceDelta) > 1e-12) {\n return distanceDelta;\n }\n return defaultTieBreaker(pathKey(left.path), pathKey(right.path));\n })[0];\n\n if (!next) {\n break;\n }\n\n accepted.push(next);\n candidates.delete(pathKey(next.path));\n }\n\n return {\n source,\n target,\n paths: accepted,\n complete: accepted.length >= k,\n };\n}\n\nexport function maximumFlow<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n source: NodeId,\n sink: NodeId,\n options: MaximumFlowOptions = {},\n): MaximumFlowResult<NodeId> {\n const adjacency = buildGraphAdjacency(nodes, edges, options);\n if (\n !adjacency.neighborsByNode.has(source) ||\n !adjacency.neighborsByNode.has(sink)\n ) {\n return {\n source,\n sink,\n maxFlow: 0,\n augmentations: 0,\n flowByEdge: [],\n sourcePartition: [],\n sinkPartition: [],\n cutEdges: [],\n };\n }\n\n const originalEdges: Array<Required<GraphEdge<NodeId>>> = [];\n for (const edge of adjacency.edges) {\n if (edge.weight < 0) {\n throw new GraphAlgorithmError(\n 'NEGATIVE_WEIGHT',\n 'Maximum flow requires non-negative capacities.',\n );\n }\n originalEdges.push(edge);\n }\n\n interface ResidualEdge {\n to: NodeId;\n reverseIndex: number;\n capacity: number;\n originalIndex: number | null;\n }\n\n const residual = new Map<NodeId, ResidualEdge[]>();\n for (const nodeId of adjacency.nodes) {\n residual.set(nodeId, []);\n }\n\n const addResidualEdge = (\n from: NodeId,\n to: NodeId,\n capacity: number,\n originalIndex: number,\n ): void => {\n const fromEdges = residual.get(from);\n const toEdges = residual.get(to);\n if (!fromEdges || !toEdges) {\n return;\n }\n\n const forwardIndex = fromEdges.length;\n const reverseIndex = toEdges.length;\n fromEdges.push({\n to,\n reverseIndex,\n capacity,\n originalIndex,\n });\n toEdges.push({\n to: from,\n reverseIndex: forwardIndex,\n capacity: 0,\n originalIndex: null,\n });\n };\n\n for (let index = 0; index < originalEdges.length; index += 1) {\n const edge = originalEdges[index];\n if (!edge) {\n continue;\n }\n addResidualEdge(edge.from, edge.to, edge.weight, index);\n }\n\n let maxFlow = 0;\n let augmentations = 0;\n const flowByOriginal = new Array<number>(originalEdges.length).fill(0);\n\n while (true) {\n const parent = new Map<NodeId, { from: NodeId; edgeIndex: number }>();\n const queue: NodeId[] = [source];\n parent.set(source, { from: source, edgeIndex: -1 });\n\n let queueIndex = 0;\n while (queueIndex < queue.length && !parent.has(sink)) {\n const nodeId = queue[queueIndex];\n queueIndex += 1;\n if (!nodeId) {\n continue;\n }\n\n const edgesFromNode = residual.get(nodeId) ?? [];\n for (let edgeIndex = 0; edgeIndex < edgesFromNode.length; edgeIndex += 1) {\n const edge = edgesFromNode[edgeIndex];\n if (!edge || edge.capacity <= 1e-12) {\n continue;\n }\n if (parent.has(edge.to)) {\n continue;\n }\n\n parent.set(edge.to, { from: nodeId, edgeIndex });\n queue.push(edge.to);\n }\n }\n\n if (!parent.has(sink)) {\n break;\n }\n\n let bottleneck = Number.POSITIVE_INFINITY;\n let cursor: NodeId = sink;\n\n while (cursor !== source) {\n const parentEntry = parent.get(cursor);\n if (!parentEntry) {\n bottleneck = 0;\n break;\n }\n const edge = residual.get(parentEntry.from)?.[parentEntry.edgeIndex];\n if (!edge) {\n bottleneck = 0;\n break;\n }\n bottleneck = Math.min(bottleneck, edge.capacity);\n cursor = parentEntry.from;\n }\n\n if (!Number.isFinite(bottleneck) || bottleneck <= 1e-12) {\n break;\n }\n\n cursor = sink;\n while (cursor !== source) {\n const parentEntry = parent.get(cursor);\n if (!parentEntry) {\n break;\n }\n const edge = residual.get(parentEntry.from)?.[parentEntry.edgeIndex];\n const reverse = edge\n ? residual.get(edge.to)?.[edge.reverseIndex]\n : undefined;\n if (!edge || !reverse) {\n break;\n }\n\n edge.capacity -= bottleneck;\n reverse.capacity += bottleneck;\n\n if (edge.originalIndex !== null) {\n flowByOriginal[edge.originalIndex] =\n (flowByOriginal[edge.originalIndex] ?? 0) + bottleneck;\n } else if (reverse.originalIndex !== null) {\n flowByOriginal[reverse.originalIndex] =\n (flowByOriginal[reverse.originalIndex] ?? 0) - bottleneck;\n }\n\n cursor = parentEntry.from;\n }\n\n maxFlow += bottleneck;\n augmentations += 1;\n }\n\n const reachableFromSource = new Set<NodeId>();\n const partitionQueue: NodeId[] = [source];\n reachableFromSource.add(source);\n let partitionCursor = 0;\n\n while (partitionCursor < partitionQueue.length) {\n const nodeId = partitionQueue[partitionCursor];\n partitionCursor += 1;\n if (!nodeId) {\n continue;\n }\n\n for (const edge of residual.get(nodeId) ?? []) {\n if (edge.capacity <= 1e-12 || reachableFromSource.has(edge.to)) {\n continue;\n }\n reachableFromSource.add(edge.to);\n partitionQueue.push(edge.to);\n }\n }\n\n const sourcePartition = adjacency.nodes\n .filter((nodeId) => reachableFromSource.has(nodeId))\n .sort(defaultTieBreaker);\n const sinkPartition = adjacency.nodes\n .filter((nodeId) => !reachableFromSource.has(nodeId))\n .sort(defaultTieBreaker);\n\n const cutEdges = originalEdges\n .filter(\n (edge) =>\n reachableFromSource.has(edge.from) && !reachableFromSource.has(edge.to),\n )\n .sort((left, right) => {\n const fromDelta = defaultTieBreaker(left.from, right.from);\n if (fromDelta !== 0) {\n return fromDelta;\n }\n return defaultTieBreaker(left.to, right.to);\n });\n\n const flowByEdge = originalEdges\n .map((edge, index) => ({\n from: edge.from,\n to: edge.to,\n flow: Math.max(0, flowByOriginal[index] ?? 0),\n capacity: edge.weight,\n }))\n .sort((left, right) => {\n const fromDelta = defaultTieBreaker(left.from, right.from);\n if (fromDelta !== 0) {\n return fromDelta;\n }\n return defaultTieBreaker(left.to, right.to);\n });\n\n return {\n source,\n sink,\n maxFlow,\n augmentations,\n flowByEdge,\n sourcePartition,\n sinkPartition,\n cutEdges,\n };\n}\n\nexport function minCostMaxFlow<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: FlowEdge<NodeId>[],\n source: NodeId,\n sink: NodeId,\n options: MinCostMaxFlowOptions = {},\n): MinCostMaxFlowResult<NodeId> {\n const edgeProjection: GraphEdge<NodeId>[] = edges.map((edge) => ({\n from: edge.from,\n to: edge.to,\n weight: edge.capacity,\n }));\n const nodeIds = dedupeNodeList(nodes, edgeProjection);\n const directed = options.directed ?? true;\n\n if (!nodeIds.includes(source) || !nodeIds.includes(sink)) {\n return {\n source,\n sink,\n flow: 0,\n cost: 0,\n complete: false,\n augmentations: 0,\n flowByEdge: [],\n };\n }\n\n interface ResidualCostEdge {\n to: NodeId;\n reverseIndex: number;\n capacity: number;\n cost: number;\n originalIndex: number | null;\n }\n\n interface OriginalCostEdge {\n from: NodeId;\n to: NodeId;\n capacity: number;\n cost: number;\n }\n\n const originals: OriginalCostEdge[] = [];\n for (const edge of edges) {\n if (!Number.isFinite(edge.capacity) || edge.capacity < 0) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n `Flow edge capacity must be non-negative and finite, received ${edge.capacity}.`,\n );\n }\n const cost = edge.cost ?? 0;\n if (!Number.isFinite(cost)) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n `Flow edge cost must be finite, received ${cost}.`,\n );\n }\n\n originals.push({\n from: edge.from,\n to: edge.to,\n capacity: edge.capacity,\n cost,\n });\n\n if (!directed) {\n originals.push({\n from: edge.to,\n to: edge.from,\n capacity: edge.capacity,\n cost,\n });\n }\n }\n\n const residual = new Map<NodeId, ResidualCostEdge[]>();\n for (const nodeId of nodeIds) {\n residual.set(nodeId, []);\n }\n\n const addResidualEdge = (\n from: NodeId,\n to: NodeId,\n capacity: number,\n cost: number,\n originalIndex: number,\n ): void => {\n const fromEdges = residual.get(from);\n const toEdges = residual.get(to);\n if (!fromEdges || !toEdges) {\n return;\n }\n\n const forwardIndex = fromEdges.length;\n const reverseIndex = toEdges.length;\n fromEdges.push({\n to,\n reverseIndex,\n capacity,\n cost,\n originalIndex,\n });\n toEdges.push({\n to: from,\n reverseIndex: forwardIndex,\n capacity: 0,\n cost: -cost,\n originalIndex: null,\n });\n };\n\n for (let index = 0; index < originals.length; index += 1) {\n const edge = originals[index];\n if (!edge) {\n continue;\n }\n addResidualEdge(edge.from, edge.to, edge.capacity, edge.cost, index);\n }\n\n const targetFlowRaw = options.targetFlow;\n const targetFlow =\n targetFlowRaw === undefined ? Number.POSITIVE_INFINITY : targetFlowRaw;\n if (!Number.isFinite(targetFlow) && targetFlow !== Number.POSITIVE_INFINITY) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n `targetFlow must be finite or omitted, received ${targetFlow}.`,\n );\n }\n if (targetFlow < 0) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n `targetFlow must be non-negative, received ${targetFlow}.`,\n );\n }\n\n let flow = 0;\n let cost = 0;\n let augmentations = 0;\n const flowByOriginal = new Array<number>(originals.length).fill(0);\n\n while (flow < targetFlow - 1e-12) {\n const distance = new Map<NodeId, number>();\n const parent = new Map<NodeId, { from: NodeId; edgeIndex: number }>();\n\n for (const nodeId of nodeIds) {\n distance.set(nodeId, Number.POSITIVE_INFINITY);\n }\n distance.set(source, 0);\n\n for (let iteration = 0; iteration < nodeIds.length - 1; iteration += 1) {\n let changed = false;\n for (const nodeId of nodeIds) {\n const currentDistance = distance.get(nodeId);\n if (currentDistance === undefined || !Number.isFinite(currentDistance)) {\n continue;\n }\n\n const edgesFromNode = residual.get(nodeId) ?? [];\n for (\n let edgeIndex = 0;\n edgeIndex < edgesFromNode.length;\n edgeIndex += 1\n ) {\n const edge = edgesFromNode[edgeIndex];\n if (!edge || edge.capacity <= 1e-12) {\n continue;\n }\n\n const candidateDistance = currentDistance + edge.cost;\n const knownDistance =\n distance.get(edge.to) ?? Number.POSITIVE_INFINITY;\n\n if (candidateDistance < knownDistance - 1e-12) {\n distance.set(edge.to, candidateDistance);\n parent.set(edge.to, { from: nodeId, edgeIndex });\n changed = true;\n }\n }\n }\n\n if (!changed) {\n break;\n }\n }\n\n const sinkDistance = distance.get(sink) ?? Number.POSITIVE_INFINITY;\n if (!Number.isFinite(sinkDistance)) {\n break;\n }\n\n let bottleneck = Math.min(targetFlow - flow, Number.POSITIVE_INFINITY);\n let cursor: NodeId = sink;\n\n while (cursor !== source) {\n const parentEntry = parent.get(cursor);\n if (!parentEntry) {\n bottleneck = 0;\n break;\n }\n const edge = residual.get(parentEntry.from)?.[parentEntry.edgeIndex];\n if (!edge) {\n bottleneck = 0;\n break;\n }\n bottleneck = Math.min(bottleneck, edge.capacity);\n cursor = parentEntry.from;\n }\n\n if (!Number.isFinite(bottleneck) || bottleneck <= 1e-12) {\n break;\n }\n\n cursor = sink;\n while (cursor !== source) {\n const parentEntry = parent.get(cursor);\n if (!parentEntry) {\n break;\n }\n const edge = residual.get(parentEntry.from)?.[parentEntry.edgeIndex];\n const reverse = edge\n ? residual.get(edge.to)?.[edge.reverseIndex]\n : undefined;\n if (!edge || !reverse) {\n break;\n }\n\n edge.capacity -= bottleneck;\n reverse.capacity += bottleneck;\n\n if (edge.originalIndex !== null) {\n flowByOriginal[edge.originalIndex] =\n (flowByOriginal[edge.originalIndex] ?? 0) + bottleneck;\n } else if (reverse.originalIndex !== null) {\n flowByOriginal[reverse.originalIndex] =\n (flowByOriginal[reverse.originalIndex] ?? 0) - bottleneck;\n }\n\n cursor = parentEntry.from;\n }\n\n flow += bottleneck;\n cost += bottleneck * sinkDistance;\n augmentations += 1;\n }\n\n const flowByEdge = originals\n .map((edge, index) => ({\n from: edge.from,\n to: edge.to,\n flow: Math.max(0, flowByOriginal[index] ?? 0),\n capacity: edge.capacity,\n cost: edge.cost,\n }))\n .sort((left, right) => {\n const fromDelta = defaultTieBreaker(left.from, right.from);\n if (fromDelta !== 0) {\n return fromDelta;\n }\n return defaultTieBreaker(left.to, right.to);\n });\n\n return {\n source,\n sink,\n flow,\n cost,\n complete:\n targetFlow === Number.POSITIVE_INFINITY\n ? true\n : flow >= targetFlow - 1e-12,\n augmentations,\n flowByEdge,\n };\n}\n\nexport function kMeansClustering(\n points: number[][],\n k: number,\n options: KMeansOptions = {},\n): KMeansResult {\n if (!Array.isArray(points) || points.length === 0) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n 'kMeansClustering requires at least one point.',\n );\n }\n\n const dimensionality = points[0]?.length ?? 0;\n if (dimensionality === 0) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n 'kMeansClustering requires points with at least one axis.',\n );\n }\n\n for (const point of points) {\n if (point.length !== dimensionality) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n 'kMeansClustering requires all points to share dimensionality.',\n );\n }\n }\n\n const clusterCount = Math.max(1, Math.min(points.length, Math.floor(k)));\n const maxIterations = Math.max(1, options.maxIterations ?? 120);\n const tolerance = Math.max(0, options.tolerance ?? 1e-5);\n const nInit = Math.max(1, options.nInit ?? 8);\n const normalization = options.normalization ?? 'zscore';\n const useKMeansPlusPlus = options.useKMeansPlusPlus ?? true;\n const baseSeed =\n options.seed === undefined || !Number.isFinite(options.seed)\n ? Math.floor(Math.random() * 0xffffffff)\n : Math.floor(options.seed);\n\n const transform = normalizePoints(points, normalization);\n const normalizedPoints = points.map((point) => transform.normalize(point));\n\n let best: KMeansRunResult | null = null;\n let bestSeed = baseSeed;\n\n for (let attempt = 0; attempt < nInit; attempt += 1) {\n const seed = (baseSeed + attempt * 2654435761) >>> 0;\n const random = createRandom(seed);\n const run = runSingleKMeans(\n normalizedPoints,\n clusterCount,\n random,\n maxIterations,\n tolerance,\n useKMeansPlusPlus,\n );\n\n if (!best || run.inertia < best.inertia - 1e-9) {\n best = run;\n bestSeed = seed;\n }\n }\n\n if (!best) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n 'kMeansClustering failed to produce a valid run.',\n );\n }\n\n const clusters: KMeansCluster[] = [];\n for (let clusterIndex = 0; clusterIndex < clusterCount; clusterIndex += 1) {\n const indices: number[] = [];\n for (let pointIndex = 0; pointIndex < best.assignments.length; pointIndex += 1) {\n if (best.assignments[pointIndex] === clusterIndex) {\n indices.push(pointIndex);\n }\n }\n\n clusters.push({\n centroid: transform.denormalize(best.centroidsNormalized[clusterIndex] ?? []),\n indices,\n });\n }\n\n const silhouette = computeSilhouette(\n normalizedPoints,\n best.assignments,\n clusterCount,\n );\n\n return {\n assignments: best.assignments,\n clusters,\n iterations: best.iterations,\n inertia: best.inertia,\n converged: best.converged,\n silhouette,\n selectedSeed: bestSeed,\n };\n}\n\nexport function kMeansAuto(points: number[][], options: KMeansAutoOptions = {}): KMeansAutoResult {\n if (!Array.isArray(points) || points.length === 0) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n 'kMeansAuto requires at least one point.',\n );\n }\n\n const minK = Math.max(2, options.kMin ?? 2);\n const maxK = Math.max(\n minK,\n Math.min(points.length, options.kMax ?? Math.min(10, Math.ceil(Math.sqrt(points.length)) + 2)),\n );\n\n let bestResult: KMeansResult | null = null;\n let bestK = minK;\n const candidates: KMeansAutoCandidate[] = [];\n\n for (let k = minK; k <= maxK; k += 1) {\n const result = kMeansClustering(points, k, {\n ...options,\n seed:\n options.seed === undefined || !Number.isFinite(options.seed)\n ? undefined\n : options.seed + k * 997,\n });\n\n candidates.push({\n k,\n silhouette: result.silhouette,\n inertia: result.inertia,\n });\n\n if (!bestResult) {\n bestResult = result;\n bestK = k;\n continue;\n }\n\n const currentSilhouette = result.silhouette ?? Number.NEGATIVE_INFINITY;\n const bestSilhouette = bestResult.silhouette ?? Number.NEGATIVE_INFINITY;\n\n if (currentSilhouette > bestSilhouette + 1e-9) {\n bestResult = result;\n bestK = k;\n continue;\n }\n\n if (\n Math.abs(currentSilhouette - bestSilhouette) <= 1e-9 &&\n result.inertia < bestResult.inertia - 1e-9\n ) {\n bestResult = result;\n bestK = k;\n }\n }\n\n if (!bestResult) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n 'kMeansAuto failed to choose a cluster configuration.',\n );\n }\n\n return {\n ...bestResult,\n selectedK: bestK,\n candidates,\n };\n}\n\nexport function travelingSalesmanApprox<NodeId extends string>(\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n options: TravelingSalesmanOptions<NodeId> = {},\n): TravelingSalesmanResult<NodeId> {\n const adjacency = buildGraphAdjacency(nodes, edges, options);\n\n if (adjacency.nodes.length === 0) {\n return {\n order: [],\n distance: 0,\n segments: [],\n visitedCount: 0,\n complete: true,\n unreachableNodes: [],\n lowerBound: 0,\n optimalityGap: 0,\n };\n }\n\n if (hasNegativeWeights(adjacency)) {\n throw new GraphAlgorithmError(\n 'NEGATIVE_WEIGHT',\n 'TSP approximation requires non-negative graph weights.',\n );\n }\n\n const returnToStart = options.returnToStart ?? true;\n const twoOptPasses = Math.max(0, options.twoOptPasses ?? 3);\n const starts = createDeterministicStartList(adjacency.nodes, options);\n\n const distanceMatrix = new Map<NodeId, Map<NodeId, number>>();\n const previousMatrix = new Map<NodeId, Map<NodeId, NodeId>>();\n\n for (const source of adjacency.nodes) {\n const engine = runShortestPathEngine(\n adjacency,\n source,\n options.shortestPathAlgorithm ?? 'auto',\n );\n\n if (engine.result.negativeCycleNodes.size > 0) {\n throw new GraphAlgorithmError(\n 'NEGATIVE_CYCLE',\n 'TSP approximation cannot run when negative cycles are reachable.',\n );\n }\n\n distanceMatrix.set(source, engine.result.distanceByNode);\n previousMatrix.set(source, engine.result.previousByNode);\n }\n\n let bestRoute: NodeId[] = [];\n let bestDistance = Number.POSITIVE_INFINITY;\n\n for (const start of starts) {\n const greedyRoute = buildGreedyRoute(\n start,\n adjacency.nodes,\n distanceMatrix,\n returnToStart,\n );\n\n let candidateRoute = greedyRoute;\n if (candidateRoute.length > 2) {\n candidateRoute = optimizeRouteTwoOpt(\n candidateRoute,\n distanceMatrix,\n twoOptPasses,\n );\n }\n\n const candidateDistance = routeDistanceFromMatrix(\n candidateRoute,\n distanceMatrix,\n );\n\n if (candidateDistance < bestDistance) {\n bestDistance = candidateDistance;\n bestRoute = candidateRoute;\n }\n }\n\n const visited = new Set(bestRoute);\n const unreachableNodes = adjacency.nodes.filter((nodeId) => !visited.has(nodeId));\n const complete = unreachableNodes.length === 0 && Number.isFinite(bestDistance);\n\n const segments: TravelingSalesmanSegment<NodeId>[] = [];\n let totalDistance = 0;\n\n for (let index = 1; index < bestRoute.length; index += 1) {\n const fromId = bestRoute[index - 1];\n const toId = bestRoute[index];\n if (!fromId || !toId) {\n continue;\n }\n\n const distance = distanceMatrix.get(fromId)?.get(toId) ?? Number.POSITIVE_INFINITY;\n const previous = previousMatrix.get(fromId) ?? new Map<NodeId, NodeId>();\n const path = reconstructPath(fromId, toId, previous);\n\n if (!Number.isFinite(distance) || path.length === 0) {\n continue;\n }\n\n totalDistance += distance;\n segments.push({\n from: fromId,\n to: toId,\n distance,\n path,\n });\n }\n\n if (!complete) {\n totalDistance = Number.POSITIVE_INFINITY;\n }\n\n const lowerBound = computeMstLowerBound(adjacency.nodes, distanceMatrix);\n const optimalityGap =\n complete &&\n Number.isFinite(totalDistance) &&\n Number.isFinite(lowerBound) &&\n lowerBound > 0\n ? (totalDistance - lowerBound) / lowerBound\n : null;\n\n return {\n order: bestRoute,\n distance: totalDistance,\n segments,\n visitedCount: visited.size,\n complete,\n unreachableNodes,\n lowerBound,\n optimalityGap,\n };\n}\n","import {\n aStarShortestPath,\n allPairsShortestPaths,\n kNearestNeighbors,\n labelPropagationCommunities,\n louvainCommunities,\n maximumFlow,\n minCostMaxFlow,\n nodeSimilarity,\n pageRank,\n predictLinks,\n shortestPath,\n yenKShortestPaths,\n type AStarOptions,\n type AStarResult,\n type AllPairsShortestPathsOptions,\n type AllPairsShortestPathsResult,\n type CommunityDetectionResult,\n type FlowEdge,\n type GraphEdge,\n type GraphNodeInput,\n type KNearestNeighborsOptions,\n type KNearestNeighborsResult,\n type LabelPropagationOptions,\n type LinkPredictionOptions,\n type LinkPredictionResult,\n type LouvainOptions,\n type MaximumFlowOptions,\n type MaximumFlowResult,\n type MinCostMaxFlowOptions,\n type MinCostMaxFlowResult,\n type NodeSimilarityResult,\n type PageRankOptions,\n type PageRankResult,\n type ShortestPathOptions,\n type ShortestPathResult,\n type SimilarityOptions,\n type YenKShortestPathsOptions,\n type YenKShortestPathsResult,\n GraphAlgorithmError,\n buildGraphAdjacency,\n} from './graph';\n\nexport interface GdsProjectOptions {\n directed?: boolean;\n replace?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface GdsGraphProjection<NodeId extends string = string> {\n name: string;\n nodes: NodeId[];\n edges: Array<Required<GraphEdge<NodeId>>>;\n directed: boolean;\n createdAt: number;\n metadata: Record<string, unknown>;\n}\n\nexport interface GdsCatalogEntry {\n name: string;\n nodeCount: number;\n edgeCount: number;\n directed: boolean;\n createdAt: number;\n metadata: Record<string, unknown>;\n}\n\nexport type GdsPipelineStep<NodeId extends string = string> =\n | { id: string; kind: 'page-rank'; options?: PageRankOptions }\n | { id: string; kind: 'louvain'; options?: LouvainOptions<NodeId> }\n | {\n id: string;\n kind: 'label-propagation';\n options?: LabelPropagationOptions<NodeId>;\n }\n | { id: string; kind: 'similarity'; options?: SimilarityOptions }\n | { id: string; kind: 'knn'; options?: KNearestNeighborsOptions }\n | { id: string; kind: 'link-prediction'; options?: LinkPredictionOptions<NodeId> }\n | {\n id: string;\n kind: 'shortest-path';\n source: NodeId;\n target: NodeId;\n options?: ShortestPathOptions;\n }\n | {\n id: string;\n kind: 'a-star';\n source: NodeId;\n target: NodeId;\n options?: AStarOptions<NodeId>;\n }\n | {\n id: string;\n kind: 'yen-k-shortest-paths';\n source: NodeId;\n target: NodeId;\n options?: YenKShortestPathsOptions;\n }\n | {\n id: string;\n kind: 'max-flow';\n source: NodeId;\n sink: NodeId;\n options?: MaximumFlowOptions;\n }\n | {\n id: string;\n kind: 'min-cost-max-flow';\n source: NodeId;\n sink: NodeId;\n edges?: FlowEdge<NodeId>[] | null;\n options?: MinCostMaxFlowOptions;\n }\n | {\n id: string;\n kind: 'all-pairs-shortest-paths';\n options?: AllPairsShortestPathsOptions;\n };\n\nexport type GdsPipelineOutput<NodeId extends string = string> =\n | PageRankResult<NodeId>\n | CommunityDetectionResult<NodeId>\n | NodeSimilarityResult<NodeId>\n | KNearestNeighborsResult<NodeId>\n | LinkPredictionResult<NodeId>\n | ShortestPathResult<NodeId>\n | AStarResult<NodeId>\n | YenKShortestPathsResult<NodeId>\n | MaximumFlowResult<NodeId>\n | MinCostMaxFlowResult<NodeId>\n | AllPairsShortestPathsResult<NodeId>;\n\nexport class GraphCatalog<NodeId extends string = string> {\n private projections = new Map<string, GdsGraphProjection<NodeId>>();\n\n project(\n name: string,\n nodes: GraphNodeInput<NodeId>[],\n edges: GraphEdge<NodeId>[],\n options: GdsProjectOptions = {},\n ): GdsGraphProjection<NodeId> {\n const normalizedName = name.trim();\n if (!normalizedName) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n 'Projection name must be non-empty.',\n );\n }\n\n if (this.projections.has(normalizedName) && !(options.replace ?? false)) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n `Projection \"${normalizedName}\" already exists.`,\n );\n }\n\n const directed = options.directed ?? true;\n const adjacency = buildGraphAdjacency(nodes, edges, { directed });\n const projection: GdsGraphProjection<NodeId> = {\n name: normalizedName,\n nodes: adjacency.nodes,\n edges: adjacency.edges,\n directed,\n createdAt: Date.now(),\n metadata: options.metadata ?? {},\n };\n\n this.projections.set(normalizedName, projection);\n return projection;\n }\n\n drop(name: string): boolean {\n return this.projections.delete(name);\n }\n\n clear(): void {\n this.projections.clear();\n }\n\n exists(name: string): boolean {\n return this.projections.has(name);\n }\n\n get(name: string): GdsGraphProjection<NodeId> | null {\n return this.projections.get(name) ?? null;\n }\n\n list(): GdsCatalogEntry[] {\n return Array.from(this.projections.values())\n .map((projection) => ({\n name: projection.name,\n nodeCount: projection.nodes.length,\n edgeCount: projection.edges.length,\n directed: projection.directed,\n createdAt: projection.createdAt,\n metadata: projection.metadata,\n }))\n .sort((left, right) => left.name.localeCompare(right.name));\n }\n\n pageRank(name: string, options: PageRankOptions = {}): PageRankResult<NodeId> {\n const projection = this.requireProjection(name);\n return pageRank(projection.nodes, projection.edges, {\n directed: projection.directed,\n ...options,\n });\n }\n\n louvain(\n name: string,\n options: LouvainOptions<NodeId> = {},\n ): CommunityDetectionResult<NodeId> {\n const projection = this.requireProjection(name);\n return louvainCommunities(projection.nodes, projection.edges, {\n directed: projection.directed,\n ...options,\n });\n }\n\n labelPropagation(\n name: string,\n options: LabelPropagationOptions<NodeId> = {},\n ): CommunityDetectionResult<NodeId> {\n const projection = this.requireProjection(name);\n return labelPropagationCommunities(projection.nodes, projection.edges, {\n directed: projection.directed,\n ...options,\n });\n }\n\n similarity(\n name: string,\n options: SimilarityOptions = {},\n ): NodeSimilarityResult<NodeId> {\n const projection = this.requireProjection(name);\n return nodeSimilarity(projection.nodes, projection.edges, {\n directed: projection.directed,\n ...options,\n });\n }\n\n knn(\n name: string,\n options: KNearestNeighborsOptions = {},\n ): KNearestNeighborsResult<NodeId> {\n const projection = this.requireProjection(name);\n return kNearestNeighbors(projection.nodes, projection.edges, {\n directed: projection.directed,\n ...options,\n });\n }\n\n linkPrediction(\n name: string,\n options: LinkPredictionOptions<NodeId> = {},\n ): LinkPredictionResult<NodeId> {\n const projection = this.requireProjection(name);\n return predictLinks(projection.nodes, projection.edges, {\n directed: projection.directed,\n ...options,\n });\n }\n\n shortestPath(\n name: string,\n source: NodeId,\n target: NodeId,\n options: ShortestPathOptions = {},\n ): ShortestPathResult<NodeId> {\n const projection = this.requireProjection(name);\n return shortestPath(projection.nodes, projection.edges, source, target, {\n directed: projection.directed,\n ...options,\n });\n }\n\n aStar(\n name: string,\n source: NodeId,\n target: NodeId,\n options: AStarOptions<NodeId> = {},\n ): AStarResult<NodeId> {\n const projection = this.requireProjection(name);\n return aStarShortestPath(projection.nodes, projection.edges, source, target, {\n directed: projection.directed,\n ...options,\n });\n }\n\n yen(\n name: string,\n source: NodeId,\n target: NodeId,\n options: YenKShortestPathsOptions = {},\n ): YenKShortestPathsResult<NodeId> {\n const projection = this.requireProjection(name);\n return yenKShortestPaths(\n projection.nodes,\n projection.edges,\n source,\n target,\n {\n directed: projection.directed,\n ...options,\n },\n );\n }\n\n allPairs(\n name: string,\n options: AllPairsShortestPathsOptions = {},\n ): AllPairsShortestPathsResult<NodeId> {\n const projection = this.requireProjection(name);\n return allPairsShortestPaths(projection.nodes, projection.edges, {\n directed: projection.directed,\n ...options,\n });\n }\n\n maxFlow(\n name: string,\n source: NodeId,\n sink: NodeId,\n options: MaximumFlowOptions = {},\n ): MaximumFlowResult<NodeId> {\n const projection = this.requireProjection(name);\n return maximumFlow(projection.nodes, projection.edges, source, sink, {\n directed: projection.directed,\n ...options,\n });\n }\n\n minCostMaxFlow(\n name: string,\n source: NodeId,\n sink: NodeId,\n edges: FlowEdge<NodeId>[] | null = null,\n options: MinCostMaxFlowOptions = {},\n ): MinCostMaxFlowResult<NodeId> {\n const projection = this.requireProjection(name);\n const flowEdges =\n edges ??\n projection.edges.map((edge) => ({\n from: edge.from,\n to: edge.to,\n capacity: edge.weight,\n cost: edge.weight,\n }));\n\n return minCostMaxFlow(projection.nodes, flowEdges, source, sink, {\n directed: projection.directed,\n ...options,\n });\n }\n\n runPipeline(\n name: string,\n steps: GdsPipelineStep<NodeId>[],\n ): Map<string, GdsPipelineOutput<NodeId>> {\n const output = new Map<string, GdsPipelineOutput<NodeId>>();\n\n for (const step of steps) {\n const stepId = step.id.trim();\n if (!stepId) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n 'Pipeline step id must be non-empty.',\n );\n }\n if (output.has(stepId)) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n `Duplicate pipeline step id \"${stepId}\".`,\n );\n }\n\n if (step.kind === 'page-rank') {\n output.set(stepId, this.pageRank(name, step.options));\n continue;\n }\n if (step.kind === 'louvain') {\n output.set(stepId, this.louvain(name, step.options));\n continue;\n }\n if (step.kind === 'label-propagation') {\n output.set(stepId, this.labelPropagation(name, step.options));\n continue;\n }\n if (step.kind === 'similarity') {\n output.set(stepId, this.similarity(name, step.options));\n continue;\n }\n if (step.kind === 'knn') {\n output.set(stepId, this.knn(name, step.options));\n continue;\n }\n if (step.kind === 'link-prediction') {\n output.set(stepId, this.linkPrediction(name, step.options));\n continue;\n }\n if (step.kind === 'shortest-path') {\n output.set(\n stepId,\n this.shortestPath(name, step.source, step.target, step.options),\n );\n continue;\n }\n if (step.kind === 'a-star') {\n output.set(stepId, this.aStar(name, step.source, step.target, step.options));\n continue;\n }\n if (step.kind === 'yen-k-shortest-paths') {\n output.set(stepId, this.yen(name, step.source, step.target, step.options));\n continue;\n }\n if (step.kind === 'max-flow') {\n output.set(stepId, this.maxFlow(name, step.source, step.sink, step.options));\n continue;\n }\n if (step.kind === 'min-cost-max-flow') {\n output.set(\n stepId,\n this.minCostMaxFlow(\n name,\n step.source,\n step.sink,\n step.edges ?? null,\n step.options,\n ),\n );\n continue;\n }\n if (step.kind === 'all-pairs-shortest-paths') {\n output.set(stepId, this.allPairs(name, step.options));\n continue;\n }\n\n const exhaustiveKind: never = step;\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n `Unsupported pipeline step kind \"${String(exhaustiveKind)}\".`,\n );\n }\n\n return output;\n }\n\n private requireProjection(name: string): GdsGraphProjection<NodeId> {\n const projection = this.projections.get(name);\n if (!projection) {\n throw new GraphAlgorithmError(\n 'INVALID_ARGUMENT',\n `Projection \"${name}\" does not exist.`,\n );\n }\n return projection;\n }\n}\n\nexport function createGraphCatalog<NodeId extends string = string>(): GraphCatalog<NodeId> {\n return new GraphCatalog<NodeId>();\n}\n\nexport const gds = createGraphCatalog<string>();\n","/**\n * Twokeys - A small data exploration and manipulation library\n * Named after John Tukey, pioneer of exploratory data analysis (EDA)\n *\n * Features:\n * - Summary statistics (mean, median, mode, quartiles)\n * - Binning (histogram-like grouping)\n * - Smoothing (Hanning filter and median smoothing)\n * - Ranking and ranking analysis\n * - Outlier detection (using Tukey fences)\n * - Data transforms (logarithms, roots, inverses)\n */\n\nexport interface SeriesOptions {\n data?: number[];\n}\n\nexport interface PointsOptions {\n data?: number[][];\n dimensionality?: number;\n count?: number;\n}\n\nexport interface MedianResult {\n datum: number;\n depth: number;\n}\n\nexport interface ModeResult {\n count: number;\n data: number[];\n}\n\nexport interface RankInfo {\n rank: number;\n peers: number;\n}\n\nexport interface RankedResult {\n up: Record<number, RankInfo>;\n down: Record<number, RankInfo>;\n groups: {\n up: (number | number[])[];\n down: (number | number[])[];\n };\n}\n\nexport interface BinnedResult {\n bins: number;\n width: number;\n binned: Record<\n number,\n {\n from: number;\n to: number;\n data: number[];\n }\n >;\n}\n\nexport interface SeriesDescription {\n original: number[];\n summary: {\n median: MedianResult;\n mean: number;\n mode: ModeResult;\n hinges: MedianResult[];\n adjacent: number[];\n outliers: number[];\n outer: number[];\n outside: number[];\n inside: number[];\n extremes: number[];\n iqr: number;\n fences: number[];\n };\n smooths: {\n smooth: number[];\n hanning: number[];\n };\n transforms: {\n logs: number[];\n roots: number[];\n inverse: number[];\n };\n counts: [number, number][];\n sorted: number[];\n ranked: RankedResult;\n binned: BinnedResult;\n}\n\nexport interface PointsDescription {\n original: number[][];\n}\n\n// Constants\nconst DEFAULT_MAX_RANDOM_INTEGER = 100;\nconst DEFAULT_MIN_RANDOM_INTEGER = 0;\nconst DEFAULT_RANDOM_SERIES_COUNT = 1000;\nconst DEFAULT_OUTLIER_MULTIPLE = 1.5;\nconst DEFAULT_JITTER_MULTIPLIER = 1;\nconst DEFAULT_SPLIT_PASSES = 2;\nconst DEFAULT_MAX_RANDOM_DIMENSIONALITY = 2;\n\n// Utility functions\nfunction randomInteger(max: number = DEFAULT_MAX_RANDOM_INTEGER): number {\n return Math.floor(Math.random() * max);\n}\n\nfunction randomSeries(\n count: number = DEFAULT_RANDOM_SERIES_COUNT,\n max: number = DEFAULT_MAX_RANDOM_INTEGER\n): number[] {\n const series: number[] = [];\n for (let i = 0; i < count; i++) {\n series.push(randomInteger(max));\n }\n return series;\n}\n\nfunction randomPoint(\n dimension: number = DEFAULT_MAX_RANDOM_DIMENSIONALITY,\n max: number = DEFAULT_MAX_RANDOM_INTEGER\n): number[] {\n const point: number[] = [];\n for (let i = 0; i < dimension; i++) {\n point.push(Math.floor((Math.random() * (max / 10)) % max));\n }\n return point;\n}\n\nfunction randomPoints(\n count: number = DEFAULT_RANDOM_SERIES_COUNT,\n dimension: number = DEFAULT_MAX_RANDOM_DIMENSIONALITY,\n max: number = DEFAULT_MAX_RANDOM_INTEGER\n): number[][] {\n const points: number[][] = [];\n for (let i = 0; i < count; i++) {\n points.push(randomPoint(dimension, max));\n }\n return points;\n}\n\n/**\n * Series class for 1D data exploration\n */\nexport class Series {\n private data: {\n original: number[];\n sorted?: number[];\n median?: number;\n medianDepth?: number;\n mean?: number;\n mode?: ModeResult;\n extremes?: number[];\n counts?: [number, number][];\n hinges?: MedianResult[];\n iqr?: number;\n fences?: number[];\n outer?: number[];\n outside?: number[];\n inside?: number[];\n outliers?: number[];\n ranked?: RankedResult;\n adjacent?: number[];\n binned?: BinnedResult;\n logs?: number[];\n roots?: number[];\n inverse?: number[];\n hanning?: number[];\n smooth?: number[];\n rough?: number[];\n description?: SeriesDescription;\n };\n\n constructor(options: SeriesOptions = {}) {\n this.data = {\n original: options.data ?? randomSeries(),\n };\n }\n\n // Sort\n sorted(): number[] {\n if (!this.data.sorted) {\n this.data.sorted = this.getSorted(this.data.original);\n }\n return this.data.sorted;\n }\n\n private getSorted(arr: number[]): number[] {\n return [...arr].sort((a, b) => {\n if (a > b) return 1;\n if (a === b) return 0;\n return -1;\n });\n }\n\n // Median\n median(): MedianResult {\n this.sorted();\n if (this.data.median === undefined) {\n this.data.median = this.getMedian(this.data.sorted!);\n }\n if (this.data.medianDepth === undefined) {\n this.data.medianDepth = this.getMedianDepth(this.data.sorted!);\n }\n return {\n datum: this.data.median,\n depth: this.data.medianDepth,\n };\n }\n\n private getMedianDepth(arr: number[], offset: number = 0): number {\n if (!arr.length) return NaN;\n return offset + (arr.length + 1) / 2;\n }\n\n private getMedian(arr: number[]): number {\n const len = arr.length;\n if (!len) return NaN;\n if (len === 1) return arr[0];\n\n const mid = Math.floor(len / 2);\n if (len % 2 === 0) {\n return (arr[mid - 1] + arr[mid]) / 2;\n }\n return arr[mid];\n }\n\n // Mean\n mean(): number {\n if (this.data.mean === undefined) {\n this.data.mean = this.getMean(this.data.original);\n }\n return this.data.mean;\n }\n\n private getMean(arr: number[]): number {\n if (!arr.length) return NaN;\n let total = 0;\n for (const num of arr) {\n total += num;\n }\n return total / arr.length;\n }\n\n // Mode\n mode(): ModeResult {\n if (!this.data.mode) {\n this.sorted();\n this.data.mode = this.getMode(this.data.sorted!);\n }\n return this.data.mode;\n }\n\n private getMode(data: number[]): ModeResult {\n if (!data.length) {\n return { count: 0, data: [] };\n }\n\n // Count frequencies\n const freq: Record<number, number> = {};\n let maxCount = 0;\n\n for (const val of data) {\n freq[val] = (freq[val] || 0) + 1;\n if (freq[val] > maxCount) {\n maxCount = freq[val];\n }\n }\n\n // Find all values with max frequency\n const modes: number[] = [];\n for (const [val, count] of Object.entries(freq)) {\n if (count === maxCount) {\n modes.push(Number(val));\n }\n }\n\n return {\n count: maxCount,\n data: modes.sort((a, b) => a - b),\n };\n }\n\n // Extremes\n extremes(): number[] {\n if (!this.data.extremes) {\n this.sorted();\n this.data.extremes = this.getExtremes(this.data.sorted!);\n }\n return this.data.extremes;\n }\n\n private getExtremes(data: number[]): number[] {\n if (!data.length) return [];\n return [data[0], data[data.length - 1]];\n }\n\n // Counts\n counts(): [number, number][] {\n if (!this.data.counts) {\n this.sorted();\n this.data.counts = this.getCounts(this.data.sorted!);\n }\n return this.data.counts;\n }\n\n private getCounts(data: number[]): [number, number][] {\n const freq = new Map<number, number>();\n for (const val of data) {\n freq.set(val, (freq.get(val) || 0) + 1);\n }\n const result: [number, number][] = [];\n for (const [val, count] of freq) {\n result.push([val, count]);\n }\n return result.sort((a, b) => a[0] - b[0]);\n }\n\n // Hinges (quartiles)\n hinges(): MedianResult[] {\n if (!this.data.hinges) {\n this.sorted();\n this.data.hinges = this.getHinges(this.data.sorted!);\n }\n return this.data.hinges;\n }\n\n private getHinges(\n arr: number[],\n hinges: number = 2,\n result: MedianResult[] = []\n ): MedianResult[] {\n const copy = [...arr];\n const total = copy.length;\n\n let hingeCount = hinges;\n if (hingeCount % 2 !== 0) {\n hingeCount++;\n }\n\n if (total <= hingeCount || hingeCount <= 0) {\n return result;\n }\n\n const per = Math.floor(total / hingeCount);\n const howMany = Math.floor(total / per) - 1;\n\n for (let step = 0; step <= howMany; step++) {\n const fragment = copy.slice(step * per, step * per + per);\n result.push({\n datum: this.getMedian(fragment),\n depth: this.getMedianDepth(fragment, step * per),\n });\n }\n\n return result;\n }\n\n // IQR (Interquartile Range)\n iqr(): number {\n if (this.data.iqr === undefined) {\n this.hinges();\n this.data.iqr = this.getIQR(this.data.hinges!);\n }\n return this.data.iqr;\n }\n\n private getIQR(hinges: MedianResult[]): number {\n const first = hinges[0]?.datum;\n const second = hinges[1]?.datum;\n if (first === undefined || second === undefined) {\n return NaN;\n }\n return Math.abs(first - second);\n }\n\n // Fences\n fences(): number[] {\n if (!this.data.fences) {\n this.median();\n this.iqr();\n this.data.fences = this.getFences();\n }\n return this.data.fences;\n }\n\n private getFences(multiple: number = DEFAULT_OUTLIER_MULTIPLE): number[] {\n const base = this.data.median;\n const iqr = this.data.iqr;\n if (base === undefined || iqr === undefined || isNaN(iqr)) {\n return [];\n }\n const extra = iqr * multiple;\n return [base - extra, base + extra];\n }\n\n // Outer fences\n outer(): number[] {\n if (!this.data.outer) {\n this.median();\n this.iqr();\n this.data.outer = this.getOuter();\n }\n return this.data.outer;\n }\n\n private getOuter(multiple: number = DEFAULT_OUTLIER_MULTIPLE): number[] {\n const base = this.data.median;\n const iqr = this.data.iqr;\n if (base === undefined || iqr === undefined || isNaN(iqr)) {\n return [];\n }\n const extra = 2 * iqr * multiple;\n return [base - extra, base + extra];\n }\n\n // Outside values\n outside(): number[] {\n if (!this.data.outside) {\n this.outer();\n this.data.outside = this.getOutside();\n }\n return this.data.outside;\n }\n\n private getOutside(): number[] {\n const results: number[] = [];\n const sorted = this.data.sorted!;\n const outer = this.data.outer;\n if (!outer || outer.length === 0) return [];\n const min = Math.min(...outer);\n const max = Math.max(...outer);\n for (const num of sorted) {\n if (num > max || num < min) {\n results.push(num);\n }\n }\n return results;\n }\n\n // Inside values\n inside(): number[] {\n if (!this.data.inside) {\n this.fences();\n this.data.inside = this.getInside();\n }\n return this.data.inside;\n }\n\n private getInside(): number[] {\n const results: number[] = [];\n const sorted = this.data.sorted!;\n const fences = this.data.fences;\n if (!fences || fences.length === 0) return [];\n const min = Math.min(...fences);\n const max = Math.max(...fences);\n for (const num of sorted) {\n if (num < max && num > min) {\n results.push(num);\n }\n }\n return results;\n }\n\n // Outliers\n outliers(): number[] {\n if (!this.data.outliers) {\n this.fences();\n this.data.outliers = this.getOutliers();\n }\n return this.data.outliers;\n }\n\n private getOutliers(): number[] {\n const results: number[] = [];\n const sorted = this.data.sorted!;\n const fences = this.data.fences!;\n if (fences.length === 0) return [];\n const min = Math.min(...fences);\n const max = Math.max(...fences);\n for (const num of sorted) {\n if (num > max || num < min) {\n results.push(num);\n }\n }\n return results;\n }\n\n // Ranked\n ranked(): RankedResult {\n if (!this.data.ranked) {\n this.sorted();\n this.data.ranked = this.getRanked(this.data.sorted!);\n }\n return this.data.ranked;\n }\n\n private getRanked(arr: number[], ties: boolean = true): RankedResult {\n const up: Record<number, RankInfo> = {};\n const down: Record<number, RankInfo> = {};\n const total = arr.length;\n const ranked: (number | number[])[] = [];\n\n let tiedRank = NaN;\n let tiedNumbers: number[] = [];\n\n const reset = () => {\n tiedRank = NaN;\n tiedNumbers = [];\n };\n\n for (let i = 0; i < arr.length; i++) {\n const num = arr[i];\n\n if (!ties) {\n up[num] = { rank: i + 1, peers: 0 };\n down[num] = { rank: total - i, peers: 0 };\n } else {\n const incr = i + 1;\n const decr = i - 1;\n\n if (num === arr[decr]) {\n if (!isNaN(tiedRank) && tiedNumbers.length === 0) {\n tiedNumbers.push(num);\n ranked.push(tiedNumbers);\n reset();\n } else {\n tiedNumbers.push(num);\n tiedRank = decr;\n }\n if (num !== arr[incr]) {\n ranked.push(tiedNumbers);\n reset();\n }\n } else {\n if (num !== arr[incr]) {\n if (tiedNumbers.length > 0) {\n ranked.push(tiedNumbers);\n reset();\n } else {\n ranked.push(num);\n }\n } else {\n tiedNumbers.push(num);\n }\n }\n }\n }\n\n let offset = 0;\n for (let i = 0; i < ranked.length; i++) {\n const item = ranked[i];\n if (typeof item === 'number') {\n down[item] = { rank: i + 1 + offset, peers: 0 };\n up[item] = { rank: total - i - offset, peers: 0 };\n } else if (Array.isArray(item)) {\n offset += item.length;\n const usable = item[0];\n down[usable] = { rank: i + 1 + offset, peers: item.length };\n up[usable] = { rank: total - i - offset, peers: item.length };\n } else {\n offset += 1;\n }\n }\n\n return {\n up,\n down,\n groups: {\n down: [...ranked],\n up: [...ranked].reverse(),\n },\n };\n }\n\n // Adjacent\n adjacent(): number[] {\n if (!this.data.adjacent) {\n this.fences();\n this.data.adjacent = this.getAdjacent(this.data.sorted!, this.data.fences!);\n }\n return this.data.adjacent;\n }\n\n private getAdjacent(arr: number[], fences: number[]): number[] {\n if (fences.length === 0) return [];\n\n const low = fences[0];\n const lows: number[] = [];\n const high = fences[1];\n const highs: number[] = [];\n\n for (const val of arr) {\n if (val > low) lows.push(val);\n if (val < high) highs.push(val);\n }\n\n lows.sort((a, b) => a - b);\n highs.sort((a, b) => a - b);\n\n return [lows[0], highs[highs.length - 1]];\n }\n\n // Binned\n binned(bins: number = NaN): BinnedResult {\n if (!this.data.binned) {\n this.sorted();\n this.extremes();\n this.data.binned = this.getBinned(this.data.sorted!, bins);\n }\n return this.data.binned;\n }\n\n private getBinned(\n arr: number[],\n bins: number = 10,\n width: number = NaN,\n includeZero: boolean = true\n ): BinnedResult {\n const binned: Record<number, { from: number; to: number; data: number[] }> = {};\n const total = arr.length;\n const zeroOffset = includeZero ? 0 : 1;\n\n if (total === 0) {\n return { bins: 0, width: NaN, binned: {} };\n }\n\n const extremes = this.data.extremes!;\n let calculatedWidth = width;\n\n if (extremes && isNaN(calculatedWidth) && extremes.length === 2) {\n calculatedWidth = (extremes[1] - extremes[0]) / (Math.log(arr.length) / Math.LN2);\n calculatedWidth = Math.floor(calculatedWidth);\n\n let areIntegers = true;\n for (const item of arr) {\n if (item % 1 !== 0) {\n areIntegers = false;\n break;\n }\n }\n if (areIntegers) {\n calculatedWidth = Math.floor(calculatedWidth);\n }\n }\n\n let binCount = Math.floor(extremes[1] / calculatedWidth) + 1;\n if (!binCount || binCount < 1) {\n binCount = 1;\n }\n\n for (const val of arr) {\n const bin = Math.floor((val - zeroOffset) / calculatedWidth);\n if (!binned[bin]) {\n binned[bin] = {\n from: bin * calculatedWidth + zeroOffset,\n to: (bin + 1) * calculatedWidth + zeroOffset - 1,\n data: [],\n };\n }\n binned[bin].data.push(val);\n }\n\n return {\n bins: binCount,\n width: calculatedWidth,\n binned,\n };\n }\n\n // Transforms\n logs(): number[] {\n if (!this.data.logs) {\n this.data.logs = this.getLogs(this.data.original);\n }\n return this.data.logs;\n }\n\n private getLogs(arr: number[]): number[] {\n return arr.map((val) => Math.log(val));\n }\n\n roots(): number[] {\n if (!this.data.roots) {\n this.data.roots = this.getRoots(this.data.original);\n }\n return this.data.roots;\n }\n\n private getRoots(arr: number[]): number[] {\n return arr.map((val) => Math.sqrt(val));\n }\n\n inverse(): number[] {\n if (!this.data.inverse) {\n this.data.inverse = this.getInverse(this.data.original);\n }\n return this.data.inverse;\n }\n\n private getInverse(arr: number[]): number[] {\n return arr.map((val) => 1 / val);\n }\n\n // Smoothing\n hanning(): number[] {\n if (!this.data.hanning) {\n this.data.hanning = this.getSkipMeans(this.data.original);\n }\n return this.data.hanning;\n }\n\n private getSkipMeans(arr: number[]): number[] {\n const results: number[] = [];\n for (let i = 0; i < arr.length; i++) {\n if (i !== 0 && i !== arr.length - 1) {\n results.push((arr[i] + arr[i + 1]) / 2);\n }\n }\n results.unshift(arr[0]);\n results.push(arr[arr.length - 1]);\n return results;\n }\n\n smooth(): number[] {\n if (!this.data.smooth) {\n this.sorted();\n this.data.smooth = this.getSmooth(this.data.original);\n }\n this.data.rough = this.getRough(this.data.original, this.data.smooth);\n return this.data.smooth;\n }\n\n private getRough(original: number[], smoothed: number[]): number[] {\n const residuals: number[] = [];\n for (let x = 0; x < original.length; x++) {\n residuals.push(original[x] - smoothed[x]);\n }\n return residuals;\n }\n\n private getSmooth(arr: number[], passes: number = 3): number[] {\n let smoothed = [...arr];\n smoothed = this.smoothMedian(smoothed, passes);\n smoothed = this.smoothExtremes(smoothed, -1);\n smoothed = this.smoothSplit(smoothed, 2);\n smoothed = this.smoothMedian(smoothed, passes);\n smoothed = this.smoothExtremes(smoothed, -1);\n smoothed = this.smoothMedian(smoothed, passes);\n return smoothed;\n }\n\n private smoothExtremes(\n arr: number[],\n passes: number = 1,\n current: number = 0,\n end: 'both' | 'head' | 'tail' = 'both'\n ): number[] {\n const len = arr.length;\n if (len <= 2) return [...arr];\n\n const result = [...arr];\n\n for (let pass = current; pass < passes || passes === -1; pass++) {\n let changed = false;\n\n if (end === 'both' || end === 'head') {\n const first = result[0];\n const second = result[1];\n const third = result[2];\n const tmp = second - 2 * (third - second);\n // Median of three: sort and pick middle\n const median =\n first <= second\n ? second <= tmp\n ? second\n : first <= tmp\n ? tmp\n : first\n : first <= tmp\n ? first\n : second <= tmp\n ? tmp\n : second;\n if (result[0] !== median) {\n result[0] = median;\n changed = true;\n }\n }\n\n if (end === 'both' || end === 'tail') {\n const antepenultimate = result[len - 3];\n const penultimate = result[len - 2];\n const last = result[len - 1];\n const tmp = penultimate - 2 * (antepenultimate - penultimate);\n const median =\n last <= penultimate\n ? penultimate <= tmp\n ? penultimate\n : last <= tmp\n ? tmp\n : last\n : last <= tmp\n ? last\n : penultimate <= tmp\n ? tmp\n : penultimate;\n if (result[len - 1] !== median) {\n result[len - 1] = median;\n changed = true;\n }\n }\n\n if (passes === -1 && !changed) {\n break;\n }\n }\n return result;\n }\n\n private smoothSplit(\n arr: number[],\n passes: number = DEFAULT_SPLIT_PASSES,\n current: number = 0\n ): number[] {\n let result = [...arr];\n const len = arr.length;\n\n for (let pass = current; pass < passes || passes === -1; pass++) {\n let changed = false;\n\n for (let i = 2; i < len - 1; i++) {\n const num = result[i];\n const t1 = result[i - 1];\n const t2 = result[i - 2];\n const f1 = result[i + 1];\n\n if (num === t1 && ((t1 > t2 && num > f1) || (t1 < t2 && num < f1))) {\n // Apply smoothExtremes at split point in-place\n const left = this.smoothExtremes(result.slice(0, i));\n const right = this.smoothExtremes(result.slice(i));\n result = left.concat(right);\n changed = true;\n }\n }\n\n if (passes === -1 && !changed) {\n return result;\n }\n }\n return result;\n }\n\n private smoothMedian(arr: number[], passes: number = 1, current: number = 0): number[] {\n let result = arr;\n const len = arr.length;\n if (len <= 2) return [...arr];\n\n for (let pass = current; pass < passes || passes === -1; pass++) {\n const next = new Array<number>(len);\n next[0] = result[0];\n next[len - 1] = result[len - 1];\n\n let changed = false;\n for (let i = 1; i < len - 1; i++) {\n const val = result[i];\n const smoothed = Math.min(Math.max(result[i - 1], val), result[i + 1]);\n next[i] = smoothed;\n if (smoothed !== val) changed = true;\n }\n\n if (passes === -1 && !changed) {\n return result;\n }\n result = next;\n }\n return result;\n }\n\n private jitter(\n arr: number[],\n passes: number = 1,\n floor: number = NaN,\n multiplier: number = DEFAULT_JITTER_MULTIPLIER,\n weight: number = NaN,\n current: number = 0\n ): number[] {\n const nextCurrent = current + 1;\n const copy = [...arr];\n\n if (nextCurrent <= passes) {\n const jittered: number[] = [];\n for (const num of copy) {\n let w = weight;\n if (!w && !isNaN(w)) {\n w = (1 + Math.floor(num / 10)) * (Math.random() > 0.5 ? 1 : -1);\n }\n let value = num + Math.floor(Math.random() * multiplier * w);\n if (!isNaN(floor) && value < floor) {\n value = floor;\n }\n jittered.push(value);\n }\n return this.jitter(jittered, passes, floor, multiplier, weight, nextCurrent);\n }\n return copy;\n }\n\n // Trimean (Tukey's trimean: (Q1 + 2*median + Q3) / 4)\n trimean(): number {\n const med = this.median();\n const h = this.hinges();\n if (h.length < 2) return med.datum;\n return (h[0].datum + 2 * med.datum + h[1].datum) / 4;\n }\n\n // Letter values (depth-based summaries beyond hinges)\n letterValues(): Array<{ letter: string; depth: number; lower: number; upper: number; mid: number; spread: number }> {\n this.sorted();\n const n = this.data.sorted!.length;\n if (n < 2) return [];\n\n const letters = ['M', 'F', 'E', 'D', 'C', 'B', 'A', 'Z', 'Y', 'X', 'W', 'V', 'U', 'T', 'S'];\n const results: Array<{ letter: string; depth: number; lower: number; upper: number; mid: number; spread: number }> = [];\n\n // M = median\n const medDepth = (n + 1) / 2;\n const medValue = this.median().datum;\n results.push({\n letter: 'M',\n depth: medDepth,\n lower: medValue,\n upper: medValue,\n mid: medValue,\n spread: 0,\n });\n\n // Subsequent letter values\n let depth = medDepth;\n let letterIdx = 1;\n\n while (depth > 1 && letterIdx < letters.length) {\n depth = Math.floor((Math.floor(depth) + 1) / 2);\n if (depth < 1) break;\n\n const lowerIdx = Math.ceil(depth) - 1;\n const upperIdx = n - Math.ceil(depth);\n\n if (lowerIdx < 0 || upperIdx >= n || lowerIdx >= upperIdx) break;\n\n const lower = this.data.sorted![lowerIdx];\n const upper = this.data.sorted![upperIdx];\n const mid = (lower + upper) / 2;\n const spread = upper - lower;\n\n results.push({\n letter: letters[letterIdx],\n depth,\n lower,\n upper,\n mid,\n spread,\n });\n\n letterIdx++;\n }\n\n return results;\n }\n\n // Rough (residuals: original - smooth)\n rough(): number[] {\n if (!this.data.rough) {\n this.smooth();\n }\n return this.data.rough || [];\n }\n\n // Stem-and-leaf display (text-based visualization)\n stemLeaf(leafDigits: number = 1): { stems: string[]; leaves: Record<string, string[]>; display: string[] } {\n this.sorted();\n const data = this.data.sorted!;\n if (!data.length) return { stems: [], leaves: {}, display: [] };\n\n const scale = Math.pow(10, leafDigits);\n const stems = new Map<number, number[]>();\n\n for (const val of data) {\n const stem = Math.floor(val / scale);\n const leaf = Math.abs(Math.round(val % scale));\n if (!stems.has(stem)) {\n stems.set(stem, []);\n }\n stems.get(stem)!.push(leaf);\n }\n\n const sortedStems = Array.from(stems.keys()).sort((a, b) => a - b);\n const stemStrings: string[] = [];\n const leavesRecord: Record<string, string[]> = {};\n const display: string[] = [];\n\n for (const stem of sortedStems) {\n const stemStr = String(stem);\n stemStrings.push(stemStr);\n const leaves = stems.get(stem)!.sort((a, b) => a - b).map(String);\n leavesRecord[stemStr] = leaves;\n display.push(`${stemStr.padStart(4)} | ${leaves.join(' ')}`);\n }\n\n return { stems: stemStrings, leaves: leavesRecord, display };\n }\n\n // Mid-summaries (averages of symmetric quantile pairs)\n midSummaries(): Array<{ depth: number; mid: number; spread: number }> {\n const lv = this.letterValues();\n return lv.map(({ depth, mid, spread }) => ({ depth, mid, spread }));\n }\n\n // Describe - full summary\n describe(): SeriesDescription {\n this.data.description = {\n original: this.data.original,\n summary: {\n median: this.median(),\n mean: this.mean(),\n mode: this.mode(),\n hinges: this.hinges(),\n adjacent: this.adjacent(),\n outliers: this.outliers(),\n outer: this.outer(),\n outside: this.outside(),\n inside: this.inside(),\n extremes: this.extremes(),\n iqr: this.iqr(),\n fences: this.fences(),\n },\n smooths: {\n smooth: this.smooth(),\n hanning: this.hanning(),\n },\n transforms: {\n logs: this.logs(),\n roots: this.roots(),\n inverse: this.inverse(),\n },\n counts: this.counts(),\n sorted: this.sorted(),\n ranked: this.ranked(),\n binned: this.binned(),\n };\n return this.data.description;\n }\n}\n\n/**\n * Points class for n-dimensional data exploration\n */\nexport class Points {\n private data: {\n original: number[][];\n description?: PointsDescription;\n };\n private dimension: number;\n private count: number;\n\n constructor(options: PointsOptions | number = {}) {\n if (typeof options === 'number') {\n this.count = options;\n this.dimension = DEFAULT_MAX_RANDOM_DIMENSIONALITY;\n this.data = {\n original: randomPoints(this.count, this.dimension),\n };\n } else {\n this.dimension = options.dimensionality ?? 2;\n this.count = options.count ?? 100;\n this.data = {\n original: options.data ?? randomPoints(this.count, this.dimension),\n };\n }\n }\n\n describe(): PointsDescription {\n this.data.description = {\n original: this.data.original,\n };\n return this.data.description;\n }\n}\n\n/**\n * Main Twokeys class - factory for Series and Points\n */\nexport class Twokeys {\n public smoothed: boolean = false;\n\n // Constants\n static readonly DEFAULT_MAX_RANDOM_INTEGER = DEFAULT_MAX_RANDOM_INTEGER;\n static readonly DEFAULT_MIN_RANDOM_INTEGER = DEFAULT_MIN_RANDOM_INTEGER;\n static readonly DEFAULT_RANDOM_SERIES_COUNT = DEFAULT_RANDOM_SERIES_COUNT;\n static readonly DEFAULT_OUTLIER_MULTIPLE = DEFAULT_OUTLIER_MULTIPLE;\n static readonly DEFAULT_JITTER_MULTIPLIER = DEFAULT_JITTER_MULTIPLIER;\n static readonly DEFAULT_SPLIT_PASSES = DEFAULT_SPLIT_PASSES;\n static readonly DEFAULT_MAX_RANDOM_DIMENSIONALITY = DEFAULT_MAX_RANDOM_DIMENSIONALITY;\n\n // Static factory methods\n static Series = Series;\n static Points = Points;\n\n // Utility methods\n static randomInteger = randomInteger;\n static randomSeries = randomSeries;\n static randomPoint = randomPoint;\n static randomPoints = randomPoints;\n}\n\nexport * from './graph';\nexport * from './gds';\n\n// Default export\nexport default Twokeys;\n"]}
|