@nshiab/simple-data-analysis-core 2.0.9 → 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 (453) 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 +2795 -1139
  9. package/esm/class/SimpleTable.d.ts.map +1 -1
  10. package/esm/class/SimpleTable.js +2781 -1149
  11. package/esm/helpers/buildApproximateMutualReachabilityMst.d.ts +45 -0
  12. package/esm/helpers/buildApproximateMutualReachabilityMst.d.ts.map +1 -0
  13. package/esm/helpers/buildApproximateMutualReachabilityMst.js +212 -0
  14. package/esm/helpers/buildChronologicalGraphComponentsSql.d.ts +14 -0
  15. package/esm/helpers/buildChronologicalGraphComponentsSql.d.ts.map +1 -0
  16. package/esm/helpers/buildChronologicalGraphComponentsSql.js +167 -0
  17. package/esm/helpers/buildExactMutualReachabilityMst.d.ts +28 -0
  18. package/esm/helpers/buildExactMutualReachabilityMst.d.ts.map +1 -0
  19. package/esm/helpers/buildExactMutualReachabilityMst.js +97 -0
  20. package/esm/helpers/buildGraphTemporalCostStateSql.d.ts +12 -0
  21. package/esm/helpers/buildGraphTemporalCostStateSql.d.ts.map +1 -0
  22. package/esm/helpers/buildGraphTemporalCostStateSql.js +86 -0
  23. package/esm/helpers/buildGraphTemporalReachabilitySql.d.ts +13 -0
  24. package/esm/helpers/buildGraphTemporalReachabilitySql.d.ts.map +1 -0
  25. package/esm/helpers/buildGraphTemporalReachabilitySql.js +70 -0
  26. package/esm/helpers/buildSparseMutualReachabilityMst.d.ts +10 -0
  27. package/esm/helpers/buildSparseMutualReachabilityMst.d.ts.map +1 -0
  28. package/esm/helpers/buildSparseMutualReachabilityMst.js +47 -0
  29. package/esm/helpers/buildUmapGraph.d.ts +2 -5
  30. package/esm/helpers/buildUmapGraph.d.ts.map +1 -1
  31. package/esm/helpers/buildUmapGraph.js +6 -100
  32. package/esm/helpers/buildVectorNeighbors.d.ts +45 -0
  33. package/esm/helpers/buildVectorNeighbors.d.ts.map +1 -0
  34. package/esm/helpers/buildVectorNeighbors.js +170 -0
  35. package/esm/helpers/buildWeakGraphComponentsSql.d.ts +3 -0
  36. package/esm/helpers/buildWeakGraphComponentsSql.d.ts.map +1 -0
  37. package/esm/helpers/buildWeakGraphComponentsSql.js +32 -0
  38. package/esm/helpers/camelCase.d.ts +7 -5
  39. package/esm/helpers/camelCase.d.ts.map +1 -1
  40. package/esm/helpers/camelCase.js +7 -5
  41. package/esm/helpers/capitalize.d.ts +6 -4
  42. package/esm/helpers/capitalize.d.ts.map +1 -1
  43. package/esm/helpers/capitalize.js +6 -4
  44. package/esm/helpers/clusterHdbscan.d.ts +18 -0
  45. package/esm/helpers/clusterHdbscan.d.ts.map +1 -0
  46. package/esm/helpers/clusterHdbscan.js +342 -0
  47. package/esm/helpers/computeCovariance.d.ts +16 -0
  48. package/esm/helpers/computeCovariance.d.ts.map +1 -0
  49. package/esm/helpers/computeCovariance.js +99 -0
  50. package/esm/helpers/computeMahalanobisDistances.d.ts +14 -0
  51. package/esm/helpers/computeMahalanobisDistances.d.ts.map +1 -0
  52. package/esm/helpers/computeMahalanobisDistances.js +87 -0
  53. package/esm/helpers/createDirectory.d.ts +4 -3
  54. package/esm/helpers/createDirectory.d.ts.map +1 -1
  55. package/esm/helpers/createDirectory.js +4 -3
  56. package/esm/helpers/dataToArrays.d.ts +6 -4
  57. package/esm/helpers/dataToArrays.d.ts.map +1 -1
  58. package/esm/helpers/dataToArrays.js +6 -4
  59. package/esm/helpers/extractTypes.d.ts +1 -1
  60. package/esm/helpers/extractTypes.js +4 -9
  61. package/esm/helpers/factorCovariance.d.ts +17 -0
  62. package/esm/helpers/factorCovariance.d.ts.map +1 -0
  63. package/esm/helpers/factorCovariance.js +189 -0
  64. package/esm/helpers/findGeoColumn.d.ts +6 -4
  65. package/esm/helpers/findGeoColumn.d.ts.map +1 -1
  66. package/esm/helpers/findGeoColumn.js +6 -4
  67. package/esm/helpers/findGeoColumnFromSchema.d.ts +8 -5
  68. package/esm/helpers/findGeoColumnFromSchema.d.ts.map +1 -1
  69. package/esm/helpers/findGeoColumnFromSchema.js +8 -5
  70. package/esm/helpers/formatDate.d.ts +12 -6
  71. package/esm/helpers/formatDate.d.ts.map +1 -1
  72. package/esm/helpers/formatDate.js +12 -6
  73. package/esm/helpers/formatMissingTables.d.ts +8 -5
  74. package/esm/helpers/formatMissingTables.d.ts.map +1 -1
  75. package/esm/helpers/formatMissingTables.js +8 -5
  76. package/esm/helpers/formatNumber.d.ts +19 -10
  77. package/esm/helpers/formatNumber.d.ts.map +1 -1
  78. package/esm/helpers/formatNumber.js +32 -17
  79. package/esm/helpers/getGraphEdgeIdColumn.d.ts +9 -0
  80. package/esm/helpers/getGraphEdgeIdColumn.d.ts.map +1 -0
  81. package/esm/helpers/getGraphEdgeIdColumn.js +25 -0
  82. package/esm/helpers/getGraphEndpointColumns.d.ts +11 -0
  83. package/esm/helpers/getGraphEndpointColumns.d.ts.map +1 -0
  84. package/esm/helpers/getGraphEndpointColumns.js +160 -0
  85. package/esm/helpers/getGraphWeightColumn.d.ts +10 -0
  86. package/esm/helpers/getGraphWeightColumn.d.ts.map +1 -0
  87. package/esm/helpers/getGraphWeightColumn.js +40 -0
  88. package/esm/helpers/graphRouteResultSchema.d.ts +4 -0
  89. package/esm/helpers/graphRouteResultSchema.d.ts.map +1 -0
  90. package/esm/helpers/graphRouteResultSchema.js +12 -0
  91. package/esm/helpers/graphRouteResultSelect.d.ts +4 -0
  92. package/esm/helpers/graphRouteResultSelect.d.ts.map +1 -0
  93. package/esm/helpers/graphRouteResultSelect.js +22 -0
  94. package/esm/helpers/hasGeometryColumn.d.ts +4 -3
  95. package/esm/helpers/hasGeometryColumn.d.ts.map +1 -1
  96. package/esm/helpers/hasGeometryColumn.js +4 -3
  97. package/esm/helpers/inspectGraphConnectivity.d.ts +10 -0
  98. package/esm/helpers/inspectGraphConnectivity.d.ts.map +1 -0
  99. package/esm/helpers/inspectGraphConnectivity.js +55 -0
  100. package/esm/helpers/mergeOptions.d.ts +24 -13
  101. package/esm/helpers/mergeOptions.d.ts.map +1 -1
  102. package/esm/helpers/mergeOptions.js +24 -13
  103. package/esm/helpers/parseValue.d.ts +6 -4
  104. package/esm/helpers/parseValue.d.ts.map +1 -1
  105. package/esm/helpers/parseValue.js +6 -4
  106. package/esm/helpers/prepareGraphRouteSql.d.ts +31 -0
  107. package/esm/helpers/prepareGraphRouteSql.d.ts.map +1 -0
  108. package/esm/helpers/prepareGraphRouteSql.js +86 -0
  109. package/esm/helpers/prepareGraphStarts.d.ts +9 -0
  110. package/esm/helpers/prepareGraphStarts.d.ts.map +1 -0
  111. package/esm/helpers/prepareGraphStarts.js +68 -0
  112. package/esm/helpers/prepareGraphTemporalSql.d.ts +28 -0
  113. package/esm/helpers/prepareGraphTemporalSql.d.ts.map +1 -0
  114. package/esm/helpers/prepareGraphTemporalSql.js +154 -0
  115. package/esm/helpers/prepareGraphTraversal.d.ts +19 -0
  116. package/esm/helpers/prepareGraphTraversal.d.ts.map +1 -0
  117. package/esm/helpers/prepareGraphTraversal.js +79 -0
  118. package/esm/helpers/prepareNumericFeatures.d.ts +41 -0
  119. package/esm/helpers/prepareNumericFeatures.d.ts.map +1 -0
  120. package/esm/helpers/prepareNumericFeatures.js +210 -0
  121. package/esm/helpers/prettyDuration.d.ts +14 -8
  122. package/esm/helpers/prettyDuration.d.ts.map +1 -1
  123. package/esm/helpers/prettyDuration.js +14 -8
  124. package/esm/helpers/printTable.d.ts +18 -13
  125. package/esm/helpers/printTable.d.ts.map +1 -1
  126. package/esm/helpers/printTable.js +18 -13
  127. package/esm/helpers/publishPreparedColumns.d.ts +37 -0
  128. package/esm/helpers/publishPreparedColumns.d.ts.map +1 -0
  129. package/esm/helpers/publishPreparedColumns.js +113 -0
  130. package/esm/helpers/queryDB.d.ts +24 -13
  131. package/esm/helpers/queryDB.d.ts.map +1 -1
  132. package/esm/helpers/queryDB.js +24 -13
  133. package/esm/helpers/queueAsyncBarrier.d.ts +12 -7
  134. package/esm/helpers/queueAsyncBarrier.d.ts.map +1 -1
  135. package/esm/helpers/queueAsyncBarrier.js +12 -7
  136. package/esm/helpers/queueGraphResult.d.ts +18 -0
  137. package/esm/helpers/queueGraphResult.d.ts.map +1 -0
  138. package/esm/helpers/queueGraphResult.js +39 -0
  139. package/esm/helpers/quoteIdentifier.d.ts +4 -3
  140. package/esm/helpers/quoteIdentifier.d.ts.map +1 -1
  141. package/esm/helpers/quoteIdentifier.js +4 -3
  142. package/esm/helpers/quoteQualifiedIdentifier.d.ts +6 -4
  143. package/esm/helpers/quoteQualifiedIdentifier.d.ts.map +1 -1
  144. package/esm/helpers/quoteQualifiedIdentifier.js +6 -4
  145. package/esm/helpers/runQuery.d.ts.map +1 -1
  146. package/esm/helpers/runQuery.js +17 -3
  147. package/esm/helpers/selectFuzzyReplacements.d.ts +11 -0
  148. package/esm/helpers/selectFuzzyReplacements.d.ts.map +1 -0
  149. package/esm/helpers/selectFuzzyReplacements.js +124 -0
  150. package/esm/helpers/stabilizeCosineVectors.d.ts +14 -0
  151. package/esm/helpers/stabilizeCosineVectors.d.ts.map +1 -0
  152. package/esm/helpers/stabilizeCosineVectors.js +34 -0
  153. package/esm/helpers/stringToArray.d.ts +4 -3
  154. package/esm/helpers/stringToArray.d.ts.map +1 -1
  155. package/esm/helpers/stringToArray.js +4 -3
  156. package/esm/helpers/updateColumnsWithJS.d.ts +12 -6
  157. package/esm/helpers/updateColumnsWithJS.d.ts.map +1 -1
  158. package/esm/helpers/updateColumnsWithJS.js +12 -6
  159. package/esm/helpers/validateGraphRouteResultSchema.d.ts +4 -0
  160. package/esm/helpers/validateGraphRouteResultSchema.d.ts.map +1 -0
  161. package/esm/helpers/validateGraphRouteResultSchema.js +13 -0
  162. package/esm/helpers/validateGraphTemporalEvents.d.ts +7 -0
  163. package/esm/helpers/validateGraphTemporalEvents.d.ts.map +1 -0
  164. package/esm/helpers/validateGraphTemporalEvents.js +47 -0
  165. package/esm/helpers/validateNumericalAnalysis.d.ts +10 -6
  166. package/esm/helpers/validateNumericalAnalysis.d.ts.map +1 -1
  167. package/esm/helpers/validateNumericalAnalysis.js +10 -6
  168. package/esm/helpers/validateVectorRowIds.d.ts +4 -0
  169. package/esm/helpers/validateVectorRowIds.d.ts.map +1 -0
  170. package/esm/helpers/validateVectorRowIds.js +16 -0
  171. package/esm/helpers/vectorDistanceExpression.d.ts +6 -0
  172. package/esm/helpers/vectorDistanceExpression.d.ts.map +1 -0
  173. package/esm/helpers/vectorDistanceExpression.js +11 -0
  174. package/esm/helpers/wrapString.d.ts +10 -7
  175. package/esm/helpers/wrapString.d.ts.map +1 -1
  176. package/esm/helpers/wrapString.js +10 -7
  177. package/esm/methods/addId.d.ts +5 -0
  178. package/esm/methods/addId.d.ts.map +1 -0
  179. package/esm/methods/addId.js +38 -0
  180. package/esm/methods/commonNeighbors.d.ts +10 -0
  181. package/esm/methods/commonNeighbors.d.ts.map +1 -0
  182. package/esm/methods/commonNeighbors.js +101 -0
  183. package/esm/methods/connectedComponents.d.ts +9 -0
  184. package/esm/methods/connectedComponents.d.ts.map +1 -0
  185. package/esm/methods/connectedComponents.js +147 -0
  186. package/esm/methods/degree.d.ts +9 -0
  187. package/esm/methods/degree.d.ts.map +1 -0
  188. package/esm/methods/degree.js +135 -0
  189. package/esm/methods/distances.d.ts +12 -0
  190. package/esm/methods/distances.d.ts.map +1 -0
  191. package/esm/methods/distances.js +164 -0
  192. package/esm/methods/findCycles.d.ts +12 -0
  193. package/esm/methods/findCycles.d.ts.map +1 -0
  194. package/esm/methods/findCycles.js +330 -0
  195. package/esm/methods/fuzzyClean.d.ts.map +1 -1
  196. package/esm/methods/fuzzyClean.js +17 -136
  197. package/esm/methods/fuzzyJoin.js +70 -16
  198. package/esm/methods/getTypes.d.ts +1 -1
  199. package/esm/methods/hdbscan.d.ts +5 -0
  200. package/esm/methods/hdbscan.d.ts.map +1 -0
  201. package/esm/methods/hdbscan.js +208 -0
  202. package/esm/methods/mahalanobis.d.ts +5 -0
  203. package/esm/methods/mahalanobis.d.ts.map +1 -0
  204. package/esm/methods/mahalanobis.js +92 -0
  205. package/esm/methods/neighbors.d.ts +9 -0
  206. package/esm/methods/neighbors.d.ts.map +1 -0
  207. package/esm/methods/neighbors.js +81 -0
  208. package/esm/methods/normalizeVector.d.ts +5 -0
  209. package/esm/methods/normalizeVector.d.ts.map +1 -0
  210. package/esm/methods/normalizeVector.js +132 -0
  211. package/esm/methods/paths.d.ts +12 -0
  212. package/esm/methods/paths.d.ts.map +1 -0
  213. package/esm/methods/paths.js +287 -0
  214. package/esm/methods/reachable.d.ts +11 -0
  215. package/esm/methods/reachable.d.ts.map +1 -0
  216. package/esm/methods/reachable.js +131 -0
  217. package/esm/methods/rowToVector.d.ts +5 -0
  218. package/esm/methods/rowToVector.d.ts.map +1 -0
  219. package/esm/methods/rowToVector.js +77 -0
  220. package/esm/methods/shortestPath.d.ts +12 -0
  221. package/esm/methods/shortestPath.d.ts.map +1 -0
  222. package/esm/methods/shortestPath.js +337 -0
  223. package/esm/methods/topologicalSort.d.ts +7 -0
  224. package/esm/methods/topologicalSort.d.ts.map +1 -0
  225. package/esm/methods/topologicalSort.js +164 -0
  226. package/llm.md +2106 -143
  227. package/llms.txt +1 -1
  228. package/package.json +1 -1
  229. package/script/class/SDAError.d.ts +6 -6
  230. package/script/class/SDAError.js +6 -6
  231. package/script/class/Simple.d.ts +9 -9
  232. package/script/class/Simple.js +9 -9
  233. package/script/class/SimpleDB.d.ts +80 -76
  234. package/script/class/SimpleDB.d.ts.map +1 -1
  235. package/script/class/SimpleDB.js +80 -76
  236. package/script/class/SimpleTable.d.ts +2795 -1139
  237. package/script/class/SimpleTable.d.ts.map +1 -1
  238. package/script/class/SimpleTable.js +2781 -1149
  239. package/script/helpers/buildApproximateMutualReachabilityMst.d.ts +45 -0
  240. package/script/helpers/buildApproximateMutualReachabilityMst.d.ts.map +1 -0
  241. package/script/helpers/buildApproximateMutualReachabilityMst.js +219 -0
  242. package/script/helpers/buildChronologicalGraphComponentsSql.d.ts +14 -0
  243. package/script/helpers/buildChronologicalGraphComponentsSql.d.ts.map +1 -0
  244. package/script/helpers/buildChronologicalGraphComponentsSql.js +174 -0
  245. package/script/helpers/buildExactMutualReachabilityMst.d.ts +28 -0
  246. package/script/helpers/buildExactMutualReachabilityMst.d.ts.map +1 -0
  247. package/script/helpers/buildExactMutualReachabilityMst.js +103 -0
  248. package/script/helpers/buildGraphTemporalCostStateSql.d.ts +12 -0
  249. package/script/helpers/buildGraphTemporalCostStateSql.d.ts.map +1 -0
  250. package/script/helpers/buildGraphTemporalCostStateSql.js +92 -0
  251. package/script/helpers/buildGraphTemporalReachabilitySql.d.ts +13 -0
  252. package/script/helpers/buildGraphTemporalReachabilitySql.d.ts.map +1 -0
  253. package/script/helpers/buildGraphTemporalReachabilitySql.js +76 -0
  254. package/script/helpers/buildSparseMutualReachabilityMst.d.ts +10 -0
  255. package/script/helpers/buildSparseMutualReachabilityMst.d.ts.map +1 -0
  256. package/script/helpers/buildSparseMutualReachabilityMst.js +50 -0
  257. package/script/helpers/buildUmapGraph.d.ts +2 -5
  258. package/script/helpers/buildUmapGraph.d.ts.map +1 -1
  259. package/script/helpers/buildUmapGraph.js +6 -100
  260. package/script/helpers/buildVectorNeighbors.d.ts +45 -0
  261. package/script/helpers/buildVectorNeighbors.d.ts.map +1 -0
  262. package/script/helpers/buildVectorNeighbors.js +176 -0
  263. package/script/helpers/buildWeakGraphComponentsSql.d.ts +3 -0
  264. package/script/helpers/buildWeakGraphComponentsSql.d.ts.map +1 -0
  265. package/script/helpers/buildWeakGraphComponentsSql.js +38 -0
  266. package/script/helpers/camelCase.d.ts +7 -5
  267. package/script/helpers/camelCase.d.ts.map +1 -1
  268. package/script/helpers/camelCase.js +7 -5
  269. package/script/helpers/capitalize.d.ts +6 -4
  270. package/script/helpers/capitalize.d.ts.map +1 -1
  271. package/script/helpers/capitalize.js +6 -4
  272. package/script/helpers/clusterHdbscan.d.ts +18 -0
  273. package/script/helpers/clusterHdbscan.d.ts.map +1 -0
  274. package/script/helpers/clusterHdbscan.js +346 -0
  275. package/script/helpers/computeCovariance.d.ts +16 -0
  276. package/script/helpers/computeCovariance.d.ts.map +1 -0
  277. package/script/helpers/computeCovariance.js +105 -0
  278. package/script/helpers/computeMahalanobisDistances.d.ts +14 -0
  279. package/script/helpers/computeMahalanobisDistances.d.ts.map +1 -0
  280. package/script/helpers/computeMahalanobisDistances.js +93 -0
  281. package/script/helpers/createDirectory.d.ts +4 -3
  282. package/script/helpers/createDirectory.d.ts.map +1 -1
  283. package/script/helpers/createDirectory.js +4 -3
  284. package/script/helpers/dataToArrays.d.ts +6 -4
  285. package/script/helpers/dataToArrays.d.ts.map +1 -1
  286. package/script/helpers/dataToArrays.js +6 -4
  287. package/script/helpers/extractTypes.d.ts +1 -1
  288. package/script/helpers/extractTypes.js +4 -9
  289. package/script/helpers/factorCovariance.d.ts +17 -0
  290. package/script/helpers/factorCovariance.d.ts.map +1 -0
  291. package/script/helpers/factorCovariance.js +194 -0
  292. package/script/helpers/findGeoColumn.d.ts +6 -4
  293. package/script/helpers/findGeoColumn.d.ts.map +1 -1
  294. package/script/helpers/findGeoColumn.js +6 -4
  295. package/script/helpers/findGeoColumnFromSchema.d.ts +8 -5
  296. package/script/helpers/findGeoColumnFromSchema.d.ts.map +1 -1
  297. package/script/helpers/findGeoColumnFromSchema.js +8 -5
  298. package/script/helpers/formatDate.d.ts +12 -6
  299. package/script/helpers/formatDate.d.ts.map +1 -1
  300. package/script/helpers/formatDate.js +12 -6
  301. package/script/helpers/formatMissingTables.d.ts +8 -5
  302. package/script/helpers/formatMissingTables.d.ts.map +1 -1
  303. package/script/helpers/formatMissingTables.js +8 -5
  304. package/script/helpers/formatNumber.d.ts +19 -10
  305. package/script/helpers/formatNumber.d.ts.map +1 -1
  306. package/script/helpers/formatNumber.js +32 -17
  307. package/script/helpers/getGraphEdgeIdColumn.d.ts +9 -0
  308. package/script/helpers/getGraphEdgeIdColumn.d.ts.map +1 -0
  309. package/script/helpers/getGraphEdgeIdColumn.js +31 -0
  310. package/script/helpers/getGraphEndpointColumns.d.ts +11 -0
  311. package/script/helpers/getGraphEndpointColumns.d.ts.map +1 -0
  312. package/script/helpers/getGraphEndpointColumns.js +166 -0
  313. package/script/helpers/getGraphWeightColumn.d.ts +10 -0
  314. package/script/helpers/getGraphWeightColumn.d.ts.map +1 -0
  315. package/script/helpers/getGraphWeightColumn.js +46 -0
  316. package/script/helpers/graphRouteResultSchema.d.ts +4 -0
  317. package/script/helpers/graphRouteResultSchema.d.ts.map +1 -0
  318. package/script/helpers/graphRouteResultSchema.js +18 -0
  319. package/script/helpers/graphRouteResultSelect.d.ts +4 -0
  320. package/script/helpers/graphRouteResultSelect.d.ts.map +1 -0
  321. package/script/helpers/graphRouteResultSelect.js +28 -0
  322. package/script/helpers/hasGeometryColumn.d.ts +4 -3
  323. package/script/helpers/hasGeometryColumn.d.ts.map +1 -1
  324. package/script/helpers/hasGeometryColumn.js +4 -3
  325. package/script/helpers/inspectGraphConnectivity.d.ts +10 -0
  326. package/script/helpers/inspectGraphConnectivity.d.ts.map +1 -0
  327. package/script/helpers/inspectGraphConnectivity.js +58 -0
  328. package/script/helpers/mergeOptions.d.ts +24 -13
  329. package/script/helpers/mergeOptions.d.ts.map +1 -1
  330. package/script/helpers/mergeOptions.js +24 -13
  331. package/script/helpers/parseValue.d.ts +6 -4
  332. package/script/helpers/parseValue.d.ts.map +1 -1
  333. package/script/helpers/parseValue.js +6 -4
  334. package/script/helpers/prepareGraphRouteSql.d.ts +31 -0
  335. package/script/helpers/prepareGraphRouteSql.d.ts.map +1 -0
  336. package/script/helpers/prepareGraphRouteSql.js +127 -0
  337. package/script/helpers/prepareGraphStarts.d.ts +9 -0
  338. package/script/helpers/prepareGraphStarts.d.ts.map +1 -0
  339. package/script/helpers/prepareGraphStarts.js +71 -0
  340. package/script/helpers/prepareGraphTemporalSql.d.ts +28 -0
  341. package/script/helpers/prepareGraphTemporalSql.d.ts.map +1 -0
  342. package/script/helpers/prepareGraphTemporalSql.js +161 -0
  343. package/script/helpers/prepareGraphTraversal.d.ts +19 -0
  344. package/script/helpers/prepareGraphTraversal.d.ts.map +1 -0
  345. package/script/helpers/prepareGraphTraversal.js +87 -0
  346. package/script/helpers/prepareNumericFeatures.d.ts +41 -0
  347. package/script/helpers/prepareNumericFeatures.d.ts.map +1 -0
  348. package/script/helpers/prepareNumericFeatures.js +217 -0
  349. package/script/helpers/prettyDuration.d.ts +14 -8
  350. package/script/helpers/prettyDuration.d.ts.map +1 -1
  351. package/script/helpers/prettyDuration.js +14 -8
  352. package/script/helpers/printTable.d.ts +18 -13
  353. package/script/helpers/printTable.d.ts.map +1 -1
  354. package/script/helpers/printTable.js +18 -13
  355. package/script/helpers/publishPreparedColumns.d.ts +37 -0
  356. package/script/helpers/publishPreparedColumns.d.ts.map +1 -0
  357. package/script/helpers/publishPreparedColumns.js +119 -0
  358. package/script/helpers/queryDB.d.ts +24 -13
  359. package/script/helpers/queryDB.d.ts.map +1 -1
  360. package/script/helpers/queryDB.js +24 -13
  361. package/script/helpers/queueAsyncBarrier.d.ts +12 -7
  362. package/script/helpers/queueAsyncBarrier.d.ts.map +1 -1
  363. package/script/helpers/queueAsyncBarrier.js +12 -7
  364. package/script/helpers/queueGraphResult.d.ts +18 -0
  365. package/script/helpers/queueGraphResult.d.ts.map +1 -0
  366. package/script/helpers/queueGraphResult.js +45 -0
  367. package/script/helpers/quoteIdentifier.d.ts +4 -3
  368. package/script/helpers/quoteIdentifier.d.ts.map +1 -1
  369. package/script/helpers/quoteIdentifier.js +4 -3
  370. package/script/helpers/quoteQualifiedIdentifier.d.ts +6 -4
  371. package/script/helpers/quoteQualifiedIdentifier.d.ts.map +1 -1
  372. package/script/helpers/quoteQualifiedIdentifier.js +6 -4
  373. package/script/helpers/runQuery.d.ts.map +1 -1
  374. package/script/helpers/runQuery.js +17 -3
  375. package/script/helpers/selectFuzzyReplacements.d.ts +11 -0
  376. package/script/helpers/selectFuzzyReplacements.d.ts.map +1 -0
  377. package/script/helpers/selectFuzzyReplacements.js +127 -0
  378. package/script/helpers/stabilizeCosineVectors.d.ts +14 -0
  379. package/script/helpers/stabilizeCosineVectors.d.ts.map +1 -0
  380. package/script/helpers/stabilizeCosineVectors.js +40 -0
  381. package/script/helpers/stringToArray.d.ts +4 -3
  382. package/script/helpers/stringToArray.d.ts.map +1 -1
  383. package/script/helpers/stringToArray.js +4 -3
  384. package/script/helpers/updateColumnsWithJS.d.ts +12 -6
  385. package/script/helpers/updateColumnsWithJS.d.ts.map +1 -1
  386. package/script/helpers/updateColumnsWithJS.js +12 -6
  387. package/script/helpers/validateGraphRouteResultSchema.d.ts +4 -0
  388. package/script/helpers/validateGraphRouteResultSchema.d.ts.map +1 -0
  389. package/script/helpers/validateGraphRouteResultSchema.js +19 -0
  390. package/script/helpers/validateGraphTemporalEvents.d.ts +7 -0
  391. package/script/helpers/validateGraphTemporalEvents.d.ts.map +1 -0
  392. package/script/helpers/validateGraphTemporalEvents.js +53 -0
  393. package/script/helpers/validateNumericalAnalysis.d.ts +10 -6
  394. package/script/helpers/validateNumericalAnalysis.d.ts.map +1 -1
  395. package/script/helpers/validateNumericalAnalysis.js +10 -6
  396. package/script/helpers/validateVectorRowIds.d.ts +4 -0
  397. package/script/helpers/validateVectorRowIds.d.ts.map +1 -0
  398. package/script/helpers/validateVectorRowIds.js +19 -0
  399. package/script/helpers/vectorDistanceExpression.d.ts +6 -0
  400. package/script/helpers/vectorDistanceExpression.d.ts.map +1 -0
  401. package/script/helpers/vectorDistanceExpression.js +14 -0
  402. package/script/helpers/wrapString.d.ts +10 -7
  403. package/script/helpers/wrapString.d.ts.map +1 -1
  404. package/script/helpers/wrapString.js +10 -7
  405. package/script/methods/addId.d.ts +5 -0
  406. package/script/methods/addId.d.ts.map +1 -0
  407. package/script/methods/addId.js +44 -0
  408. package/script/methods/commonNeighbors.d.ts +10 -0
  409. package/script/methods/commonNeighbors.d.ts.map +1 -0
  410. package/script/methods/commonNeighbors.js +140 -0
  411. package/script/methods/connectedComponents.d.ts +9 -0
  412. package/script/methods/connectedComponents.d.ts.map +1 -0
  413. package/script/methods/connectedComponents.js +186 -0
  414. package/script/methods/degree.d.ts +9 -0
  415. package/script/methods/degree.d.ts.map +1 -0
  416. package/script/methods/degree.js +141 -0
  417. package/script/methods/distances.d.ts +12 -0
  418. package/script/methods/distances.d.ts.map +1 -0
  419. package/script/methods/distances.js +203 -0
  420. package/script/methods/findCycles.d.ts +12 -0
  421. package/script/methods/findCycles.d.ts.map +1 -0
  422. package/script/methods/findCycles.js +369 -0
  423. package/script/methods/fuzzyClean.d.ts.map +1 -1
  424. package/script/methods/fuzzyClean.js +17 -136
  425. package/script/methods/fuzzyJoin.js +70 -16
  426. package/script/methods/getTypes.d.ts +1 -1
  427. package/script/methods/hdbscan.d.ts +5 -0
  428. package/script/methods/hdbscan.d.ts.map +1 -0
  429. package/script/methods/hdbscan.js +214 -0
  430. package/script/methods/mahalanobis.d.ts +5 -0
  431. package/script/methods/mahalanobis.d.ts.map +1 -0
  432. package/script/methods/mahalanobis.js +98 -0
  433. package/script/methods/neighbors.d.ts +9 -0
  434. package/script/methods/neighbors.d.ts.map +1 -0
  435. package/script/methods/neighbors.js +120 -0
  436. package/script/methods/normalizeVector.d.ts +5 -0
  437. package/script/methods/normalizeVector.d.ts.map +1 -0
  438. package/script/methods/normalizeVector.js +138 -0
  439. package/script/methods/paths.d.ts +12 -0
  440. package/script/methods/paths.d.ts.map +1 -0
  441. package/script/methods/paths.js +326 -0
  442. package/script/methods/reachable.d.ts +11 -0
  443. package/script/methods/reachable.d.ts.map +1 -0
  444. package/script/methods/reachable.js +170 -0
  445. package/script/methods/rowToVector.d.ts +5 -0
  446. package/script/methods/rowToVector.d.ts.map +1 -0
  447. package/script/methods/rowToVector.js +83 -0
  448. package/script/methods/shortestPath.d.ts +12 -0
  449. package/script/methods/shortestPath.d.ts.map +1 -0
  450. package/script/methods/shortestPath.js +376 -0
  451. package/script/methods/topologicalSort.d.ts +7 -0
  452. package/script/methods/topologicalSort.d.ts.map +1 -0
  453. package/script/methods/topologicalSort.js +170 -0
@@ -0,0 +1,92 @@
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 = buildGraphTemporalCostStateSql;
7
+ const quoteIdentifier_js_1 = __importDefault(require("./quoteIdentifier.js"));
8
+ /** Builds keyed best-cost chronological states from an arbitrary start relation. */
9
+ function buildGraphTemporalCostStateSql(prepared, startsSelect, direction, temporal, distanceType, edgeWeight, eventSelections = []) {
10
+ const q = quoteIdentifier_js_1.default;
11
+ const relations = prepared.relationNames([
12
+ "graph_starts",
13
+ "graph_temporal_settings",
14
+ "graph_event_rows",
15
+ "graph_edges",
16
+ "graph_cost_states",
17
+ ]);
18
+ const startsRelation = relations.graph_starts;
19
+ const settingsRelation = relations.graph_temporal_settings;
20
+ const eventRowsRelation = relations.graph_event_rows;
21
+ const edgesRelation = relations.graph_edges;
22
+ const costRelation = relations.graph_cost_states;
23
+ const start = `${q("starts")}.${q("start")}`;
24
+ const startKey = `${q("starts")}.${q("__key")}`;
25
+ const reachedStart = `${q("reached")}.${q("start")}`;
26
+ const reachedStartKey = `${q("reached")}.${q("__start_key")}`;
27
+ const reachedNodeKey = `${q("reached")}.${q("__node_key")}`;
28
+ const reachedDistance = `${q("reached")}.${q("distance")}`;
29
+ const edgeTo = `${q("edges")}.${q("__to")}`;
30
+ const edgeToKey = `${q("edges")}.${q("__to_key")}`;
31
+ const edgeFromKey = `${q("edges")}.${q("__from_key")}`;
32
+ const eventId = `${q("edges")}.${q("__event_id")}`;
33
+ const eventStart = `${q("edges")}.${q("__event_start")}`;
34
+ const eventEnd = `${q("edges")}.${q("__event_end")}`;
35
+ const edgeCost = `${q("edges")}.${q("__weight")}`;
36
+ const bestDistance = `${q("best")}.${q("distance")}`;
37
+ const gap = `${q("settings")}.${q("__gap")}`;
38
+ const candidateDistance = `CAST(${reachedDistance} + ${edgeCost} AS ${distanceType})`;
39
+ const resolvedStartsSelect = typeof startsSelect === "string"
40
+ ? startsSelect
41
+ : startsSelect(edgesRelation);
42
+ // Only costs for the same start and physical event can dominate each other.
43
+ // Strict improvements and non-negative weights terminate even zero-cost cycles.
44
+ return {
45
+ costRelation,
46
+ edgesRelation,
47
+ settingsRelation,
48
+ startsRelation,
49
+ withClause: `WITH RECURSIVE ${settingsRelation} AS MATERIALIZED (
50
+ SELECT CAST(? AS HUGEINT) AS ${q("__gap")}
51
+ ), ${eventRowsRelation} AS MATERIALIZED (
52
+ ${prepared.edges(direction, [
53
+ `${edgeWeight} AS ${q("__weight")}`,
54
+ ...eventSelections,
55
+ ...temporal.eventSelections("edges"),
56
+ ])}
57
+ ), ${edgesRelation} AS MATERIALIZED (
58
+ SELECT *
59
+ FROM ${eventRowsRelation} AS ${q("events")}
60
+ WHERE ${temporal.eventValidity("events")}
61
+ ), ${startsRelation} AS MATERIALIZED (
62
+ ${resolvedStartsSelect}
63
+ ), ${costRelation}(
64
+ ${q("start")}, ${q("node")},
65
+ ${q("__start_key")}, ${q("__node_key")},
66
+ ${q("__event_id")}, ${q("__event_start")}, ${q("__event_end")},
67
+ ${q("distance")}
68
+ ) USING KEY(${q("__start_key")}, ${q("__event_id")}) AS (
69
+ SELECT ${start}, ${edgeTo}, ${startKey}, ${edgeToKey},
70
+ ${eventId}, ${eventStart}, ${eventEnd}, ${edgeCost}
71
+ FROM ${startsRelation} AS ${q("starts")}
72
+ INNER JOIN ${edgesRelation} AS ${q("edges")}
73
+ ON ${startKey} = ${edgeFromKey}
74
+ UNION
75
+ SELECT ${reachedStart}, ${edgeTo}, ${reachedStartKey}, ${edgeToKey},
76
+ ${eventId}, ${eventStart}, ${eventEnd},
77
+ MIN(${candidateDistance}) AS ${q("distance")}
78
+ FROM ${costRelation} AS ${q("reached")}
79
+ INNER JOIN ${edgesRelation} AS ${q("edges")}
80
+ ON ${reachedNodeKey} = ${edgeFromKey}
81
+ CROSS JOIN ${settingsRelation} AS ${q("settings")}
82
+ LEFT JOIN recurring.${costRelation} AS ${q("best")}
83
+ ON ${reachedStartKey} = ${q("best")}.${q("__start_key")}
84
+ AND ${eventId} = ${q("best")}.${q("__event_id")}
85
+ WHERE ${temporal.transition("reached", "edges", direction, gap)}
86
+ GROUP BY ${reachedStart}, ${edgeTo}, ${reachedStartKey}, ${edgeToKey},
87
+ ${eventId}, ${eventStart}, ${eventEnd}, ${bestDistance}
88
+ HAVING ${bestDistance} IS NULL OR
89
+ MIN(${candidateDistance}) < ${bestDistance}
90
+ )`,
91
+ };
92
+ }
@@ -0,0 +1,13 @@
1
+ import type { PreparedGraphTemporalSql } from "./prepareGraphTemporalSql.js";
2
+ import type { GraphDirection, PreparedGraphSql } from "./prepareGraphTraversal.js";
3
+ export type GraphTemporalReachabilitySql = {
4
+ edgesRelation: string;
5
+ reachableRelation: string;
6
+ withClause: string;
7
+ };
8
+ /**
9
+ * Builds reusable chronological reachability CTEs from a start relation.
10
+ * A callback may derive all-node starts from the materialized valid edges.
11
+ */
12
+ export default function buildGraphTemporalReachabilitySql(prepared: PreparedGraphSql, startsSelect: string | ((validEdgesRelation: string) => string), direction: Exclude<GraphDirection, "both">, temporal: PreparedGraphTemporalSql): GraphTemporalReachabilitySql;
13
+ //# sourceMappingURL=buildGraphTemporalReachabilitySql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildGraphTemporalReachabilitySql.d.ts","sourceRoot":"","sources":["../../src/helpers/buildGraphTemporalReachabilitySql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AAGpC,MAAM,MAAM,4BAA4B,GAAG;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,iCAAiC,CACvD,QAAQ,EAAE,gBAAgB,EAC1B,YAAY,EAAE,MAAM,GAAG,CAAC,CAAC,kBAAkB,EAAE,MAAM,KAAK,MAAM,CAAC,EAC/D,SAAS,EAAE,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,EAC1C,QAAQ,EAAE,wBAAwB,GACjC,4BAA4B,CAiE9B"}
@@ -0,0 +1,76 @@
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 = buildGraphTemporalReachabilitySql;
7
+ const quoteIdentifier_js_1 = __importDefault(require("./quoteIdentifier.js"));
8
+ /**
9
+ * Builds reusable chronological reachability CTEs from a start relation.
10
+ * A callback may derive all-node starts from the materialized valid edges.
11
+ */
12
+ function buildGraphTemporalReachabilitySql(prepared, startsSelect, direction, temporal) {
13
+ const q = quoteIdentifier_js_1.default;
14
+ const relations = prepared.relationNames([
15
+ "graph_starts",
16
+ "graph_temporal_settings",
17
+ "graph_event_rows",
18
+ "graph_edges",
19
+ "graph_reachable_states",
20
+ ]);
21
+ const startsRelation = relations.graph_starts;
22
+ const settingsRelation = relations.graph_temporal_settings;
23
+ const eventRowsRelation = relations.graph_event_rows;
24
+ const edgesRelation = relations.graph_edges;
25
+ const reachableRelation = relations.graph_reachable_states;
26
+ const start = `${q("starts")}.${q("start")}`;
27
+ const startKey = `${q("starts")}.${q("__key")}`;
28
+ const reachedStart = `${q("reached")}.${q("start")}`;
29
+ const reachedStartKey = `${q("reached")}.${q("__start_key")}`;
30
+ const reachedNodeKey = `${q("reached")}.${q("__node_key")}`;
31
+ const edgeTo = `${q("edges")}.${q("__to")}`;
32
+ const edgeToKey = `${q("edges")}.${q("__to_key")}`;
33
+ const edgeFromKey = `${q("edges")}.${q("__from_key")}`;
34
+ const eventId = `${q("edges")}.${q("__event_id")}`;
35
+ const eventStart = `${q("edges")}.${q("__event_start")}`;
36
+ const eventEnd = `${q("edges")}.${q("__event_end")}`;
37
+ const gap = `${q("settings")}.${q("__gap")}`;
38
+ const resolvedStartsSelect = typeof startsSelect === "string"
39
+ ? startsSelect
40
+ : startsSelect(edgesRelation);
41
+ // Materialized event IDs stay fixed; UNION bounds states to starts × events,
42
+ // including equal-time cycles, because the last event determines all next steps.
43
+ return {
44
+ edgesRelation,
45
+ reachableRelation,
46
+ withClause: `WITH RECURSIVE ${settingsRelation} AS MATERIALIZED (
47
+ SELECT CAST(? AS HUGEINT) AS ${q("__gap")}
48
+ ), ${eventRowsRelation} AS MATERIALIZED (
49
+ ${prepared.edges(direction, temporal.eventSelections("edges"))}
50
+ ), ${edgesRelation} AS MATERIALIZED (
51
+ SELECT *
52
+ FROM ${eventRowsRelation} AS ${q("events")}
53
+ WHERE ${temporal.eventValidity("events")}
54
+ ), ${startsRelation} AS MATERIALIZED (
55
+ ${resolvedStartsSelect}
56
+ ), ${reachableRelation}(
57
+ ${q("start")}, ${q("node")},
58
+ ${q("__start_key")}, ${q("__node_key")},
59
+ ${q("__event_id")}, ${q("__event_start")}, ${q("__event_end")}
60
+ ) AS (
61
+ SELECT ${start}, ${edgeTo}, ${startKey}, ${edgeToKey},
62
+ ${eventId}, ${eventStart}, ${eventEnd}
63
+ FROM ${startsRelation} AS ${q("starts")}
64
+ INNER JOIN ${edgesRelation} AS ${q("edges")}
65
+ ON ${startKey} = ${edgeFromKey}
66
+ UNION
67
+ SELECT ${reachedStart}, ${edgeTo}, ${reachedStartKey}, ${edgeToKey},
68
+ ${eventId}, ${eventStart}, ${eventEnd}
69
+ FROM ${reachableRelation} AS ${q("reached")}
70
+ INNER JOIN ${edgesRelation} AS ${q("edges")}
71
+ ON ${reachedNodeKey} = ${edgeFromKey}
72
+ CROSS JOIN ${settingsRelation} AS ${q("settings")}
73
+ WHERE ${temporal.transition("reached", "edges", direction, gap)}
74
+ )`,
75
+ };
76
+ }
@@ -0,0 +1,10 @@
1
+ import type { DuckDBConnection } from "@duckdb/node-api";
2
+ type WeightedEdge = {
3
+ source: number;
4
+ target: number;
5
+ distance: number;
6
+ };
7
+ /** Select a deterministically ordered MST from a connected sparse candidate graph. */
8
+ export default function buildSparseMutualReachabilityMst(connection: DuckDBConnection, edges: string, count: number): Promise<WeightedEdge[]>;
9
+ export {};
10
+ //# sourceMappingURL=buildSparseMutualReachabilityMst.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildSparseMutualReachabilityMst.d.ts","sourceRoot":"","sources":["../../src/helpers/buildSparseMutualReachabilityMst.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,KAAK,YAAY,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzE,sFAAsF;AACtF,wBAA8B,gCAAgC,CAC5D,UAAU,EAAE,gBAAgB,EAC5B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,YAAY,EAAE,CAAC,CA4CzB"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = buildSparseMutualReachabilityMst;
4
+ /** Select a deterministically ordered MST from a connected sparse candidate graph. */
5
+ async function buildSparseMutualReachabilityMst(connection, edges, count) {
6
+ const parent = new Int32Array(count);
7
+ const size = new Int32Array(count).fill(1);
8
+ for (let vertex = 0; vertex < count; vertex++)
9
+ parent[vertex] = vertex;
10
+ const find = (start) => {
11
+ let root = start;
12
+ while (parent[root] !== root)
13
+ root = parent[root];
14
+ let current = start;
15
+ while (parent[current] !== current) {
16
+ const next = parent[current];
17
+ parent[current] = root;
18
+ current = next;
19
+ }
20
+ return root;
21
+ };
22
+ const mst = [];
23
+ const result = await connection.stream(`SELECT source,target,distance FROM ${edges}
24
+ ORDER BY distance,source,target`);
25
+ while (mst.length < count - 1) {
26
+ const chunk = await result.fetchChunk();
27
+ if (!chunk || chunk.rowCount === 0)
28
+ break;
29
+ const sources = chunk.getColumnVector(0);
30
+ const targets = chunk.getColumnVector(1);
31
+ const distances = chunk.getColumnVector(2);
32
+ for (let row = 0; row < chunk.rowCount && mst.length < count - 1; row++) {
33
+ const source = Number(sources.getItem(row));
34
+ const target = Number(targets.getItem(row));
35
+ const distance = Number(distances.getItem(row));
36
+ let left = find(source), right = find(target);
37
+ if (left === right)
38
+ continue;
39
+ if (size[left] < size[right])
40
+ [left, right] = [right, left];
41
+ parent[right] = left;
42
+ size[left] += size[right];
43
+ mst.push({ source, target, distance });
44
+ }
45
+ }
46
+ if (mst.length !== count - 1) {
47
+ throw new Error("Approximate HDBSCAN candidate graph has no spanning tree.");
48
+ }
49
+ return mst;
50
+ }
@@ -1,10 +1,7 @@
1
1
  import type { DuckDBConnection } from "@duckdb/node-api";
2
- export type UmapTables = {
3
- rows: string;
2
+ import { type VectorNeighborTables } from "./buildVectorNeighbors.js";
3
+ export type UmapTables = Omit<VectorNeighborTables, "neighbors"> & {
4
4
  knn: string;
5
- search: string;
6
- hnsw: string;
7
- candidates: string;
8
5
  scales: string;
9
6
  directed: string;
10
7
  graph: string;
@@ -1 +1 @@
1
- {"version":3,"file":"buildUmapGraph.d.ts","sourceRoot":"","sources":["../../src/helpers/buildUmapGraph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAKzD,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAA8B,cAAc,CAC1C,UAAU,EAAE,gBAAgB,EAC5B,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAC/D,OAAO,EAAE;IAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAA;CAAE,EACrE,KAAK,EAAE,UAAU;;;;GAkClB"}
1
+ {"version":3,"file":"buildUmapGraph.d.ts","sourceRoot":"","sources":["../../src/helpers/buildUmapGraph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAA6B,EAC3B,KAAK,oBAAoB,EAC1B,MAAM,2BAA2B,CAAC;AAInC,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,GAAG;IACjE,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAA8B,cAAc,CAC1C,UAAU,EAAE,gBAAgB,EAC5B,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAC/D,OAAO,EAAE;IAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAA;CAAE,EACrE,KAAK,EAAE,UAAU;;;;GA2ClB"}
@@ -5,8 +5,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.default = buildUmapGraph;
7
7
  const readScalarNumber_js_1 = __importDefault(require("./readScalarNumber.js"));
8
+ const buildVectorNeighbors_js_1 = __importDefault(require("./buildVectorNeighbors.js"));
8
9
  async function buildUmapGraph(connection, input, options, names) {
9
- await buildNeighbors(connection, input, options, names);
10
+ await (0, buildVectorNeighbors_js_1.default)(connection, {
11
+ count: input.count,
12
+ dimensions: input.dimensions,
13
+ neighborCount: input.neighbors,
14
+ }, { ...options, includeSelf: true }, { ...names, neighbors: names.knn });
10
15
  await buildFuzzyGraph(connection, input.neighbors, names);
11
16
  const edges = await (0, readScalarNumber_js_1.default)(connection, `SELECT count(*) FROM ${names.graph}`);
12
17
  const source = new Uint32Array(edges), target = new Uint32Array(edges), weight = new Float64Array(edges);
@@ -25,105 +30,6 @@ async function buildUmapGraph(connection, input, options, names) {
25
30
  throw new Error("Graph changed during transfer.");
26
31
  return { source, target, weight };
27
32
  }
28
- async function buildNeighbors(connection, input, options, names) {
29
- const { count, dimensions, neighbors } = input;
30
- const distance = options.metric === "cosine"
31
- ? "array_cosine_distance"
32
- : "array_distance";
33
- // Exact duplicates must have zero cosine distance. Positive roundoff would
34
- // otherwise change rho to that error instead of the next distinct neighbor.
35
- const exactDistance = options.metric === "cosine"
36
- ? "CASE WHEN a.vec=b.vec THEN 0 ELSE greatest(0,array_cosine_distance(a.vec,b.vec)) END"
37
- : "array_distance(a.vec,b.vec)";
38
- await connection.run(`CREATE OR REPLACE TEMP TABLE ${names.knn}
39
- (source INTEGER, target INTEGER, distance DOUBLE);
40
- INSERT INTO ${names.knn} SELECT vertex, vertex, 0 FROM ${names.rows}`);
41
- if (options.search === "exact") {
42
- // O(n²d) work, but only a bounded source batch and top-k heaps, never a
43
- // materialized n×n matrix. Include target id in the key for stable ties.
44
- for (let offset = 0; offset < count; offset += 32) {
45
- const query = `SELECT source, item.target, item.distance FROM (
46
- SELECT a.vertex AS source,
47
- min_by(struct_pack(target := b.vertex, distance := ${exactDistance}),
48
- struct_pack(distance := ${exactDistance}, target := b.vertex),
49
- ${neighbors - 1}) AS closest
50
- FROM ${names.rows} a CROSS JOIN ${names.rows} b
51
- WHERE a.vertex >= ${offset} AND a.vertex < ${offset + 32}
52
- AND a.vertex != b.vertex GROUP BY a.vertex
53
- ), UNNEST(closest) AS t(item)`;
54
- await connection.run(`INSERT INTO ${names.knn} ${query}`);
55
- }
56
- }
57
- else {
58
- await connection.run(`INSTALL vss; LOAD vss;
59
- CREATE OR REPLACE TEMP TABLE ${names.search} AS
60
- SELECT vertex, vec::FLOAT[${dimensions}] AS vec FROM ${names.rows} ORDER BY vertex`);
61
- if (await (0, readScalarNumber_js_1.default)(connection, `SELECT count(*) FROM ${names.search} WHERE
62
- NOT isfinite(array_inner_product(vec,vec))
63
- ${options.metric === "cosine"
64
- ? "OR array_inner_product(vec,vec)=0"
65
- : ""}`)) {
66
- throw new Error("HNSW requires vectors with finite FLOAT norms (and nonzero cosine norms).");
67
- }
68
- await connection.run(`CREATE INDEX ${names.hnsw} ON ${names.search} USING HNSW(vec)
69
- WITH (metric='${options.metric === "cosine" ? "cosine" : "l2sq"}',
70
- ef_construction=128, ef_search=128, M=16)`);
71
- const previous = String((await connection.runAndReadAll("SELECT current_setting('disabled_optimizers')")).getRowsJS()[0][0]);
72
- // The shipped VSS optimizer recognizes the window form of a lateral top-k.
73
- // DuckDB 1.5.5's top_n_window_elimination otherwise hides that pattern.
74
- const disabled = [
75
- ...new Set([
76
- ...previous.split(",").filter(Boolean),
77
- "top_n_window_elimination",
78
- ]),
79
- ].join(",");
80
- try {
81
- await connection.run(`SET disabled_optimizers='${disabled.replaceAll("'", "''")}'`);
82
- const query = `SELECT a.vertex AS source, b.vertex AS target, b.distance
83
- FROM ${names.search} a, LATERAL (
84
- SELECT vertex, ${distance}(vec,a.vec) AS distance FROM ${names.search}
85
- ORDER BY distance LIMIT ${Math.min(neighbors + 1, count - 1)}
86
- ) b`;
87
- // Materialize ONLY ids and scalar distances before ranking. Keeping the
88
- // vector joins inside the window query makes DuckDB carry two full DOUBLE
89
- // vectors per candidate through the sort (O(n*k*d) scratch memory).
90
- const candidates = `SELECT q.source,q.target,${exactDistance} AS distance
91
- FROM (${query}) q JOIN ${names.rows} a ON q.source=a.vertex
92
- JOIN ${names.rows} b ON q.target=b.vertex WHERE q.source != q.target`;
93
- const plan = JSON.stringify((await connection.runAndReadAll(`EXPLAIN ${candidates}`)).getRowsJS());
94
- if (!plan.includes("HNSW_INDEX_JOIN")) {
95
- // The optimizer can retain a correlated cross product for tiny or
96
- // duplicate-heavy inputs. Only small inputs may use our bounded exact
97
- // implementation; never execute the unbounded candidate query.
98
- if (count <= 1000) {
99
- return await buildNeighbors(connection, input, {
100
- ...options,
101
- search: "exact",
102
- }, names);
103
- }
104
- throw new Error("UMAP could not use DuckDB's vector index for neighbor search.");
105
- }
106
- // Exclude self AFTER index search, then stable-sort candidates and keep k-1.
107
- // Recompute candidate distances in DOUBLE to isolate ANN candidate error.
108
- await connection.run(`CREATE OR REPLACE TEMP TABLE ${names.candidates} AS ${candidates};
109
- INSERT INTO ${names.knn} SELECT source,target,distance FROM ${names.candidates}
110
- QUALIFY row_number() OVER (PARTITION BY source
111
- ORDER BY distance,target) <= ${neighbors - 1}`);
112
- }
113
- finally {
114
- await connection.run(`SET disabled_optimizers='${previous.replaceAll("'", "''")}'`);
115
- }
116
- }
117
- if (await (0, readScalarNumber_js_1.default)(connection, `SELECT count(*) FROM ${names.knn}`) !==
118
- count * neighbors) {
119
- throw new Error("Neighbor search did not return the required number of neighbors.");
120
- }
121
- if (await (0, readScalarNumber_js_1.default)(connection, `SELECT count(*) FROM ${names.knn} WHERE NOT isfinite(distance)`)) {
122
- throw new Error("Distance computation returned a non-finite value.");
123
- }
124
- // Cosine roundoff can produce a tiny negative distance.
125
- await connection.run(`UPDATE ${names.knn} SET distance=greatest(0,distance)`);
126
- }
127
33
  async function buildFuzzyGraph(connection, neighbors, names) {
128
34
  // Smooth-kNN with local_connectivity=1, bandwidth=1, 64 bisection steps,
129
35
  // tolerance 1e-5 and the reference's 1e-3 minimum-distance scale.
@@ -0,0 +1,45 @@
1
+ import type { DuckDBConnection } from "@duckdb/node-api";
2
+ /** Private, already-quoted relation names owned and cleaned up by the caller. */
3
+ export type VectorNeighborTables = {
4
+ rows: string;
5
+ neighbors: string;
6
+ search: string;
7
+ hnsw: string;
8
+ candidates: string;
9
+ };
10
+ type NeighborInput = {
11
+ count: number;
12
+ dimensions: number;
13
+ neighborCount: number;
14
+ };
15
+ type NeighborOptions = {
16
+ metric: "euclidean" | "cosine";
17
+ search: "exact" | "hnsw";
18
+ includeSelf: boolean;
19
+ hnsw?: {
20
+ efConstruction: number;
21
+ efSearch: number;
22
+ connectivity: number;
23
+ candidateCount: number;
24
+ singleThreaded: boolean;
25
+ cosineAsL2: boolean;
26
+ };
27
+ };
28
+ /**
29
+ * Materialize ranked vector neighbors without moving source vectors into JS.
30
+ *
31
+ * `neighborCount` is the number of rows produced per source. When `includeSelf`
32
+ * is true, the source is rank 0 and consumes one of those rows. Otherwise all
33
+ * rows are other points. Ranks are zero-based and ties use target id order.
34
+ * Input rows have unique contiguous `vertex` ids from 0 through count-1 and
35
+ * validated, non-null, fixed-size DOUBLE `vec` values. Cosine preparation may
36
+ * rescale this private vec column, preserving direction.
37
+ *
38
+ * The caller owns every supplied scratch relation and must drop them after
39
+ * success or failure. Approximate search only approximates candidate retrieval;
40
+ * candidate distances are recomputed from the DOUBLE source vectors before
41
+ * stable final ranking.
42
+ */
43
+ export default function buildVectorNeighbors(connection: DuckDBConnection, input: NeighborInput, options: NeighborOptions, names: VectorNeighborTables): Promise<void>;
44
+ export {};
45
+ //# sourceMappingURL=buildVectorNeighbors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildVectorNeighbors.d.ts","sourceRoot":"","sources":["../../src/helpers/buildVectorNeighbors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAMzD,iFAAiF;AACjF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE;QACL,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,OAAO,CAAC;QACxB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;CACH,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAA8B,oBAAoB,CAChD,UAAU,EAAE,gBAAgB,EAC5B,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAqHf"}
@@ -0,0 +1,176 @@
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 = buildVectorNeighbors;
7
+ const readScalarNumber_js_1 = __importDefault(require("./readScalarNumber.js"));
8
+ const vectorDistanceExpression_js_1 = __importDefault(require("./vectorDistanceExpression.js"));
9
+ const stabilizeCosineVectors_js_1 = __importDefault(require("./stabilizeCosineVectors.js"));
10
+ const validateVectorRowIds_js_1 = __importDefault(require("./validateVectorRowIds.js"));
11
+ /**
12
+ * Materialize ranked vector neighbors without moving source vectors into JS.
13
+ *
14
+ * `neighborCount` is the number of rows produced per source. When `includeSelf`
15
+ * is true, the source is rank 0 and consumes one of those rows. Otherwise all
16
+ * rows are other points. Ranks are zero-based and ties use target id order.
17
+ * Input rows have unique contiguous `vertex` ids from 0 through count-1 and
18
+ * validated, non-null, fixed-size DOUBLE `vec` values. Cosine preparation may
19
+ * rescale this private vec column, preserving direction.
20
+ *
21
+ * The caller owns every supplied scratch relation and must drop them after
22
+ * success or failure. Approximate search only approximates candidate retrieval;
23
+ * candidate distances are recomputed from the DOUBLE source vectors before
24
+ * stable final ranking.
25
+ */
26
+ async function buildVectorNeighbors(connection, input, options, names) {
27
+ const { count, dimensions, neighborCount } = input;
28
+ await (0, validateVectorRowIds_js_1.default)(connection, names.rows, count);
29
+ if (!Number.isSafeInteger(dimensions) || dimensions < 1) {
30
+ throw new Error("Vector dimensions must be a positive safe integer.");
31
+ }
32
+ const maximum = count - (options.includeSelf ? 0 : 1);
33
+ if (!Number.isSafeInteger(neighborCount) || neighborCount < 1 ||
34
+ neighborCount > maximum) {
35
+ throw new Error(`Neighbor count must be a safe integer between 1 and ${maximum}.`);
36
+ }
37
+ if (options.metric === "cosine") {
38
+ await (0, stabilizeCosineVectors_js_1.default)(connection, names.rows);
39
+ }
40
+ // FLOAT representation limits apply only to the HNSW search vectors.
41
+ // Exact Euclidean distance does not require representable squared norms.
42
+ if (options.search === "hnsw") {
43
+ const normExpression = `array_inner_product(vec::FLOAT[${dimensions}],vec::FLOAT[${dimensions}])`;
44
+ if (await (0, readScalarNumber_js_1.default)(connection, `SELECT count(*) FROM ${names.rows} WHERE NOT isfinite(${normExpression})
45
+ ${options.metric === "cosine" ? `OR ${normExpression}=0` : ""}`)) {
46
+ throw new Error("HNSW requires vectors with finite FLOAT norms (and nonzero cosine norms).");
47
+ }
48
+ }
49
+ const distanceFunction = options.metric === "cosine"
50
+ ? "array_cosine_distance"
51
+ : "array_distance";
52
+ // Equal vectors must have exactly zero cosine distance. Positive roundoff can
53
+ // otherwise alter downstream density estimates. Clamp negative roundoff too.
54
+ const exactDistance = (0, vectorDistanceExpression_js_1.default)("a.vec", "b.vec", options.metric);
55
+ const otherCount = neighborCount - (options.includeSelf ? 1 : 0);
56
+ await connection.run(`CREATE OR REPLACE TEMP TABLE ${names.candidates}
57
+ (source INTEGER, target INTEGER, distance DOUBLE)`);
58
+ if (otherCount > 0) {
59
+ if (options.search === "exact") {
60
+ // O(n²d) work with a bounded source batch and top-k heaps. The full
61
+ // distance matrix is never materialized.
62
+ await buildExactCandidates(connection, input, names, exactDistance, otherCount);
63
+ }
64
+ else {
65
+ await buildHnswCandidates(connection, input, options, names, distanceFunction, exactDistance, otherCount);
66
+ }
67
+ }
68
+ if (await (0, readScalarNumber_js_1.default)(connection, `SELECT count(*) FROM ${names.candidates} WHERE distance IS NULL OR NOT isfinite(distance)`)) {
69
+ throw new Error("Distance computation returned a non-finite value.");
70
+ }
71
+ const selfRows = options.includeSelf
72
+ ? `SELECT vertex AS source,vertex AS target,0::DOUBLE AS distance FROM ${names.rows}`
73
+ : "SELECT NULL::INTEGER AS source,NULL::INTEGER AS target,NULL::DOUBLE AS distance WHERE false";
74
+ const rankOrder = options.includeSelf
75
+ ? "CASE WHEN source=target THEN 0 ELSE 1 END,distance,target"
76
+ : "distance,target";
77
+ await connection.run(`CREATE OR REPLACE TEMP TABLE ${names.neighbors} AS
78
+ SELECT source,target,
79
+ (row_number() OVER (PARTITION BY source ORDER BY ${rankOrder})-1)::INTEGER AS rank,
80
+ greatest(0,distance)::DOUBLE AS distance
81
+ FROM (${selfRows} UNION ALL
82
+ SELECT source,target,distance FROM ${names.candidates})
83
+ QUALIFY row_number() OVER (PARTITION BY source ORDER BY ${rankOrder})
84
+ <= ${neighborCount}`);
85
+ const produced = await (0, readScalarNumber_js_1.default)(connection, `SELECT count(*) FROM ${names.neighbors}`);
86
+ if (produced !== count * neighborCount) {
87
+ throw new Error(`Neighbor search returned ${produced} rows; ${count * neighborCount} were required.`);
88
+ }
89
+ if (await (0, readScalarNumber_js_1.default)(connection, `SELECT count(*) FROM ${names.neighbors} WHERE NOT isfinite(distance)`)) {
90
+ throw new Error("Distance computation returned a non-finite value.");
91
+ }
92
+ }
93
+ async function buildHnswCandidates(connection, input, options, names, distanceFunction, exactDistance, otherCount) {
94
+ const { count, dimensions, neighborCount } = input;
95
+ const settings = options.hnsw;
96
+ const cosineAsL2 = options.metric === "cosine" && settings?.cosineAsL2;
97
+ // Euclidean distance on unit vectors has the same mathematical ordering as
98
+ // cosine. Computing differences avoids FLOAT dot-product cancellation for
99
+ // near-collinear vectors; final metric distances still use source DOUBLEs.
100
+ const searchVector = cosineAsL2
101
+ ? "list_transform(vec,x -> x/sqrt(array_inner_product(vec,vec)))"
102
+ : "vec";
103
+ const previousThreads = Number((await connection.runAndReadAll("SELECT current_setting('threads')")).getRowsJS()[0][0]);
104
+ try {
105
+ if (settings?.singleThreaded)
106
+ await connection.run("SET threads=1");
107
+ await connection.run(`INSTALL vss; LOAD vss;
108
+ CREATE OR REPLACE TEMP TABLE ${names.search} AS
109
+ SELECT vertex,${searchVector}::FLOAT[${dimensions}] AS vec
110
+ FROM ${names.rows} ORDER BY vertex;
111
+ CREATE INDEX ${names.hnsw} ON ${names.search} USING HNSW(vec)
112
+ WITH (metric='${options.metric === "cosine" && !cosineAsL2 ? "cosine" : "l2sq"}',
113
+ ef_construction=${settings?.efConstruction ?? 128},
114
+ ef_search=${settings?.efSearch ?? 128},M=${settings?.connectivity ?? 16})`);
115
+ }
116
+ finally {
117
+ if (settings?.singleThreaded) {
118
+ await connection.run(`SET threads=${previousThreads}`);
119
+ }
120
+ }
121
+ const previous = String((await connection.runAndReadAll("SELECT current_setting('disabled_optimizers')")).getRowsJS()[0][0]);
122
+ const disabled = [
123
+ ...new Set([
124
+ ...previous.split(",").filter(Boolean),
125
+ "top_n_window_elimination",
126
+ ]),
127
+ ].join(",");
128
+ try {
129
+ await connection.run(`SET disabled_optimizers='${disabled.replaceAll("'", "''")}'`);
130
+ // Preserve UMAP's established candidate budget when self is included.
131
+ // Excluding self needs one extra result because HNSW normally returns it.
132
+ const candidateCount = settings?.candidateCount ??
133
+ (options.includeSelf
134
+ ? Math.max(otherCount + 1, Math.min(neighborCount + 1, count - 1))
135
+ : Math.min(otherCount + 1, count));
136
+ const candidateDistanceFunction = cosineAsL2
137
+ ? "array_distance"
138
+ : distanceFunction;
139
+ const query = `SELECT a.vertex AS source,b.vertex AS target,b.distance
140
+ FROM ${names.search} a,LATERAL (
141
+ SELECT vertex,${candidateDistanceFunction}(vec,a.vec) AS distance
142
+ FROM ${names.search} ORDER BY distance LIMIT ${candidateCount}
143
+ ) b`;
144
+ // Carry ids and scalar distances through the candidate relation. Recompute
145
+ // in DOUBLE against source rows to isolate ANN retrieval from precision.
146
+ const candidates = `SELECT q.source,q.target,${exactDistance} AS distance
147
+ FROM (${query}) q JOIN ${names.rows} a ON q.source=a.vertex
148
+ JOIN ${names.rows} b ON q.target=b.vertex WHERE q.source != q.target`;
149
+ const plan = JSON.stringify((await connection.runAndReadAll(`EXPLAIN ${candidates}`)).getRowsJS());
150
+ if (!plan.includes("HNSW_INDEX_JOIN")) {
151
+ if (count <= 1000) {
152
+ return await buildExactCandidates(connection, input, names, exactDistance, otherCount);
153
+ }
154
+ throw new Error("DuckDB could not use its vector index for neighbor search.");
155
+ }
156
+ await connection.run(`INSERT INTO ${names.candidates} ${candidates}`);
157
+ }
158
+ finally {
159
+ await connection.run(`SET disabled_optimizers='${previous.replaceAll("'", "''")}'`);
160
+ }
161
+ }
162
+ async function buildExactCandidates(connection, input, names, exactDistance, otherCount) {
163
+ for (let offset = 0; offset < input.count; offset += 32) {
164
+ const query = `SELECT source,item.target,item.distance FROM (
165
+ SELECT a.vertex AS source,
166
+ CASE WHEN bool_and(isfinite(${exactDistance})) THEN
167
+ min_by(struct_pack(target := b.vertex,distance := ${exactDistance}),
168
+ struct_pack(distance := ${exactDistance},target := b.vertex),
169
+ ${otherCount}) ELSE error('Distance computation returned a non-finite value.') END AS closest
170
+ FROM ${names.rows} a CROSS JOIN ${names.rows} b
171
+ WHERE a.vertex >= ${offset} AND a.vertex < ${offset + 32}
172
+ AND a.vertex != b.vertex GROUP BY a.vertex
173
+ ),UNNEST(closest) AS t(item)`;
174
+ await connection.run(`INSERT INTO ${names.candidates} ${query}`);
175
+ }
176
+ }
@@ -0,0 +1,3 @@
1
+ /** Builds weak component labels and zero-based IDs from bidirectional edges. */
2
+ export default function buildWeakGraphComponentsSql(edges: string, nodes: string, labels: string, roots: string): string;
3
+ //# sourceMappingURL=buildWeakGraphComponentsSql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildWeakGraphComponentsSql.d.ts","sourceRoot":"","sources":["../../src/helpers/buildWeakGraphComponentsSql.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,MAAM,CAAC,OAAO,UAAU,2BAA2B,CACjD,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,CA6BR"}