@nshiab/simple-data-analysis-core 2.0.8 → 2.1.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.
Files changed (513) hide show
  1. package/esm/class/SDAError.d.ts +6 -6
  2. package/esm/class/SDAError.js +6 -6
  3. package/esm/class/Simple.d.ts +9 -9
  4. package/esm/class/Simple.js +9 -9
  5. package/esm/class/SimpleDB.d.ts +80 -76
  6. package/esm/class/SimpleDB.d.ts.map +1 -1
  7. package/esm/class/SimpleDB.js +80 -76
  8. package/esm/class/SimpleTable.d.ts +2805 -1077
  9. package/esm/class/SimpleTable.d.ts.map +1 -1
  10. package/esm/class/SimpleTable.js +2777 -1077
  11. package/esm/helpers/appendColumnBatches.d.ts +3 -0
  12. package/esm/helpers/appendColumnBatches.d.ts.map +1 -0
  13. package/esm/helpers/appendColumnBatches.js +21 -0
  14. package/esm/helpers/buildApproximateMutualReachabilityMst.d.ts +45 -0
  15. package/esm/helpers/buildApproximateMutualReachabilityMst.d.ts.map +1 -0
  16. package/esm/helpers/buildApproximateMutualReachabilityMst.js +212 -0
  17. package/esm/helpers/buildChronologicalGraphComponentsSql.d.ts +14 -0
  18. package/esm/helpers/buildChronologicalGraphComponentsSql.d.ts.map +1 -0
  19. package/esm/helpers/buildChronologicalGraphComponentsSql.js +167 -0
  20. package/esm/helpers/buildExactMutualReachabilityMst.d.ts +28 -0
  21. package/esm/helpers/buildExactMutualReachabilityMst.d.ts.map +1 -0
  22. package/esm/helpers/buildExactMutualReachabilityMst.js +97 -0
  23. package/esm/helpers/buildGraphTemporalCostStateSql.d.ts +12 -0
  24. package/esm/helpers/buildGraphTemporalCostStateSql.d.ts.map +1 -0
  25. package/esm/helpers/buildGraphTemporalCostStateSql.js +86 -0
  26. package/esm/helpers/buildGraphTemporalReachabilitySql.d.ts +13 -0
  27. package/esm/helpers/buildGraphTemporalReachabilitySql.d.ts.map +1 -0
  28. package/esm/helpers/buildGraphTemporalReachabilitySql.js +70 -0
  29. package/esm/helpers/buildSparseMutualReachabilityMst.d.ts +10 -0
  30. package/esm/helpers/buildSparseMutualReachabilityMst.d.ts.map +1 -0
  31. package/esm/helpers/buildSparseMutualReachabilityMst.js +47 -0
  32. package/esm/helpers/buildUmapGraph.d.ts +21 -0
  33. package/esm/helpers/buildUmapGraph.d.ts.map +1 -0
  34. package/esm/helpers/buildUmapGraph.js +61 -0
  35. package/esm/helpers/buildVectorNeighbors.d.ts +45 -0
  36. package/esm/helpers/buildVectorNeighbors.d.ts.map +1 -0
  37. package/esm/helpers/buildVectorNeighbors.js +170 -0
  38. package/esm/helpers/buildWeakGraphComponentsSql.d.ts +3 -0
  39. package/esm/helpers/buildWeakGraphComponentsSql.d.ts.map +1 -0
  40. package/esm/helpers/buildWeakGraphComponentsSql.js +32 -0
  41. package/esm/helpers/cacheDatabase.d.ts.map +1 -1
  42. package/esm/helpers/cacheDatabase.js +2 -1
  43. package/esm/helpers/camelCase.d.ts +7 -5
  44. package/esm/helpers/camelCase.d.ts.map +1 -1
  45. package/esm/helpers/camelCase.js +7 -5
  46. package/esm/helpers/capitalize.d.ts +6 -4
  47. package/esm/helpers/capitalize.d.ts.map +1 -1
  48. package/esm/helpers/capitalize.js +6 -4
  49. package/esm/helpers/clusterHdbscan.d.ts +18 -0
  50. package/esm/helpers/clusterHdbscan.d.ts.map +1 -0
  51. package/esm/helpers/clusterHdbscan.js +342 -0
  52. package/esm/helpers/computeCovariance.d.ts +16 -0
  53. package/esm/helpers/computeCovariance.d.ts.map +1 -0
  54. package/esm/helpers/computeCovariance.js +99 -0
  55. package/esm/helpers/computeMahalanobisDistances.d.ts +14 -0
  56. package/esm/helpers/computeMahalanobisDistances.d.ts.map +1 -0
  57. package/esm/helpers/computeMahalanobisDistances.js +87 -0
  58. package/esm/helpers/createDirectory.d.ts +4 -3
  59. package/esm/helpers/createDirectory.d.ts.map +1 -1
  60. package/esm/helpers/createDirectory.js +4 -3
  61. package/esm/helpers/dataToArrays.d.ts +6 -4
  62. package/esm/helpers/dataToArrays.d.ts.map +1 -1
  63. package/esm/helpers/dataToArrays.js +6 -4
  64. package/esm/helpers/extractTypes.d.ts +1 -1
  65. package/esm/helpers/extractTypes.js +4 -9
  66. package/esm/helpers/factorCovariance.d.ts +17 -0
  67. package/esm/helpers/factorCovariance.d.ts.map +1 -0
  68. package/esm/helpers/factorCovariance.js +189 -0
  69. package/esm/helpers/findGeoColumn.d.ts +6 -4
  70. package/esm/helpers/findGeoColumn.d.ts.map +1 -1
  71. package/esm/helpers/findGeoColumn.js +6 -4
  72. package/esm/helpers/findGeoColumnFromSchema.d.ts +8 -5
  73. package/esm/helpers/findGeoColumnFromSchema.d.ts.map +1 -1
  74. package/esm/helpers/findGeoColumnFromSchema.js +8 -5
  75. package/esm/helpers/fitUmapCurve.d.ts +2 -0
  76. package/esm/helpers/fitUmapCurve.d.ts.map +1 -0
  77. package/esm/helpers/fitUmapCurve.js +66 -0
  78. package/esm/helpers/formatDate.d.ts +12 -6
  79. package/esm/helpers/formatDate.d.ts.map +1 -1
  80. package/esm/helpers/formatDate.js +12 -6
  81. package/esm/helpers/formatMissingTables.d.ts +8 -5
  82. package/esm/helpers/formatMissingTables.d.ts.map +1 -1
  83. package/esm/helpers/formatMissingTables.js +8 -5
  84. package/esm/helpers/formatNumber.d.ts +19 -10
  85. package/esm/helpers/formatNumber.d.ts.map +1 -1
  86. package/esm/helpers/formatNumber.js +32 -17
  87. package/esm/helpers/getGraphEdgeIdColumn.d.ts +9 -0
  88. package/esm/helpers/getGraphEdgeIdColumn.d.ts.map +1 -0
  89. package/esm/helpers/getGraphEdgeIdColumn.js +25 -0
  90. package/esm/helpers/getGraphEndpointColumns.d.ts +11 -0
  91. package/esm/helpers/getGraphEndpointColumns.d.ts.map +1 -0
  92. package/esm/helpers/getGraphEndpointColumns.js +160 -0
  93. package/esm/helpers/getGraphWeightColumn.d.ts +10 -0
  94. package/esm/helpers/getGraphWeightColumn.d.ts.map +1 -0
  95. package/esm/helpers/getGraphWeightColumn.js +40 -0
  96. package/esm/helpers/graphRouteResultSchema.d.ts +4 -0
  97. package/esm/helpers/graphRouteResultSchema.d.ts.map +1 -0
  98. package/esm/helpers/graphRouteResultSchema.js +12 -0
  99. package/esm/helpers/graphRouteResultSelect.d.ts +4 -0
  100. package/esm/helpers/graphRouteResultSelect.d.ts.map +1 -0
  101. package/esm/helpers/graphRouteResultSelect.js +22 -0
  102. package/esm/helpers/hasGeometryColumn.d.ts +4 -3
  103. package/esm/helpers/hasGeometryColumn.d.ts.map +1 -1
  104. package/esm/helpers/hasGeometryColumn.js +4 -3
  105. package/esm/helpers/initialUmapCoordinates.d.ts +2 -0
  106. package/esm/helpers/initialUmapCoordinates.d.ts.map +1 -0
  107. package/esm/helpers/initialUmapCoordinates.js +5 -0
  108. package/esm/helpers/inspectGraphConnectivity.d.ts +10 -0
  109. package/esm/helpers/inspectGraphConnectivity.d.ts.map +1 -0
  110. package/esm/helpers/inspectGraphConnectivity.js +55 -0
  111. package/esm/helpers/mergeOptions.d.ts +24 -13
  112. package/esm/helpers/mergeOptions.d.ts.map +1 -1
  113. package/esm/helpers/mergeOptions.js +24 -13
  114. package/esm/helpers/optimizeUmapLayout.d.ts +7 -0
  115. package/esm/helpers/optimizeUmapLayout.d.ts.map +1 -0
  116. package/esm/helpers/optimizeUmapLayout.js +93 -0
  117. package/esm/helpers/parseValue.d.ts +6 -4
  118. package/esm/helpers/parseValue.d.ts.map +1 -1
  119. package/esm/helpers/parseValue.js +6 -4
  120. package/esm/helpers/prepareGraphRouteSql.d.ts +31 -0
  121. package/esm/helpers/prepareGraphRouteSql.d.ts.map +1 -0
  122. package/esm/helpers/prepareGraphRouteSql.js +86 -0
  123. package/esm/helpers/prepareGraphStarts.d.ts +9 -0
  124. package/esm/helpers/prepareGraphStarts.d.ts.map +1 -0
  125. package/esm/helpers/prepareGraphStarts.js +68 -0
  126. package/esm/helpers/prepareGraphTemporalSql.d.ts +28 -0
  127. package/esm/helpers/prepareGraphTemporalSql.d.ts.map +1 -0
  128. package/esm/helpers/prepareGraphTemporalSql.js +154 -0
  129. package/esm/helpers/prepareGraphTraversal.d.ts +19 -0
  130. package/esm/helpers/prepareGraphTraversal.d.ts.map +1 -0
  131. package/esm/helpers/prepareGraphTraversal.js +79 -0
  132. package/esm/helpers/prepareNumericFeatures.d.ts +41 -0
  133. package/esm/helpers/prepareNumericFeatures.d.ts.map +1 -0
  134. package/esm/helpers/prepareNumericFeatures.js +210 -0
  135. package/esm/helpers/prepareUmapLayoutOptions.d.ts +14 -0
  136. package/esm/helpers/prepareUmapLayoutOptions.d.ts.map +1 -0
  137. package/esm/helpers/prepareUmapLayoutOptions.js +23 -0
  138. package/esm/helpers/prettyDuration.d.ts +14 -8
  139. package/esm/helpers/prettyDuration.d.ts.map +1 -1
  140. package/esm/helpers/prettyDuration.js +14 -8
  141. package/esm/helpers/printTable.d.ts +18 -13
  142. package/esm/helpers/printTable.d.ts.map +1 -1
  143. package/esm/helpers/printTable.js +18 -13
  144. package/esm/helpers/publishPreparedColumns.d.ts +37 -0
  145. package/esm/helpers/publishPreparedColumns.d.ts.map +1 -0
  146. package/esm/helpers/publishPreparedColumns.js +113 -0
  147. package/esm/helpers/queryDB.d.ts +24 -13
  148. package/esm/helpers/queryDB.d.ts.map +1 -1
  149. package/esm/helpers/queryDB.js +24 -13
  150. package/esm/helpers/queueAsyncBarrier.d.ts +12 -7
  151. package/esm/helpers/queueAsyncBarrier.d.ts.map +1 -1
  152. package/esm/helpers/queueAsyncBarrier.js +12 -7
  153. package/esm/helpers/queueGraphResult.d.ts +18 -0
  154. package/esm/helpers/queueGraphResult.d.ts.map +1 -0
  155. package/esm/helpers/queueGraphResult.js +39 -0
  156. package/esm/helpers/quoteIdentifier.d.ts +4 -3
  157. package/esm/helpers/quoteIdentifier.d.ts.map +1 -1
  158. package/esm/helpers/quoteIdentifier.js +4 -3
  159. package/esm/helpers/quoteQualifiedIdentifier.d.ts +6 -4
  160. package/esm/helpers/quoteQualifiedIdentifier.d.ts.map +1 -1
  161. package/esm/helpers/quoteQualifiedIdentifier.js +6 -4
  162. package/esm/helpers/readScalarNumber.d.ts +3 -0
  163. package/esm/helpers/readScalarNumber.d.ts.map +1 -0
  164. package/esm/helpers/readScalarNumber.js +4 -0
  165. package/esm/helpers/runQuery.d.ts.map +1 -1
  166. package/esm/helpers/runQuery.js +17 -3
  167. package/esm/helpers/selectFuzzyReplacements.d.ts +11 -0
  168. package/esm/helpers/selectFuzzyReplacements.d.ts.map +1 -0
  169. package/esm/helpers/selectFuzzyReplacements.js +124 -0
  170. package/esm/helpers/stabilizeCosineVectors.d.ts +14 -0
  171. package/esm/helpers/stabilizeCosineVectors.d.ts.map +1 -0
  172. package/esm/helpers/stabilizeCosineVectors.js +34 -0
  173. package/esm/helpers/stringToArray.d.ts +4 -3
  174. package/esm/helpers/stringToArray.d.ts.map +1 -1
  175. package/esm/helpers/stringToArray.js +4 -3
  176. package/esm/helpers/umapRandom.d.ts +2 -0
  177. package/esm/helpers/umapRandom.d.ts.map +1 -0
  178. package/esm/helpers/umapRandom.js +10 -0
  179. package/esm/helpers/updateColumnsWithJS.d.ts +12 -6
  180. package/esm/helpers/updateColumnsWithJS.d.ts.map +1 -1
  181. package/esm/helpers/updateColumnsWithJS.js +12 -6
  182. package/esm/helpers/validateGraphRouteResultSchema.d.ts +4 -0
  183. package/esm/helpers/validateGraphRouteResultSchema.d.ts.map +1 -0
  184. package/esm/helpers/validateGraphRouteResultSchema.js +13 -0
  185. package/esm/helpers/validateGraphTemporalEvents.d.ts +7 -0
  186. package/esm/helpers/validateGraphTemporalEvents.d.ts.map +1 -0
  187. package/esm/helpers/validateGraphTemporalEvents.js +47 -0
  188. package/esm/helpers/validateNumericalAnalysis.d.ts +10 -6
  189. package/esm/helpers/validateNumericalAnalysis.d.ts.map +1 -1
  190. package/esm/helpers/validateNumericalAnalysis.js +10 -6
  191. package/esm/helpers/validateVectorRowIds.d.ts +4 -0
  192. package/esm/helpers/validateVectorRowIds.d.ts.map +1 -0
  193. package/esm/helpers/validateVectorRowIds.js +16 -0
  194. package/esm/helpers/vectorDistanceExpression.d.ts +6 -0
  195. package/esm/helpers/vectorDistanceExpression.d.ts.map +1 -0
  196. package/esm/helpers/vectorDistanceExpression.js +11 -0
  197. package/esm/helpers/wrapString.d.ts +10 -7
  198. package/esm/helpers/wrapString.d.ts.map +1 -1
  199. package/esm/helpers/wrapString.js +10 -7
  200. package/esm/methods/addId.d.ts +5 -0
  201. package/esm/methods/addId.d.ts.map +1 -0
  202. package/esm/methods/addId.js +38 -0
  203. package/esm/methods/cache.js +1 -1
  204. package/esm/methods/commonNeighbors.d.ts +10 -0
  205. package/esm/methods/commonNeighbors.d.ts.map +1 -0
  206. package/esm/methods/commonNeighbors.js +101 -0
  207. package/esm/methods/connectedComponents.d.ts +9 -0
  208. package/esm/methods/connectedComponents.d.ts.map +1 -0
  209. package/esm/methods/connectedComponents.js +147 -0
  210. package/esm/methods/degree.d.ts +9 -0
  211. package/esm/methods/degree.d.ts.map +1 -0
  212. package/esm/methods/degree.js +135 -0
  213. package/esm/methods/distances.d.ts +12 -0
  214. package/esm/methods/distances.d.ts.map +1 -0
  215. package/esm/methods/distances.js +164 -0
  216. package/esm/methods/findCycles.d.ts +12 -0
  217. package/esm/methods/findCycles.d.ts.map +1 -0
  218. package/esm/methods/findCycles.js +330 -0
  219. package/esm/methods/fuzzyClean.d.ts.map +1 -1
  220. package/esm/methods/fuzzyClean.js +17 -136
  221. package/esm/methods/fuzzyJoin.js +70 -16
  222. package/esm/methods/getTypes.d.ts +1 -1
  223. package/esm/methods/hdbscan.d.ts +5 -0
  224. package/esm/methods/hdbscan.d.ts.map +1 -0
  225. package/esm/methods/hdbscan.js +208 -0
  226. package/esm/methods/loadArray.d.ts.map +1 -1
  227. package/esm/methods/loadArray.js +3 -20
  228. package/esm/methods/mahalanobis.d.ts +5 -0
  229. package/esm/methods/mahalanobis.d.ts.map +1 -0
  230. package/esm/methods/mahalanobis.js +92 -0
  231. package/esm/methods/neighbors.d.ts +9 -0
  232. package/esm/methods/neighbors.d.ts.map +1 -0
  233. package/esm/methods/neighbors.js +81 -0
  234. package/esm/methods/normalizeVector.d.ts +5 -0
  235. package/esm/methods/normalizeVector.d.ts.map +1 -0
  236. package/esm/methods/normalizeVector.js +132 -0
  237. package/esm/methods/paths.d.ts +12 -0
  238. package/esm/methods/paths.d.ts.map +1 -0
  239. package/esm/methods/paths.js +287 -0
  240. package/esm/methods/reachable.d.ts +11 -0
  241. package/esm/methods/reachable.d.ts.map +1 -0
  242. package/esm/methods/reachable.js +131 -0
  243. package/esm/methods/rowToVector.d.ts +5 -0
  244. package/esm/methods/rowToVector.d.ts.map +1 -0
  245. package/esm/methods/rowToVector.js +77 -0
  246. package/esm/methods/shortestPath.d.ts +12 -0
  247. package/esm/methods/shortestPath.d.ts.map +1 -0
  248. package/esm/methods/shortestPath.js +337 -0
  249. package/esm/methods/topologicalSort.d.ts +7 -0
  250. package/esm/methods/topologicalSort.d.ts.map +1 -0
  251. package/esm/methods/topologicalSort.js +164 -0
  252. package/esm/methods/umap.d.ts +5 -0
  253. package/esm/methods/umap.d.ts.map +1 -0
  254. package/esm/methods/umap.js +156 -0
  255. package/esm/methods/updateWithJS.js +9 -21
  256. package/llm.md +2170 -128
  257. package/llms.txt +1 -1
  258. package/package.json +1 -1
  259. package/script/class/SDAError.d.ts +6 -6
  260. package/script/class/SDAError.js +6 -6
  261. package/script/class/Simple.d.ts +9 -9
  262. package/script/class/Simple.js +9 -9
  263. package/script/class/SimpleDB.d.ts +80 -76
  264. package/script/class/SimpleDB.d.ts.map +1 -1
  265. package/script/class/SimpleDB.js +80 -76
  266. package/script/class/SimpleTable.d.ts +2805 -1077
  267. package/script/class/SimpleTable.d.ts.map +1 -1
  268. package/script/class/SimpleTable.js +2777 -1077
  269. package/script/helpers/appendColumnBatches.d.ts +3 -0
  270. package/script/helpers/appendColumnBatches.d.ts.map +1 -0
  271. package/script/helpers/appendColumnBatches.js +24 -0
  272. package/script/helpers/buildApproximateMutualReachabilityMst.d.ts +45 -0
  273. package/script/helpers/buildApproximateMutualReachabilityMst.d.ts.map +1 -0
  274. package/script/helpers/buildApproximateMutualReachabilityMst.js +219 -0
  275. package/script/helpers/buildChronologicalGraphComponentsSql.d.ts +14 -0
  276. package/script/helpers/buildChronologicalGraphComponentsSql.d.ts.map +1 -0
  277. package/script/helpers/buildChronologicalGraphComponentsSql.js +174 -0
  278. package/script/helpers/buildExactMutualReachabilityMst.d.ts +28 -0
  279. package/script/helpers/buildExactMutualReachabilityMst.d.ts.map +1 -0
  280. package/script/helpers/buildExactMutualReachabilityMst.js +103 -0
  281. package/script/helpers/buildGraphTemporalCostStateSql.d.ts +12 -0
  282. package/script/helpers/buildGraphTemporalCostStateSql.d.ts.map +1 -0
  283. package/script/helpers/buildGraphTemporalCostStateSql.js +92 -0
  284. package/script/helpers/buildGraphTemporalReachabilitySql.d.ts +13 -0
  285. package/script/helpers/buildGraphTemporalReachabilitySql.d.ts.map +1 -0
  286. package/script/helpers/buildGraphTemporalReachabilitySql.js +76 -0
  287. package/script/helpers/buildSparseMutualReachabilityMst.d.ts +10 -0
  288. package/script/helpers/buildSparseMutualReachabilityMst.d.ts.map +1 -0
  289. package/script/helpers/buildSparseMutualReachabilityMst.js +50 -0
  290. package/script/helpers/buildUmapGraph.d.ts +21 -0
  291. package/script/helpers/buildUmapGraph.d.ts.map +1 -0
  292. package/script/helpers/buildUmapGraph.js +67 -0
  293. package/script/helpers/buildVectorNeighbors.d.ts +45 -0
  294. package/script/helpers/buildVectorNeighbors.d.ts.map +1 -0
  295. package/script/helpers/buildVectorNeighbors.js +176 -0
  296. package/script/helpers/buildWeakGraphComponentsSql.d.ts +3 -0
  297. package/script/helpers/buildWeakGraphComponentsSql.d.ts.map +1 -0
  298. package/script/helpers/buildWeakGraphComponentsSql.js +38 -0
  299. package/script/helpers/cacheDatabase.d.ts.map +1 -1
  300. package/script/helpers/cacheDatabase.js +2 -1
  301. package/script/helpers/camelCase.d.ts +7 -5
  302. package/script/helpers/camelCase.d.ts.map +1 -1
  303. package/script/helpers/camelCase.js +7 -5
  304. package/script/helpers/capitalize.d.ts +6 -4
  305. package/script/helpers/capitalize.d.ts.map +1 -1
  306. package/script/helpers/capitalize.js +6 -4
  307. package/script/helpers/clusterHdbscan.d.ts +18 -0
  308. package/script/helpers/clusterHdbscan.d.ts.map +1 -0
  309. package/script/helpers/clusterHdbscan.js +346 -0
  310. package/script/helpers/computeCovariance.d.ts +16 -0
  311. package/script/helpers/computeCovariance.d.ts.map +1 -0
  312. package/script/helpers/computeCovariance.js +105 -0
  313. package/script/helpers/computeMahalanobisDistances.d.ts +14 -0
  314. package/script/helpers/computeMahalanobisDistances.d.ts.map +1 -0
  315. package/script/helpers/computeMahalanobisDistances.js +93 -0
  316. package/script/helpers/createDirectory.d.ts +4 -3
  317. package/script/helpers/createDirectory.d.ts.map +1 -1
  318. package/script/helpers/createDirectory.js +4 -3
  319. package/script/helpers/dataToArrays.d.ts +6 -4
  320. package/script/helpers/dataToArrays.d.ts.map +1 -1
  321. package/script/helpers/dataToArrays.js +6 -4
  322. package/script/helpers/extractTypes.d.ts +1 -1
  323. package/script/helpers/extractTypes.js +4 -9
  324. package/script/helpers/factorCovariance.d.ts +17 -0
  325. package/script/helpers/factorCovariance.d.ts.map +1 -0
  326. package/script/helpers/factorCovariance.js +194 -0
  327. package/script/helpers/findGeoColumn.d.ts +6 -4
  328. package/script/helpers/findGeoColumn.d.ts.map +1 -1
  329. package/script/helpers/findGeoColumn.js +6 -4
  330. package/script/helpers/findGeoColumnFromSchema.d.ts +8 -5
  331. package/script/helpers/findGeoColumnFromSchema.d.ts.map +1 -1
  332. package/script/helpers/findGeoColumnFromSchema.js +8 -5
  333. package/script/helpers/fitUmapCurve.d.ts +2 -0
  334. package/script/helpers/fitUmapCurve.d.ts.map +1 -0
  335. package/script/helpers/fitUmapCurve.js +69 -0
  336. package/script/helpers/formatDate.d.ts +12 -6
  337. package/script/helpers/formatDate.d.ts.map +1 -1
  338. package/script/helpers/formatDate.js +12 -6
  339. package/script/helpers/formatMissingTables.d.ts +8 -5
  340. package/script/helpers/formatMissingTables.d.ts.map +1 -1
  341. package/script/helpers/formatMissingTables.js +8 -5
  342. package/script/helpers/formatNumber.d.ts +19 -10
  343. package/script/helpers/formatNumber.d.ts.map +1 -1
  344. package/script/helpers/formatNumber.js +32 -17
  345. package/script/helpers/getGraphEdgeIdColumn.d.ts +9 -0
  346. package/script/helpers/getGraphEdgeIdColumn.d.ts.map +1 -0
  347. package/script/helpers/getGraphEdgeIdColumn.js +31 -0
  348. package/script/helpers/getGraphEndpointColumns.d.ts +11 -0
  349. package/script/helpers/getGraphEndpointColumns.d.ts.map +1 -0
  350. package/script/helpers/getGraphEndpointColumns.js +166 -0
  351. package/script/helpers/getGraphWeightColumn.d.ts +10 -0
  352. package/script/helpers/getGraphWeightColumn.d.ts.map +1 -0
  353. package/script/helpers/getGraphWeightColumn.js +46 -0
  354. package/script/helpers/graphRouteResultSchema.d.ts +4 -0
  355. package/script/helpers/graphRouteResultSchema.d.ts.map +1 -0
  356. package/script/helpers/graphRouteResultSchema.js +18 -0
  357. package/script/helpers/graphRouteResultSelect.d.ts +4 -0
  358. package/script/helpers/graphRouteResultSelect.d.ts.map +1 -0
  359. package/script/helpers/graphRouteResultSelect.js +28 -0
  360. package/script/helpers/hasGeometryColumn.d.ts +4 -3
  361. package/script/helpers/hasGeometryColumn.d.ts.map +1 -1
  362. package/script/helpers/hasGeometryColumn.js +4 -3
  363. package/script/helpers/initialUmapCoordinates.d.ts +2 -0
  364. package/script/helpers/initialUmapCoordinates.d.ts.map +1 -0
  365. package/script/helpers/initialUmapCoordinates.js +11 -0
  366. package/script/helpers/inspectGraphConnectivity.d.ts +10 -0
  367. package/script/helpers/inspectGraphConnectivity.d.ts.map +1 -0
  368. package/script/helpers/inspectGraphConnectivity.js +58 -0
  369. package/script/helpers/mergeOptions.d.ts +24 -13
  370. package/script/helpers/mergeOptions.d.ts.map +1 -1
  371. package/script/helpers/mergeOptions.js +24 -13
  372. package/script/helpers/optimizeUmapLayout.d.ts +7 -0
  373. package/script/helpers/optimizeUmapLayout.d.ts.map +1 -0
  374. package/script/helpers/optimizeUmapLayout.js +99 -0
  375. package/script/helpers/parseValue.d.ts +6 -4
  376. package/script/helpers/parseValue.d.ts.map +1 -1
  377. package/script/helpers/parseValue.js +6 -4
  378. package/script/helpers/prepareGraphRouteSql.d.ts +31 -0
  379. package/script/helpers/prepareGraphRouteSql.d.ts.map +1 -0
  380. package/script/helpers/prepareGraphRouteSql.js +127 -0
  381. package/script/helpers/prepareGraphStarts.d.ts +9 -0
  382. package/script/helpers/prepareGraphStarts.d.ts.map +1 -0
  383. package/script/helpers/prepareGraphStarts.js +71 -0
  384. package/script/helpers/prepareGraphTemporalSql.d.ts +28 -0
  385. package/script/helpers/prepareGraphTemporalSql.d.ts.map +1 -0
  386. package/script/helpers/prepareGraphTemporalSql.js +161 -0
  387. package/script/helpers/prepareGraphTraversal.d.ts +19 -0
  388. package/script/helpers/prepareGraphTraversal.d.ts.map +1 -0
  389. package/script/helpers/prepareGraphTraversal.js +87 -0
  390. package/script/helpers/prepareNumericFeatures.d.ts +41 -0
  391. package/script/helpers/prepareNumericFeatures.d.ts.map +1 -0
  392. package/script/helpers/prepareNumericFeatures.js +217 -0
  393. package/script/helpers/prepareUmapLayoutOptions.d.ts +14 -0
  394. package/script/helpers/prepareUmapLayoutOptions.d.ts.map +1 -0
  395. package/script/helpers/prepareUmapLayoutOptions.js +29 -0
  396. package/script/helpers/prettyDuration.d.ts +14 -8
  397. package/script/helpers/prettyDuration.d.ts.map +1 -1
  398. package/script/helpers/prettyDuration.js +14 -8
  399. package/script/helpers/printTable.d.ts +18 -13
  400. package/script/helpers/printTable.d.ts.map +1 -1
  401. package/script/helpers/printTable.js +18 -13
  402. package/script/helpers/publishPreparedColumns.d.ts +37 -0
  403. package/script/helpers/publishPreparedColumns.d.ts.map +1 -0
  404. package/script/helpers/publishPreparedColumns.js +119 -0
  405. package/script/helpers/queryDB.d.ts +24 -13
  406. package/script/helpers/queryDB.d.ts.map +1 -1
  407. package/script/helpers/queryDB.js +24 -13
  408. package/script/helpers/queueAsyncBarrier.d.ts +12 -7
  409. package/script/helpers/queueAsyncBarrier.d.ts.map +1 -1
  410. package/script/helpers/queueAsyncBarrier.js +12 -7
  411. package/script/helpers/queueGraphResult.d.ts +18 -0
  412. package/script/helpers/queueGraphResult.d.ts.map +1 -0
  413. package/script/helpers/queueGraphResult.js +45 -0
  414. package/script/helpers/quoteIdentifier.d.ts +4 -3
  415. package/script/helpers/quoteIdentifier.d.ts.map +1 -1
  416. package/script/helpers/quoteIdentifier.js +4 -3
  417. package/script/helpers/quoteQualifiedIdentifier.d.ts +6 -4
  418. package/script/helpers/quoteQualifiedIdentifier.d.ts.map +1 -1
  419. package/script/helpers/quoteQualifiedIdentifier.js +6 -4
  420. package/script/helpers/readScalarNumber.d.ts +3 -0
  421. package/script/helpers/readScalarNumber.d.ts.map +1 -0
  422. package/script/helpers/readScalarNumber.js +7 -0
  423. package/script/helpers/runQuery.d.ts.map +1 -1
  424. package/script/helpers/runQuery.js +17 -3
  425. package/script/helpers/selectFuzzyReplacements.d.ts +11 -0
  426. package/script/helpers/selectFuzzyReplacements.d.ts.map +1 -0
  427. package/script/helpers/selectFuzzyReplacements.js +127 -0
  428. package/script/helpers/stabilizeCosineVectors.d.ts +14 -0
  429. package/script/helpers/stabilizeCosineVectors.d.ts.map +1 -0
  430. package/script/helpers/stabilizeCosineVectors.js +40 -0
  431. package/script/helpers/stringToArray.d.ts +4 -3
  432. package/script/helpers/stringToArray.d.ts.map +1 -1
  433. package/script/helpers/stringToArray.js +4 -3
  434. package/script/helpers/umapRandom.d.ts +2 -0
  435. package/script/helpers/umapRandom.d.ts.map +1 -0
  436. package/script/helpers/umapRandom.js +13 -0
  437. package/script/helpers/updateColumnsWithJS.d.ts +12 -6
  438. package/script/helpers/updateColumnsWithJS.d.ts.map +1 -1
  439. package/script/helpers/updateColumnsWithJS.js +12 -6
  440. package/script/helpers/validateGraphRouteResultSchema.d.ts +4 -0
  441. package/script/helpers/validateGraphRouteResultSchema.d.ts.map +1 -0
  442. package/script/helpers/validateGraphRouteResultSchema.js +19 -0
  443. package/script/helpers/validateGraphTemporalEvents.d.ts +7 -0
  444. package/script/helpers/validateGraphTemporalEvents.d.ts.map +1 -0
  445. package/script/helpers/validateGraphTemporalEvents.js +53 -0
  446. package/script/helpers/validateNumericalAnalysis.d.ts +10 -6
  447. package/script/helpers/validateNumericalAnalysis.d.ts.map +1 -1
  448. package/script/helpers/validateNumericalAnalysis.js +10 -6
  449. package/script/helpers/validateVectorRowIds.d.ts +4 -0
  450. package/script/helpers/validateVectorRowIds.d.ts.map +1 -0
  451. package/script/helpers/validateVectorRowIds.js +19 -0
  452. package/script/helpers/vectorDistanceExpression.d.ts +6 -0
  453. package/script/helpers/vectorDistanceExpression.d.ts.map +1 -0
  454. package/script/helpers/vectorDistanceExpression.js +14 -0
  455. package/script/helpers/wrapString.d.ts +10 -7
  456. package/script/helpers/wrapString.d.ts.map +1 -1
  457. package/script/helpers/wrapString.js +10 -7
  458. package/script/methods/addId.d.ts +5 -0
  459. package/script/methods/addId.d.ts.map +1 -0
  460. package/script/methods/addId.js +44 -0
  461. package/script/methods/cache.js +1 -1
  462. package/script/methods/commonNeighbors.d.ts +10 -0
  463. package/script/methods/commonNeighbors.d.ts.map +1 -0
  464. package/script/methods/commonNeighbors.js +140 -0
  465. package/script/methods/connectedComponents.d.ts +9 -0
  466. package/script/methods/connectedComponents.d.ts.map +1 -0
  467. package/script/methods/connectedComponents.js +186 -0
  468. package/script/methods/degree.d.ts +9 -0
  469. package/script/methods/degree.d.ts.map +1 -0
  470. package/script/methods/degree.js +141 -0
  471. package/script/methods/distances.d.ts +12 -0
  472. package/script/methods/distances.d.ts.map +1 -0
  473. package/script/methods/distances.js +203 -0
  474. package/script/methods/findCycles.d.ts +12 -0
  475. package/script/methods/findCycles.d.ts.map +1 -0
  476. package/script/methods/findCycles.js +369 -0
  477. package/script/methods/fuzzyClean.d.ts.map +1 -1
  478. package/script/methods/fuzzyClean.js +17 -136
  479. package/script/methods/fuzzyJoin.js +70 -16
  480. package/script/methods/getTypes.d.ts +1 -1
  481. package/script/methods/hdbscan.d.ts +5 -0
  482. package/script/methods/hdbscan.d.ts.map +1 -0
  483. package/script/methods/hdbscan.js +214 -0
  484. package/script/methods/loadArray.d.ts.map +1 -1
  485. package/script/methods/loadArray.js +2 -19
  486. package/script/methods/mahalanobis.d.ts +5 -0
  487. package/script/methods/mahalanobis.d.ts.map +1 -0
  488. package/script/methods/mahalanobis.js +98 -0
  489. package/script/methods/neighbors.d.ts +9 -0
  490. package/script/methods/neighbors.d.ts.map +1 -0
  491. package/script/methods/neighbors.js +120 -0
  492. package/script/methods/normalizeVector.d.ts +5 -0
  493. package/script/methods/normalizeVector.d.ts.map +1 -0
  494. package/script/methods/normalizeVector.js +138 -0
  495. package/script/methods/paths.d.ts +12 -0
  496. package/script/methods/paths.d.ts.map +1 -0
  497. package/script/methods/paths.js +326 -0
  498. package/script/methods/reachable.d.ts +11 -0
  499. package/script/methods/reachable.d.ts.map +1 -0
  500. package/script/methods/reachable.js +170 -0
  501. package/script/methods/rowToVector.d.ts +5 -0
  502. package/script/methods/rowToVector.d.ts.map +1 -0
  503. package/script/methods/rowToVector.js +83 -0
  504. package/script/methods/shortestPath.d.ts +12 -0
  505. package/script/methods/shortestPath.d.ts.map +1 -0
  506. package/script/methods/shortestPath.js +376 -0
  507. package/script/methods/topologicalSort.d.ts +7 -0
  508. package/script/methods/topologicalSort.d.ts.map +1 -0
  509. package/script/methods/topologicalSort.js +170 -0
  510. package/script/methods/umap.d.ts +5 -0
  511. package/script/methods/umap.d.ts.map +1 -0
  512. package/script/methods/umap.js +162 -0
  513. package/script/methods/updateWithJS.js +9 -21
@@ -3,29 +3,31 @@ import capitalize from "./capitalize.js";
3
3
  * Converts a string into camelCase. This is useful for creating variable
4
4
  * names or object keys from human-readable text.
5
5
  *
6
- * @param input - The string to convert to camelCase. It can contain spaces,
7
- * punctuation, and mixed casing.
8
- *
9
- * @returns The camelCased version of the input string.
10
- *
11
6
  * @example
12
7
  * ```ts
13
8
  * // Basic conversion
14
9
  * const result1 = camelCase("hello world");
15
10
  * console.log(result1); // "helloWorld"
16
11
  * ```
12
+ *
17
13
  * @example
18
14
  * ```ts
19
15
  * // With punctuation and mixed case
20
16
  * const result2 = camelCase(" --Some@Thing is- happening-- ");
21
17
  * console.log(result2); // "someThingIsHappening"
22
18
  * ```
19
+ *
23
20
  * @example
24
21
  * ```ts
25
22
  * // With a single word
26
23
  * const result3 = camelCase("Journalism");
27
24
  * console.log(result3); // "journalism"
28
25
  * ```
26
+ *
27
+ * @param input - The string to convert to camelCase. It can contain spaces,
28
+ * punctuation, and mixed casing.
29
+ *
30
+ * @returns The camelCased version of the input string.
29
31
  */
30
32
  export default function camelCase(input) {
31
33
  const words = input
@@ -1,28 +1,30 @@
1
1
  /**
2
2
  * Capitalizes the first letter of a given string.
3
3
  *
4
- * @param string - The string to be capitalized.
5
- *
6
- * @returns A new string with the first letter in uppercase.
7
- *
8
4
  * @example
9
5
  * ```ts
10
6
  * // Basic usage
11
7
  * const capitalized = capitalize("hello world");
12
8
  * console.log(capitalized); // "Hello world"
13
9
  * ```
10
+ *
14
11
  * @example
15
12
  * ```ts
16
13
  * // With an already capitalized string
17
14
  * const alreadyCapitalized = capitalize("Journalism");
18
15
  * console.log(alreadyCapitalized); // "Journalism"
19
16
  * ```
17
+ *
20
18
  * @example
21
19
  * ```ts
22
20
  * // With a single character
23
21
  * const singleChar = capitalize("a");
24
22
  * console.log(singleChar); // "A"
25
23
  * ```
24
+ *
25
+ * @param string - The string to be capitalized.
26
+ *
27
+ * @returns A new string with the first letter in uppercase.
26
28
  */
27
29
  export default function capitalize(string: string): string;
28
30
  //# sourceMappingURL=capitalize.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"capitalize.d.ts","sourceRoot":"","sources":["../../src/helpers/capitalize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMzD"}
1
+ {"version":3,"file":"capitalize.d.ts","sourceRoot":"","sources":["../../src/helpers/capitalize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMzD"}
@@ -1,28 +1,30 @@
1
1
  /**
2
2
  * Capitalizes the first letter of a given string.
3
3
  *
4
- * @param string - The string to be capitalized.
5
- *
6
- * @returns A new string with the first letter in uppercase.
7
- *
8
4
  * @example
9
5
  * ```ts
10
6
  * // Basic usage
11
7
  * const capitalized = capitalize("hello world");
12
8
  * console.log(capitalized); // "Hello world"
13
9
  * ```
10
+ *
14
11
  * @example
15
12
  * ```ts
16
13
  * // With an already capitalized string
17
14
  * const alreadyCapitalized = capitalize("Journalism");
18
15
  * console.log(alreadyCapitalized); // "Journalism"
19
16
  * ```
17
+ *
20
18
  * @example
21
19
  * ```ts
22
20
  * // With a single character
23
21
  * const singleChar = capitalize("a");
24
22
  * console.log(singleChar); // "A"
25
23
  * ```
24
+ *
25
+ * @param string - The string to be capitalized.
26
+ *
27
+ * @returns A new string with the first letter in uppercase.
26
28
  */
27
29
  export default function capitalize(string) {
28
30
  if (string.length === 0) {
@@ -0,0 +1,18 @@
1
+ import type { DuckDBConnection } from "@duckdb/node-api";
2
+ /**
3
+ * Build the condensed hierarchy, select EOM clusters, and calculate point
4
+ * outputs from an HDBSCAN mutual-reachability MST. Only O(n) graph/hierarchy
5
+ * state crosses from DuckDB; source vectors remain native.
6
+ */
7
+ export default function clusterHdbscan(connection: DuckDBConnection, mst: string, options: {
8
+ count: number;
9
+ minClusterSize: number;
10
+ allowSingleCluster: boolean;
11
+ }): Promise<{
12
+ labels: Int32Array;
13
+ probabilities: Float64Array;
14
+ outlierScores: Float64Array;
15
+ }>;
16
+ /** Match a C float accumulator, including rounding after every addition. */
17
+ export declare function accumulateFloat32(values: number[]): number;
18
+ //# sourceMappingURL=clusterHdbscan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clusterHdbscan.d.ts","sourceRoot":"","sources":["../../src/helpers/clusterHdbscan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAWzD;;;;GAIG;AACH,wBAA8B,cAAc,CAC1C,UAAU,EAAE,gBAAgB,EAC5B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IACP,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,OAAO,CAAC;CAC7B,GACA,OAAO,CAAC;IACT,MAAM,EAAE,UAAU,CAAC;IACnB,aAAa,EAAE,YAAY,CAAC;IAC5B,aAAa,EAAE,YAAY,CAAC;CAC7B,CAAC,CAcD;AA4YD,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAI1D"}
@@ -0,0 +1,342 @@
1
+ /**
2
+ * Build the condensed hierarchy, select EOM clusters, and calculate point
3
+ * outputs from an HDBSCAN mutual-reachability MST. Only O(n) graph/hierarchy
4
+ * state crosses from DuckDB; source vectors remain native.
5
+ */
6
+ export default async function clusterHdbscan(connection, mst, options) {
7
+ // Leaves and internal nodes share the signed Int32 hierarchy namespace.
8
+ if (!Number.isSafeInteger(options.count) || options.count < 2 ||
9
+ options.count > 0x40000000) {
10
+ throw new Error("HDBSCAN hierarchy requires between 2 and 1073741824 rows so all 2*n-1 node identifiers fit signed INTEGER state.");
11
+ }
12
+ const edges = await readMst(connection, mst, options.count);
13
+ const linkage = buildSingleLinkage(edges, options.count);
14
+ const tree = condenseTree(linkage, options.count, options.minClusterSize);
15
+ return selectClusters(tree, options.count, options.allowSingleCluster);
16
+ }
17
+ async function readMst(connection, mst, count) {
18
+ const edges = [];
19
+ const result = await connection.stream(`SELECT source,target,distance FROM ${mst}`);
20
+ while (true) {
21
+ const chunk = await result.fetchChunk();
22
+ if (!chunk || chunk.rowCount === 0)
23
+ break;
24
+ const sources = chunk.getColumnVector(0);
25
+ const targets = chunk.getColumnVector(1);
26
+ const distances = chunk.getColumnVector(2);
27
+ for (let row = 0; row < chunk.rowCount; row++) {
28
+ const rawSource = sources.getItem(row);
29
+ const rawTarget = targets.getItem(row);
30
+ const rawDistance = distances.getItem(row);
31
+ if (rawSource === null || rawSource === undefined ||
32
+ rawTarget === null || rawTarget === undefined ||
33
+ rawDistance === null || rawDistance === undefined) {
34
+ throw new Error("HDBSCAN mutual-reachability MST contains an invalid edge.");
35
+ }
36
+ const source = Number(rawSource);
37
+ const target = Number(rawTarget);
38
+ const distance = Number(rawDistance);
39
+ if (!Number.isSafeInteger(source) || source < 0 || source >= count ||
40
+ !Number.isSafeInteger(target) || target < 0 || target >= count ||
41
+ source === target || !Number.isFinite(distance) || distance < 0) {
42
+ throw new Error("HDBSCAN mutual-reachability MST contains an invalid edge.");
43
+ }
44
+ edges.push({ source, target, distance });
45
+ }
46
+ }
47
+ if (edges.length !== count - 1) {
48
+ throw new Error(`HDBSCAN mutual-reachability MST returned ${edges.length} edges; ${count - 1} were required.`);
49
+ }
50
+ return edges;
51
+ }
52
+ function buildSingleLinkage(edges, count) {
53
+ edges.sort((a, b) => a.distance - b.distance ||
54
+ Math.min(a.source, a.target) - Math.min(b.source, b.target) ||
55
+ Math.max(a.source, a.target) - Math.max(b.source, b.target));
56
+ const parent = new Int32Array(count);
57
+ const size = new Int32Array(count).fill(1);
58
+ const node = new Int32Array(count);
59
+ for (let vertex = 0; vertex < count; vertex++) {
60
+ parent[vertex] = vertex;
61
+ node[vertex] = vertex;
62
+ }
63
+ const find = (start) => {
64
+ let root = start;
65
+ while (parent[root] !== root)
66
+ root = parent[root];
67
+ let current = start;
68
+ while (parent[current] !== current) {
69
+ const next = parent[current];
70
+ parent[current] = root;
71
+ current = next;
72
+ }
73
+ return root;
74
+ };
75
+ const linkage = [];
76
+ for (const edge of edges) {
77
+ let leftRoot = find(edge.source);
78
+ let rightRoot = find(edge.target);
79
+ if (leftRoot === rightRoot) {
80
+ throw new Error("HDBSCAN mutual-reachability edges do not form a tree.");
81
+ }
82
+ const combinedNode = count + linkage.length;
83
+ const combinedSize = size[leftRoot] + size[rightRoot];
84
+ linkage.push({
85
+ left: node[leftRoot],
86
+ right: node[rightRoot],
87
+ distance: edge.distance,
88
+ size: combinedSize,
89
+ });
90
+ if (size[leftRoot] < size[rightRoot]) {
91
+ [leftRoot, rightRoot] = [rightRoot, leftRoot];
92
+ }
93
+ parent[rightRoot] = leftRoot;
94
+ size[leftRoot] = combinedSize;
95
+ node[leftRoot] = combinedNode;
96
+ }
97
+ if (linkage.length !== count - 1 || linkage.at(-1)?.size !== count) {
98
+ throw new Error("HDBSCAN mutual-reachability edges do not form one connected tree.");
99
+ }
100
+ return linkage;
101
+ }
102
+ function condenseTree(hierarchy, count, minClusterSize) {
103
+ const root = 2 * count - 2;
104
+ const relabel = new Int32Array(root + 1).fill(-1);
105
+ relabel[root] = count;
106
+ let nextLabel = count + 1;
107
+ const ignored = new Uint8Array(root + 1);
108
+ const result = [];
109
+ for (const current of breadthFirstHierarchy(hierarchy, count, root)) {
110
+ if (ignored[current] || current < count)
111
+ continue;
112
+ const split = hierarchy[current - count];
113
+ const lambda = split.distance > 0 ? 1 / split.distance : Infinity;
114
+ const leftSize = split.left >= count
115
+ ? hierarchy[split.left - count].size
116
+ : 1;
117
+ const rightSize = split.right >= count
118
+ ? hierarchy[split.right - count].size
119
+ : 1;
120
+ if (leftSize >= minClusterSize && rightSize >= minClusterSize) {
121
+ relabel[split.left] = nextLabel++;
122
+ result.push({
123
+ parent: relabel[current],
124
+ child: relabel[split.left],
125
+ lambda,
126
+ childSize: leftSize,
127
+ });
128
+ relabel[split.right] = nextLabel++;
129
+ result.push({
130
+ parent: relabel[current],
131
+ child: relabel[split.right],
132
+ lambda,
133
+ childSize: rightSize,
134
+ });
135
+ }
136
+ else if (leftSize < minClusterSize && rightSize < minClusterSize) {
137
+ appendRunt(hierarchy, count, split.left, relabel[current], lambda, ignored, result);
138
+ appendRunt(hierarchy, count, split.right, relabel[current], lambda, ignored, result);
139
+ }
140
+ else if (leftSize < minClusterSize) {
141
+ relabel[split.right] = relabel[current];
142
+ appendRunt(hierarchy, count, split.left, relabel[current], lambda, ignored, result);
143
+ }
144
+ else {
145
+ relabel[split.left] = relabel[current];
146
+ appendRunt(hierarchy, count, split.right, relabel[current], lambda, ignored, result);
147
+ }
148
+ }
149
+ if (result.length === 0) {
150
+ throw new Error("HDBSCAN condensed hierarchy is empty.");
151
+ }
152
+ return result;
153
+ }
154
+ function appendRunt(hierarchy, count, root, parent, lambda, ignored, result) {
155
+ for (const node of breadthFirstHierarchy(hierarchy, count, root)) {
156
+ if (node < count) {
157
+ result.push({ parent, child: node, lambda, childSize: 1 });
158
+ }
159
+ ignored[node] = 1;
160
+ }
161
+ }
162
+ function breadthFirstHierarchy(hierarchy, count, root) {
163
+ const result = [];
164
+ let level = [root];
165
+ while (level.length > 0) {
166
+ for (const node of level)
167
+ result.push(node);
168
+ const next = [];
169
+ for (const node of level) {
170
+ if (node < count)
171
+ continue;
172
+ const split = hierarchy[node - count];
173
+ next.push(split.left, split.right);
174
+ }
175
+ level = next;
176
+ }
177
+ return result;
178
+ }
179
+ function selectClusters(tree, count, allowSingleCluster) {
180
+ let root = Number.MAX_SAFE_INTEGER;
181
+ let maximumParent = -1;
182
+ for (const edge of tree) {
183
+ if (edge.parent < root)
184
+ root = edge.parent;
185
+ if (edge.parent > maximumParent)
186
+ maximumParent = edge.parent;
187
+ }
188
+ if (root !== count) {
189
+ throw new Error("HDBSCAN condensed hierarchy has an invalid root.");
190
+ }
191
+ const births = new Float64Array(maximumParent + 1).fill(NaN);
192
+ for (const edge of tree) {
193
+ if (Number.isNaN(births[edge.child]))
194
+ births[edge.child] = edge.lambda;
195
+ else
196
+ births[edge.child] = Math.min(births[edge.child], edge.lambda);
197
+ }
198
+ births[root] = 0;
199
+ const stability = new Map();
200
+ for (let cluster = root; cluster <= maximumParent; cluster++) {
201
+ stability.set(cluster, 0);
202
+ }
203
+ for (const edge of tree) {
204
+ stability.set(edge.parent, stability.get(edge.parent) +
205
+ (edge.lambda - births[edge.parent]) * edge.childSize);
206
+ }
207
+ const clusterEdges = tree.filter(({ childSize }) => childSize > 1);
208
+ const nodeList = [...stability.keys()].sort((a, b) => b - a);
209
+ if (!allowSingleCluster)
210
+ nodeList.pop();
211
+ const preferred = new Map();
212
+ const children = new Map();
213
+ for (const edge of clusterEdges) {
214
+ const values = children.get(edge.parent) ?? [];
215
+ values.push(edge.child);
216
+ children.set(edge.parent, values);
217
+ }
218
+ for (const cluster of nodeList) {
219
+ const childClusters = children.get(cluster) ?? [];
220
+ // hdbscan 0.8.44 stores this otherwise-double reduction in a C float.
221
+ const subtreeStability = accumulateFloat32(childClusters.map((child) => stability.get(child)));
222
+ if (subtreeStability > stability.get(cluster)) {
223
+ stability.set(cluster, subtreeStability);
224
+ preferred.set(cluster, false);
225
+ }
226
+ else {
227
+ preferred.set(cluster, true);
228
+ }
229
+ }
230
+ const clusters = [];
231
+ const pending = [root];
232
+ while (pending.length > 0) {
233
+ const cluster = pending.pop();
234
+ if ((cluster !== root || allowSingleCluster) && preferred.get(cluster)) {
235
+ clusters.push(cluster);
236
+ continue;
237
+ }
238
+ const childClusters = children.get(cluster) ?? [];
239
+ for (let index = childClusters.length - 1; index >= 0; index--) {
240
+ pending.push(childClusters[index]);
241
+ }
242
+ }
243
+ clusters.sort((a, b) => a - b);
244
+ const labelsByCluster = new Map(clusters.map((cluster, label) => [cluster, label]));
245
+ const pointEdges = new Array(count);
246
+ const parentByCluster = new Map();
247
+ for (const edge of tree) {
248
+ if (edge.child < count)
249
+ pointEdges[edge.child] = edge;
250
+ else
251
+ parentByCluster.set(edge.child, edge.parent);
252
+ }
253
+ for (let point = 0; point < count; point++) {
254
+ if (pointEdges[point] === undefined) {
255
+ throw new Error("HDBSCAN condensed hierarchy omitted an input row.");
256
+ }
257
+ }
258
+ const labels = new Int32Array(count).fill(-1);
259
+ const selectedAncestor = new Int32Array(maximumParent + 1).fill(-1);
260
+ for (let cluster = root; cluster <= maximumParent; cluster++) {
261
+ if (labelsByCluster.has(cluster)) {
262
+ selectedAncestor[cluster] = cluster;
263
+ continue;
264
+ }
265
+ const parent = parentByCluster.get(cluster);
266
+ if (parent !== undefined) {
267
+ selectedAncestor[cluster] = selectedAncestor[parent];
268
+ }
269
+ }
270
+ let rootExit = 0;
271
+ for (const edge of tree) {
272
+ if (edge.parent === root && edge.lambda > rootExit)
273
+ rootExit = edge.lambda;
274
+ }
275
+ for (let point = 0; point < count; point++) {
276
+ const pointEdge = pointEdges[point];
277
+ const cluster = selectedAncestor[pointEdge.parent];
278
+ if (cluster < 0)
279
+ continue;
280
+ if (cluster === root &&
281
+ !(clusters.length === 1 && allowSingleCluster &&
282
+ pointEdge.lambda >= rootExit))
283
+ continue;
284
+ labels[point] = labelsByCluster.get(cluster);
285
+ }
286
+ const deaths = directMaximumLambdas(tree, maximumParent);
287
+ const probabilities = new Float64Array(count);
288
+ for (let point = 0; point < count; point++) {
289
+ const label = labels[point];
290
+ if (label < 0)
291
+ continue;
292
+ const cluster = clusters[label];
293
+ const maximum = deaths[cluster];
294
+ const lambda = pointEdges[point].lambda;
295
+ probabilities[point] = maximum === 0 || !Number.isFinite(lambda)
296
+ ? 1
297
+ : Math.min(lambda, maximum) / maximum;
298
+ }
299
+ // hdbscan 0.8.44 propagates maximum density through the condensed tree in
300
+ // reverse edge order, so each parent sees maxima already resolved below it.
301
+ for (let index = tree.length - 1; index >= 0; index--) {
302
+ const edge = tree[index];
303
+ if (deaths[edge.child] > deaths[edge.parent]) {
304
+ deaths[edge.parent] = deaths[edge.child];
305
+ }
306
+ }
307
+ const outlierScores = new Float64Array(count);
308
+ for (let point = 0; point < count; point++) {
309
+ const edge = pointEdges[point];
310
+ const maximum = deaths[edge.parent];
311
+ if (maximum === 0 || !Number.isFinite(edge.lambda)) {
312
+ outlierScores[point] = 0;
313
+ }
314
+ else if (!Number.isFinite(maximum)) {
315
+ // hdbscan 0.8.44 returns NaN for (Infinity - finite) / Infinity.
316
+ // Use the finite perturbation limit so public outputs remain finite.
317
+ outlierScores[point] = 1;
318
+ }
319
+ else {
320
+ outlierScores[point] = (maximum - edge.lambda) / maximum;
321
+ }
322
+ }
323
+ if (probabilities.some((value) => !Number.isFinite(value)) ||
324
+ outlierScores.some((value) => !Number.isFinite(value))) {
325
+ throw new Error("HDBSCAN produced non-finite point scores.");
326
+ }
327
+ return { labels, probabilities, outlierScores };
328
+ }
329
+ /** Match a C float accumulator, including rounding after every addition. */
330
+ export function accumulateFloat32(values) {
331
+ let total = 0;
332
+ for (const value of values)
333
+ total = Math.fround(total + value);
334
+ return total;
335
+ }
336
+ function directMaximumLambdas(tree, maximumParent) {
337
+ const deaths = new Float64Array(maximumParent + 1);
338
+ for (const edge of tree) {
339
+ deaths[edge.parent] = Math.max(deaths[edge.parent], edge.lambda);
340
+ }
341
+ return deaths;
342
+ }
@@ -0,0 +1,16 @@
1
+ import type { DuckDBConnection } from "@duckdb/node-api";
2
+ import { type CovarianceFactor } from "./factorCovariance.js";
3
+ export type CovarianceModel = CovarianceFactor & {
4
+ means: Float64Array;
5
+ origins: Float64Array;
6
+ meanOffsets: Float64Array;
7
+ observations: number;
8
+ };
9
+ export default function computeCovariance(connection: DuckDBConnection, input: {
10
+ relation: string;
11
+ rowIdColumn: string;
12
+ vectorColumn: string;
13
+ observations: number;
14
+ dimensions: number;
15
+ }): Promise<CovarianceModel>;
16
+ //# sourceMappingURL=computeCovariance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computeCovariance.d.ts","sourceRoot":"","sources":["../../src/helpers/computeCovariance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,KAAK,gBAAgB,EAAoB,MAAM,uBAAuB,CAAC;AAEhF,MAAM,MAAM,eAAe,GAAG,gBAAgB,GAAG;IAC/C,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,EAAE,YAAY,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAA8B,iBAAiB,CAC7C,UAAU,EAAE,gBAAgB,EAC5B,KAAK,EAAE;IACL,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,GACA,OAAO,CAAC,eAAe,CAAC,CAmH1B"}
@@ -0,0 +1,99 @@
1
+ import quoteIdentifier from "./quoteIdentifier.js";
2
+ import { factorCovariance } from "./factorCovariance.js";
3
+ export default async function computeCovariance(connection, input) {
4
+ const { observations, dimensions } = input;
5
+ if (!Number.isSafeInteger(dimensions) || dimensions < 1) {
6
+ throw new Error("Covariance requires at least one feature dimension.");
7
+ }
8
+ if (!Number.isSafeInteger(observations) || observations <= dimensions) {
9
+ throw new Error(`Covariance requires more observations than features (n > d), but received n=${observations} and d=${dimensions}. More observations are necessary, though constant or linearly dependent features can still make covariance singular.`);
10
+ }
11
+ const relation = quoteIdentifier(input.relation);
12
+ const rowId = quoteIdentifier(input.rowIdColumn);
13
+ const vector = quoteIdentifier(input.vectorColumn);
14
+ const expanded = `SELECT r.${rowId} AS observation,
15
+ f.feature::INTEGER AS feature,
16
+ array_extract(r.${vector}, f.feature)::DOUBLE AS value
17
+ FROM ${relation} r CROSS JOIN range(1, ${dimensions + 1}) f(feature)`;
18
+ const offsets = `SELECT observation, feature, value,
19
+ first_value(value) OVER (PARTITION BY feature ORDER BY observation
20
+ ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS origin
21
+ FROM (${expanded})`;
22
+ const meanRows = (await connection.runAndReadAll(`SELECT feature - 1 AS feature, first(origin) AS origin,
23
+ avg(value - origin) AS mean_offset, max(abs(value - origin)) AS magnitude FROM (${offsets})
24
+ GROUP BY feature ORDER BY feature`)).getRowsJS();
25
+ if (meanRows.length !== dimensions) {
26
+ throw new Error("Covariance aggregation returned an incomplete centroid.");
27
+ }
28
+ const magnitudes = new Float64Array(dimensions);
29
+ const means = new Float64Array(dimensions);
30
+ const origins = new Float64Array(dimensions);
31
+ const meanOffsets = new Float64Array(dimensions);
32
+ for (const row of meanRows) {
33
+ const feature = Number(row[0]);
34
+ const origin = Number(row[1]);
35
+ const meanOffset = Number(row[2]);
36
+ if (!Number.isSafeInteger(feature) || !Number.isFinite(origin) ||
37
+ !Number.isFinite(meanOffset)) {
38
+ throw new Error("Covariance is numerically unstable because centroid aggregation produced a non-finite result. Rescale features or remove dimensions whose range cannot be represented as DOUBLE.");
39
+ }
40
+ const magnitude = Number(row[3]);
41
+ if (!Number.isFinite(magnitude) || magnitude <= 0) {
42
+ throw new Error(`Covariance is singular or numerically unstable (feature ${feature + 1} has constant values or an unrepresentable range). Constant columns, linearly dependent features, or too few observations are common causes. Remove redundant features or provide more observations.`);
43
+ }
44
+ magnitudes[feature] = magnitude;
45
+ origins[feature] = origin;
46
+ meanOffsets[feature] = meanOffset;
47
+ means[feature] = origin + meanOffset;
48
+ }
49
+ const covariance = new Float64Array(dimensions * dimensions);
50
+ // covar_samp divides centered cross-products by n - 1. Subtracting a native
51
+ // per-feature anchor first avoids cancellation in E[x*y] - E[x]E[y] and
52
+ // retains small deviations when a feature has a large common offset.
53
+ // Divide by each feature's observed magnitude before accumulating products.
54
+ // Otherwise the n-1 cross-product sum can overflow even when the final sample
55
+ // covariance is finite (e.g. [0, 1e154, 2e154], whose variance is 1e308).
56
+ const result = await connection.stream(`WITH features AS MATERIALIZED (
57
+ SELECT observation, feature, (value - origin) /
58
+ array_extract([${magnitudes.join(",")}]::DOUBLE[${dimensions}], feature) AS value
59
+ FROM (${offsets})
60
+ )
61
+ SELECT a.feature - 1 AS row, b.feature - 1 AS column,
62
+ covar_samp(a.value, b.value) AS covariance
63
+ FROM features a JOIN features b
64
+ ON a.observation = b.observation AND a.feature <= b.feature
65
+ GROUP BY a.feature, b.feature`);
66
+ let values = 0;
67
+ while (true) {
68
+ const chunk = await result.fetchChunk();
69
+ if (!chunk || chunk.rowCount === 0)
70
+ break;
71
+ const rows = new Int32Array(chunk.rowCount);
72
+ const columns = new Int32Array(chunk.rowCount);
73
+ const entries = new Float64Array(chunk.rowCount);
74
+ chunk.visitColumnValues(0, (value, row) => rows[row] = Number(value));
75
+ chunk.visitColumnValues(1, (value, row) => columns[row] = Number(value));
76
+ chunk.visitColumnValues(2, (value, row) => entries[row] = Number(value));
77
+ for (let i = 0; i < chunk.rowCount; i++) {
78
+ const row = rows[i];
79
+ const column = columns[i];
80
+ // Restore units using the larger magnitude first to avoid prematurely
81
+ // underflowing a finite cross-covariance between very different units.
82
+ const value = entries[i] * Math.max(magnitudes[row], magnitudes[column]) *
83
+ Math.min(magnitudes[row], magnitudes[column]);
84
+ covariance[row * dimensions + column] = value;
85
+ covariance[column * dimensions + row] = value;
86
+ values++;
87
+ }
88
+ }
89
+ if (values !== dimensions * (dimensions + 1) / 2) {
90
+ throw new Error("Covariance aggregation returned an incomplete matrix.");
91
+ }
92
+ return {
93
+ ...factorCovariance(covariance, dimensions),
94
+ means,
95
+ origins,
96
+ meanOffsets,
97
+ observations,
98
+ };
99
+ }
@@ -0,0 +1,14 @@
1
+ import { type DuckDBConnection } from "@duckdb/node-api";
2
+ import type { CovarianceModel } from "./computeCovariance.js";
3
+ /** Evaluates bulk distances in DuckDB; the caller owns the returned scratch table. */
4
+ export default function computeMahalanobisDistances(connection: DuckDBConnection, input: {
5
+ relation: string;
6
+ rowIdColumn: string;
7
+ vectorColumn: string;
8
+ }, model: CovarianceModel, referencePoint?: number[]): Promise<{
9
+ relation: string;
10
+ rowIdColumn: string;
11
+ distanceColumn: string;
12
+ cleanup: () => Promise<void>;
13
+ }>;
14
+ //# sourceMappingURL=computeMahalanobisDistances.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computeMahalanobisDistances.d.ts","sourceRoot":"","sources":["../../src/helpers/computeMahalanobisDistances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,sFAAsF;AACtF,wBAA8B,2BAA2B,CACvD,UAAU,EAAE,gBAAgB,EAC5B,KAAK,EAAE;IACL,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,EACD,KAAK,EAAE,eAAe,EACtB,cAAc,CAAC,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC;IACT,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC,CAkGD"}