@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
@@ -2,29 +2,31 @@
2
2
  * Converts a string into camelCase. This is useful for creating variable
3
3
  * names or object keys from human-readable text.
4
4
  *
5
- * @param input - The string to convert to camelCase. It can contain spaces,
6
- * punctuation, and mixed casing.
7
- *
8
- * @returns The camelCased version of the input string.
9
- *
10
5
  * @example
11
6
  * ```ts
12
7
  * // Basic conversion
13
8
  * const result1 = camelCase("hello world");
14
9
  * console.log(result1); // "helloWorld"
15
10
  * ```
11
+ *
16
12
  * @example
17
13
  * ```ts
18
14
  * // With punctuation and mixed case
19
15
  * const result2 = camelCase(" --Some@Thing is- happening-- ");
20
16
  * console.log(result2); // "someThingIsHappening"
21
17
  * ```
18
+ *
22
19
  * @example
23
20
  * ```ts
24
21
  * // With a single word
25
22
  * const result3 = camelCase("Journalism");
26
23
  * console.log(result3); // "journalism"
27
24
  * ```
25
+ *
26
+ * @param input - The string to convert to camelCase. It can contain spaces,
27
+ * punctuation, and mixed casing.
28
+ *
29
+ * @returns The camelCased version of the input string.
28
30
  */
29
31
  export default function camelCase(input: string): string;
30
32
  //# sourceMappingURL=camelCase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"camelCase.d.ts","sourceRoot":"","sources":["../../src/helpers/camelCase.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAiBvD"}
1
+ {"version":3,"file":"camelCase.d.ts","sourceRoot":"","sources":["../../src/helpers/camelCase.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAiBvD"}
@@ -9,29 +9,31 @@ const capitalize_js_1 = __importDefault(require("./capitalize.js"));
9
9
  * Converts a string into camelCase. This is useful for creating variable
10
10
  * names or object keys from human-readable text.
11
11
  *
12
- * @param input - The string to convert to camelCase. It can contain spaces,
13
- * punctuation, and mixed casing.
14
- *
15
- * @returns The camelCased version of the input string.
16
- *
17
12
  * @example
18
13
  * ```ts
19
14
  * // Basic conversion
20
15
  * const result1 = camelCase("hello world");
21
16
  * console.log(result1); // "helloWorld"
22
17
  * ```
18
+ *
23
19
  * @example
24
20
  * ```ts
25
21
  * // With punctuation and mixed case
26
22
  * const result2 = camelCase(" --Some@Thing is- happening-- ");
27
23
  * console.log(result2); // "someThingIsHappening"
28
24
  * ```
25
+ *
29
26
  * @example
30
27
  * ```ts
31
28
  * // With a single word
32
29
  * const result3 = camelCase("Journalism");
33
30
  * console.log(result3); // "journalism"
34
31
  * ```
32
+ *
33
+ * @param input - The string to convert to camelCase. It can contain spaces,
34
+ * punctuation, and mixed casing.
35
+ *
36
+ * @returns The camelCased version of the input string.
35
37
  */
36
38
  function camelCase(input) {
37
39
  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"}
@@ -4,28 +4,30 @@ exports.default = capitalize;
4
4
  /**
5
5
  * Capitalizes the first letter of a given string.
6
6
  *
7
- * @param string - The string to be capitalized.
8
- *
9
- * @returns A new string with the first letter in uppercase.
10
- *
11
7
  * @example
12
8
  * ```ts
13
9
  * // Basic usage
14
10
  * const capitalized = capitalize("hello world");
15
11
  * console.log(capitalized); // "Hello world"
16
12
  * ```
13
+ *
17
14
  * @example
18
15
  * ```ts
19
16
  * // With an already capitalized string
20
17
  * const alreadyCapitalized = capitalize("Journalism");
21
18
  * console.log(alreadyCapitalized); // "Journalism"
22
19
  * ```
20
+ *
23
21
  * @example
24
22
  * ```ts
25
23
  * // With a single character
26
24
  * const singleChar = capitalize("a");
27
25
  * console.log(singleChar); // "A"
28
26
  * ```
27
+ *
28
+ * @param string - The string to be capitalized.
29
+ *
30
+ * @returns A new string with the first letter in uppercase.
29
31
  */
30
32
  function capitalize(string) {
31
33
  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,346 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = clusterHdbscan;
4
+ exports.accumulateFloat32 = accumulateFloat32;
5
+ /**
6
+ * Build the condensed hierarchy, select EOM clusters, and calculate point
7
+ * outputs from an HDBSCAN mutual-reachability MST. Only O(n) graph/hierarchy
8
+ * state crosses from DuckDB; source vectors remain native.
9
+ */
10
+ async function clusterHdbscan(connection, mst, options) {
11
+ // Leaves and internal nodes share the signed Int32 hierarchy namespace.
12
+ if (!Number.isSafeInteger(options.count) || options.count < 2 ||
13
+ options.count > 0x40000000) {
14
+ throw new Error("HDBSCAN hierarchy requires between 2 and 1073741824 rows so all 2*n-1 node identifiers fit signed INTEGER state.");
15
+ }
16
+ const edges = await readMst(connection, mst, options.count);
17
+ const linkage = buildSingleLinkage(edges, options.count);
18
+ const tree = condenseTree(linkage, options.count, options.minClusterSize);
19
+ return selectClusters(tree, options.count, options.allowSingleCluster);
20
+ }
21
+ async function readMst(connection, mst, count) {
22
+ const edges = [];
23
+ const result = await connection.stream(`SELECT source,target,distance FROM ${mst}`);
24
+ while (true) {
25
+ const chunk = await result.fetchChunk();
26
+ if (!chunk || chunk.rowCount === 0)
27
+ break;
28
+ const sources = chunk.getColumnVector(0);
29
+ const targets = chunk.getColumnVector(1);
30
+ const distances = chunk.getColumnVector(2);
31
+ for (let row = 0; row < chunk.rowCount; row++) {
32
+ const rawSource = sources.getItem(row);
33
+ const rawTarget = targets.getItem(row);
34
+ const rawDistance = distances.getItem(row);
35
+ if (rawSource === null || rawSource === undefined ||
36
+ rawTarget === null || rawTarget === undefined ||
37
+ rawDistance === null || rawDistance === undefined) {
38
+ throw new Error("HDBSCAN mutual-reachability MST contains an invalid edge.");
39
+ }
40
+ const source = Number(rawSource);
41
+ const target = Number(rawTarget);
42
+ const distance = Number(rawDistance);
43
+ if (!Number.isSafeInteger(source) || source < 0 || source >= count ||
44
+ !Number.isSafeInteger(target) || target < 0 || target >= count ||
45
+ source === target || !Number.isFinite(distance) || distance < 0) {
46
+ throw new Error("HDBSCAN mutual-reachability MST contains an invalid edge.");
47
+ }
48
+ edges.push({ source, target, distance });
49
+ }
50
+ }
51
+ if (edges.length !== count - 1) {
52
+ throw new Error(`HDBSCAN mutual-reachability MST returned ${edges.length} edges; ${count - 1} were required.`);
53
+ }
54
+ return edges;
55
+ }
56
+ function buildSingleLinkage(edges, count) {
57
+ edges.sort((a, b) => a.distance - b.distance ||
58
+ Math.min(a.source, a.target) - Math.min(b.source, b.target) ||
59
+ Math.max(a.source, a.target) - Math.max(b.source, b.target));
60
+ const parent = new Int32Array(count);
61
+ const size = new Int32Array(count).fill(1);
62
+ const node = new Int32Array(count);
63
+ for (let vertex = 0; vertex < count; vertex++) {
64
+ parent[vertex] = vertex;
65
+ node[vertex] = vertex;
66
+ }
67
+ const find = (start) => {
68
+ let root = start;
69
+ while (parent[root] !== root)
70
+ root = parent[root];
71
+ let current = start;
72
+ while (parent[current] !== current) {
73
+ const next = parent[current];
74
+ parent[current] = root;
75
+ current = next;
76
+ }
77
+ return root;
78
+ };
79
+ const linkage = [];
80
+ for (const edge of edges) {
81
+ let leftRoot = find(edge.source);
82
+ let rightRoot = find(edge.target);
83
+ if (leftRoot === rightRoot) {
84
+ throw new Error("HDBSCAN mutual-reachability edges do not form a tree.");
85
+ }
86
+ const combinedNode = count + linkage.length;
87
+ const combinedSize = size[leftRoot] + size[rightRoot];
88
+ linkage.push({
89
+ left: node[leftRoot],
90
+ right: node[rightRoot],
91
+ distance: edge.distance,
92
+ size: combinedSize,
93
+ });
94
+ if (size[leftRoot] < size[rightRoot]) {
95
+ [leftRoot, rightRoot] = [rightRoot, leftRoot];
96
+ }
97
+ parent[rightRoot] = leftRoot;
98
+ size[leftRoot] = combinedSize;
99
+ node[leftRoot] = combinedNode;
100
+ }
101
+ if (linkage.length !== count - 1 || linkage.at(-1)?.size !== count) {
102
+ throw new Error("HDBSCAN mutual-reachability edges do not form one connected tree.");
103
+ }
104
+ return linkage;
105
+ }
106
+ function condenseTree(hierarchy, count, minClusterSize) {
107
+ const root = 2 * count - 2;
108
+ const relabel = new Int32Array(root + 1).fill(-1);
109
+ relabel[root] = count;
110
+ let nextLabel = count + 1;
111
+ const ignored = new Uint8Array(root + 1);
112
+ const result = [];
113
+ for (const current of breadthFirstHierarchy(hierarchy, count, root)) {
114
+ if (ignored[current] || current < count)
115
+ continue;
116
+ const split = hierarchy[current - count];
117
+ const lambda = split.distance > 0 ? 1 / split.distance : Infinity;
118
+ const leftSize = split.left >= count
119
+ ? hierarchy[split.left - count].size
120
+ : 1;
121
+ const rightSize = split.right >= count
122
+ ? hierarchy[split.right - count].size
123
+ : 1;
124
+ if (leftSize >= minClusterSize && rightSize >= minClusterSize) {
125
+ relabel[split.left] = nextLabel++;
126
+ result.push({
127
+ parent: relabel[current],
128
+ child: relabel[split.left],
129
+ lambda,
130
+ childSize: leftSize,
131
+ });
132
+ relabel[split.right] = nextLabel++;
133
+ result.push({
134
+ parent: relabel[current],
135
+ child: relabel[split.right],
136
+ lambda,
137
+ childSize: rightSize,
138
+ });
139
+ }
140
+ else if (leftSize < minClusterSize && rightSize < minClusterSize) {
141
+ appendRunt(hierarchy, count, split.left, relabel[current], lambda, ignored, result);
142
+ appendRunt(hierarchy, count, split.right, relabel[current], lambda, ignored, result);
143
+ }
144
+ else if (leftSize < minClusterSize) {
145
+ relabel[split.right] = relabel[current];
146
+ appendRunt(hierarchy, count, split.left, relabel[current], lambda, ignored, result);
147
+ }
148
+ else {
149
+ relabel[split.left] = relabel[current];
150
+ appendRunt(hierarchy, count, split.right, relabel[current], lambda, ignored, result);
151
+ }
152
+ }
153
+ if (result.length === 0) {
154
+ throw new Error("HDBSCAN condensed hierarchy is empty.");
155
+ }
156
+ return result;
157
+ }
158
+ function appendRunt(hierarchy, count, root, parent, lambda, ignored, result) {
159
+ for (const node of breadthFirstHierarchy(hierarchy, count, root)) {
160
+ if (node < count) {
161
+ result.push({ parent, child: node, lambda, childSize: 1 });
162
+ }
163
+ ignored[node] = 1;
164
+ }
165
+ }
166
+ function breadthFirstHierarchy(hierarchy, count, root) {
167
+ const result = [];
168
+ let level = [root];
169
+ while (level.length > 0) {
170
+ for (const node of level)
171
+ result.push(node);
172
+ const next = [];
173
+ for (const node of level) {
174
+ if (node < count)
175
+ continue;
176
+ const split = hierarchy[node - count];
177
+ next.push(split.left, split.right);
178
+ }
179
+ level = next;
180
+ }
181
+ return result;
182
+ }
183
+ function selectClusters(tree, count, allowSingleCluster) {
184
+ let root = Number.MAX_SAFE_INTEGER;
185
+ let maximumParent = -1;
186
+ for (const edge of tree) {
187
+ if (edge.parent < root)
188
+ root = edge.parent;
189
+ if (edge.parent > maximumParent)
190
+ maximumParent = edge.parent;
191
+ }
192
+ if (root !== count) {
193
+ throw new Error("HDBSCAN condensed hierarchy has an invalid root.");
194
+ }
195
+ const births = new Float64Array(maximumParent + 1).fill(NaN);
196
+ for (const edge of tree) {
197
+ if (Number.isNaN(births[edge.child]))
198
+ births[edge.child] = edge.lambda;
199
+ else
200
+ births[edge.child] = Math.min(births[edge.child], edge.lambda);
201
+ }
202
+ births[root] = 0;
203
+ const stability = new Map();
204
+ for (let cluster = root; cluster <= maximumParent; cluster++) {
205
+ stability.set(cluster, 0);
206
+ }
207
+ for (const edge of tree) {
208
+ stability.set(edge.parent, stability.get(edge.parent) +
209
+ (edge.lambda - births[edge.parent]) * edge.childSize);
210
+ }
211
+ const clusterEdges = tree.filter(({ childSize }) => childSize > 1);
212
+ const nodeList = [...stability.keys()].sort((a, b) => b - a);
213
+ if (!allowSingleCluster)
214
+ nodeList.pop();
215
+ const preferred = new Map();
216
+ const children = new Map();
217
+ for (const edge of clusterEdges) {
218
+ const values = children.get(edge.parent) ?? [];
219
+ values.push(edge.child);
220
+ children.set(edge.parent, values);
221
+ }
222
+ for (const cluster of nodeList) {
223
+ const childClusters = children.get(cluster) ?? [];
224
+ // hdbscan 0.8.44 stores this otherwise-double reduction in a C float.
225
+ const subtreeStability = accumulateFloat32(childClusters.map((child) => stability.get(child)));
226
+ if (subtreeStability > stability.get(cluster)) {
227
+ stability.set(cluster, subtreeStability);
228
+ preferred.set(cluster, false);
229
+ }
230
+ else {
231
+ preferred.set(cluster, true);
232
+ }
233
+ }
234
+ const clusters = [];
235
+ const pending = [root];
236
+ while (pending.length > 0) {
237
+ const cluster = pending.pop();
238
+ if ((cluster !== root || allowSingleCluster) && preferred.get(cluster)) {
239
+ clusters.push(cluster);
240
+ continue;
241
+ }
242
+ const childClusters = children.get(cluster) ?? [];
243
+ for (let index = childClusters.length - 1; index >= 0; index--) {
244
+ pending.push(childClusters[index]);
245
+ }
246
+ }
247
+ clusters.sort((a, b) => a - b);
248
+ const labelsByCluster = new Map(clusters.map((cluster, label) => [cluster, label]));
249
+ const pointEdges = new Array(count);
250
+ const parentByCluster = new Map();
251
+ for (const edge of tree) {
252
+ if (edge.child < count)
253
+ pointEdges[edge.child] = edge;
254
+ else
255
+ parentByCluster.set(edge.child, edge.parent);
256
+ }
257
+ for (let point = 0; point < count; point++) {
258
+ if (pointEdges[point] === undefined) {
259
+ throw new Error("HDBSCAN condensed hierarchy omitted an input row.");
260
+ }
261
+ }
262
+ const labels = new Int32Array(count).fill(-1);
263
+ const selectedAncestor = new Int32Array(maximumParent + 1).fill(-1);
264
+ for (let cluster = root; cluster <= maximumParent; cluster++) {
265
+ if (labelsByCluster.has(cluster)) {
266
+ selectedAncestor[cluster] = cluster;
267
+ continue;
268
+ }
269
+ const parent = parentByCluster.get(cluster);
270
+ if (parent !== undefined) {
271
+ selectedAncestor[cluster] = selectedAncestor[parent];
272
+ }
273
+ }
274
+ let rootExit = 0;
275
+ for (const edge of tree) {
276
+ if (edge.parent === root && edge.lambda > rootExit)
277
+ rootExit = edge.lambda;
278
+ }
279
+ for (let point = 0; point < count; point++) {
280
+ const pointEdge = pointEdges[point];
281
+ const cluster = selectedAncestor[pointEdge.parent];
282
+ if (cluster < 0)
283
+ continue;
284
+ if (cluster === root &&
285
+ !(clusters.length === 1 && allowSingleCluster &&
286
+ pointEdge.lambda >= rootExit))
287
+ continue;
288
+ labels[point] = labelsByCluster.get(cluster);
289
+ }
290
+ const deaths = directMaximumLambdas(tree, maximumParent);
291
+ const probabilities = new Float64Array(count);
292
+ for (let point = 0; point < count; point++) {
293
+ const label = labels[point];
294
+ if (label < 0)
295
+ continue;
296
+ const cluster = clusters[label];
297
+ const maximum = deaths[cluster];
298
+ const lambda = pointEdges[point].lambda;
299
+ probabilities[point] = maximum === 0 || !Number.isFinite(lambda)
300
+ ? 1
301
+ : Math.min(lambda, maximum) / maximum;
302
+ }
303
+ // hdbscan 0.8.44 propagates maximum density through the condensed tree in
304
+ // reverse edge order, so each parent sees maxima already resolved below it.
305
+ for (let index = tree.length - 1; index >= 0; index--) {
306
+ const edge = tree[index];
307
+ if (deaths[edge.child] > deaths[edge.parent]) {
308
+ deaths[edge.parent] = deaths[edge.child];
309
+ }
310
+ }
311
+ const outlierScores = new Float64Array(count);
312
+ for (let point = 0; point < count; point++) {
313
+ const edge = pointEdges[point];
314
+ const maximum = deaths[edge.parent];
315
+ if (maximum === 0 || !Number.isFinite(edge.lambda)) {
316
+ outlierScores[point] = 0;
317
+ }
318
+ else if (!Number.isFinite(maximum)) {
319
+ // hdbscan 0.8.44 returns NaN for (Infinity - finite) / Infinity.
320
+ // Use the finite perturbation limit so public outputs remain finite.
321
+ outlierScores[point] = 1;
322
+ }
323
+ else {
324
+ outlierScores[point] = (maximum - edge.lambda) / maximum;
325
+ }
326
+ }
327
+ if (probabilities.some((value) => !Number.isFinite(value)) ||
328
+ outlierScores.some((value) => !Number.isFinite(value))) {
329
+ throw new Error("HDBSCAN produced non-finite point scores.");
330
+ }
331
+ return { labels, probabilities, outlierScores };
332
+ }
333
+ /** Match a C float accumulator, including rounding after every addition. */
334
+ function accumulateFloat32(values) {
335
+ let total = 0;
336
+ for (const value of values)
337
+ total = Math.fround(total + value);
338
+ return total;
339
+ }
340
+ function directMaximumLambdas(tree, maximumParent) {
341
+ const deaths = new Float64Array(maximumParent + 1);
342
+ for (const edge of tree) {
343
+ deaths[edge.parent] = Math.max(deaths[edge.parent], edge.lambda);
344
+ }
345
+ return deaths;
346
+ }
@@ -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,105 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = computeCovariance;
7
+ const quoteIdentifier_js_1 = __importDefault(require("./quoteIdentifier.js"));
8
+ const factorCovariance_js_1 = require("./factorCovariance.js");
9
+ async function computeCovariance(connection, input) {
10
+ const { observations, dimensions } = input;
11
+ if (!Number.isSafeInteger(dimensions) || dimensions < 1) {
12
+ throw new Error("Covariance requires at least one feature dimension.");
13
+ }
14
+ if (!Number.isSafeInteger(observations) || observations <= dimensions) {
15
+ 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.`);
16
+ }
17
+ const relation = (0, quoteIdentifier_js_1.default)(input.relation);
18
+ const rowId = (0, quoteIdentifier_js_1.default)(input.rowIdColumn);
19
+ const vector = (0, quoteIdentifier_js_1.default)(input.vectorColumn);
20
+ const expanded = `SELECT r.${rowId} AS observation,
21
+ f.feature::INTEGER AS feature,
22
+ array_extract(r.${vector}, f.feature)::DOUBLE AS value
23
+ FROM ${relation} r CROSS JOIN range(1, ${dimensions + 1}) f(feature)`;
24
+ const offsets = `SELECT observation, feature, value,
25
+ first_value(value) OVER (PARTITION BY feature ORDER BY observation
26
+ ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS origin
27
+ FROM (${expanded})`;
28
+ const meanRows = (await connection.runAndReadAll(`SELECT feature - 1 AS feature, first(origin) AS origin,
29
+ avg(value - origin) AS mean_offset, max(abs(value - origin)) AS magnitude FROM (${offsets})
30
+ GROUP BY feature ORDER BY feature`)).getRowsJS();
31
+ if (meanRows.length !== dimensions) {
32
+ throw new Error("Covariance aggregation returned an incomplete centroid.");
33
+ }
34
+ const magnitudes = new Float64Array(dimensions);
35
+ const means = new Float64Array(dimensions);
36
+ const origins = new Float64Array(dimensions);
37
+ const meanOffsets = new Float64Array(dimensions);
38
+ for (const row of meanRows) {
39
+ const feature = Number(row[0]);
40
+ const origin = Number(row[1]);
41
+ const meanOffset = Number(row[2]);
42
+ if (!Number.isSafeInteger(feature) || !Number.isFinite(origin) ||
43
+ !Number.isFinite(meanOffset)) {
44
+ 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.");
45
+ }
46
+ const magnitude = Number(row[3]);
47
+ if (!Number.isFinite(magnitude) || magnitude <= 0) {
48
+ 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.`);
49
+ }
50
+ magnitudes[feature] = magnitude;
51
+ origins[feature] = origin;
52
+ meanOffsets[feature] = meanOffset;
53
+ means[feature] = origin + meanOffset;
54
+ }
55
+ const covariance = new Float64Array(dimensions * dimensions);
56
+ // covar_samp divides centered cross-products by n - 1. Subtracting a native
57
+ // per-feature anchor first avoids cancellation in E[x*y] - E[x]E[y] and
58
+ // retains small deviations when a feature has a large common offset.
59
+ // Divide by each feature's observed magnitude before accumulating products.
60
+ // Otherwise the n-1 cross-product sum can overflow even when the final sample
61
+ // covariance is finite (e.g. [0, 1e154, 2e154], whose variance is 1e308).
62
+ const result = await connection.stream(`WITH features AS MATERIALIZED (
63
+ SELECT observation, feature, (value - origin) /
64
+ array_extract([${magnitudes.join(",")}]::DOUBLE[${dimensions}], feature) AS value
65
+ FROM (${offsets})
66
+ )
67
+ SELECT a.feature - 1 AS row, b.feature - 1 AS column,
68
+ covar_samp(a.value, b.value) AS covariance
69
+ FROM features a JOIN features b
70
+ ON a.observation = b.observation AND a.feature <= b.feature
71
+ GROUP BY a.feature, b.feature`);
72
+ let values = 0;
73
+ while (true) {
74
+ const chunk = await result.fetchChunk();
75
+ if (!chunk || chunk.rowCount === 0)
76
+ break;
77
+ const rows = new Int32Array(chunk.rowCount);
78
+ const columns = new Int32Array(chunk.rowCount);
79
+ const entries = new Float64Array(chunk.rowCount);
80
+ chunk.visitColumnValues(0, (value, row) => rows[row] = Number(value));
81
+ chunk.visitColumnValues(1, (value, row) => columns[row] = Number(value));
82
+ chunk.visitColumnValues(2, (value, row) => entries[row] = Number(value));
83
+ for (let i = 0; i < chunk.rowCount; i++) {
84
+ const row = rows[i];
85
+ const column = columns[i];
86
+ // Restore units using the larger magnitude first to avoid prematurely
87
+ // underflowing a finite cross-covariance between very different units.
88
+ const value = entries[i] * Math.max(magnitudes[row], magnitudes[column]) *
89
+ Math.min(magnitudes[row], magnitudes[column]);
90
+ covariance[row * dimensions + column] = value;
91
+ covariance[column * dimensions + row] = value;
92
+ values++;
93
+ }
94
+ }
95
+ if (values !== dimensions * (dimensions + 1) / 2) {
96
+ throw new Error("Covariance aggregation returned an incomplete matrix.");
97
+ }
98
+ return {
99
+ ...(0, factorCovariance_js_1.factorCovariance)(covariance, dimensions),
100
+ means,
101
+ origins,
102
+ meanOffsets,
103
+ observations,
104
+ };
105
+ }
@@ -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"}