@nshiab/simple-data-analysis-core 2.1.7 → 2.1.9

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 (59) hide show
  1. package/esm/class/SimpleTable.d.ts +191 -108
  2. package/esm/class/SimpleTable.d.ts.map +1 -1
  3. package/esm/class/SimpleTable.js +188 -105
  4. package/esm/helpers/buildGraphTemporalCostStateSql.d.ts +1 -1
  5. package/esm/helpers/buildGraphTemporalCostStateSql.d.ts.map +1 -1
  6. package/esm/helpers/buildGraphTemporalCostStateSql.js +23 -9
  7. package/esm/helpers/graphRouteResultSchema.d.ts +1 -1
  8. package/esm/helpers/graphRouteResultSchema.d.ts.map +1 -1
  9. package/esm/helpers/graphRouteResultSchema.js +3 -3
  10. package/esm/helpers/graphRouteResultSelect.d.ts +1 -1
  11. package/esm/helpers/graphRouteResultSelect.d.ts.map +1 -1
  12. package/esm/helpers/graphRouteResultSelect.js +2 -2
  13. package/esm/helpers/prepareGraphMetricOptions.d.ts +2 -2
  14. package/esm/helpers/prepareGraphMetricOptions.d.ts.map +1 -1
  15. package/esm/helpers/prepareGraphMetricOptions.js +5 -4
  16. package/esm/helpers/prepareGraphRouteSql.d.ts +2 -2
  17. package/esm/helpers/prepareGraphRouteSql.d.ts.map +1 -1
  18. package/esm/helpers/prepareGraphRouteSql.js +4 -4
  19. package/esm/helpers/validateGraphRouteResultSchema.d.ts +1 -1
  20. package/esm/helpers/validateGraphRouteResultSchema.d.ts.map +1 -1
  21. package/esm/helpers/validateGraphRouteResultSchema.js +3 -1
  22. package/esm/methods/distances.d.ts +1 -1
  23. package/esm/methods/distances.d.ts.map +1 -1
  24. package/esm/methods/distances.js +235 -73
  25. package/esm/methods/shortestPath.d.ts +1 -1
  26. package/esm/methods/shortestPath.d.ts.map +1 -1
  27. package/esm/methods/shortestPath.js +44 -28
  28. package/esm/methods/similarityMahalanobis.js +3 -3
  29. package/llm.md +214 -119
  30. package/llms.txt +1 -1
  31. package/package.json +1 -1
  32. package/script/class/SimpleTable.d.ts +191 -108
  33. package/script/class/SimpleTable.d.ts.map +1 -1
  34. package/script/class/SimpleTable.js +188 -105
  35. package/script/helpers/buildGraphTemporalCostStateSql.d.ts +1 -1
  36. package/script/helpers/buildGraphTemporalCostStateSql.d.ts.map +1 -1
  37. package/script/helpers/buildGraphTemporalCostStateSql.js +23 -9
  38. package/script/helpers/graphRouteResultSchema.d.ts +1 -1
  39. package/script/helpers/graphRouteResultSchema.d.ts.map +1 -1
  40. package/script/helpers/graphRouteResultSchema.js +3 -3
  41. package/script/helpers/graphRouteResultSelect.d.ts +1 -1
  42. package/script/helpers/graphRouteResultSelect.d.ts.map +1 -1
  43. package/script/helpers/graphRouteResultSelect.js +2 -2
  44. package/script/helpers/prepareGraphMetricOptions.d.ts +2 -2
  45. package/script/helpers/prepareGraphMetricOptions.d.ts.map +1 -1
  46. package/script/helpers/prepareGraphMetricOptions.js +5 -4
  47. package/script/helpers/prepareGraphRouteSql.d.ts +2 -2
  48. package/script/helpers/prepareGraphRouteSql.d.ts.map +1 -1
  49. package/script/helpers/prepareGraphRouteSql.js +4 -4
  50. package/script/helpers/validateGraphRouteResultSchema.d.ts +1 -1
  51. package/script/helpers/validateGraphRouteResultSchema.d.ts.map +1 -1
  52. package/script/helpers/validateGraphRouteResultSchema.js +3 -1
  53. package/script/methods/distances.d.ts +1 -1
  54. package/script/methods/distances.d.ts.map +1 -1
  55. package/script/methods/distances.js +235 -73
  56. package/script/methods/shortestPath.d.ts +1 -1
  57. package/script/methods/shortestPath.d.ts.map +1 -1
  58. package/script/methods/shortestPath.js +44 -28
  59. package/script/methods/similarityMahalanobis.js +3 -3
@@ -92,7 +92,7 @@ function shortestPath(simpleTable, sourceColumn, targetColumn, edgeId, start, en
92
92
  ? undefined
93
93
  : (input) => (0, validateGraphTemporalEvents_js_1.default)(input, temporalOptions, "shortestPath()", parameters),
94
94
  values: (schema) => {
95
- (0, prepareGraphRouteSql_js_1.validateGraphRouteInputs)(schema, sourceColumn, targetColumn, edgeId, endpoints, options.weight, "shortestPath()");
95
+ (0, prepareGraphRouteSql_js_1.validateGraphRouteInputs)(schema, sourceColumn, targetColumn, edgeId, endpoints, options.weight, "shortestPath()", options.weight !== undefined);
96
96
  const temporal = temporalOptions === undefined
97
97
  ? undefined
98
98
  : (0, prepareGraphTemporalSql_js_1.default)(schema, temporalOptions, "shortestPath()");
@@ -102,27 +102,28 @@ function shortestPath(simpleTable, sourceColumn, targetColumn, edgeId, start, en
102
102
  },
103
103
  buildSelect: (input, schema) => shortestPathSelect(input, schema, sourceColumn, targetColumn, edgeId, endpoints, direction, options.weight, temporalOptions, metrics),
104
104
  outputSchema: (schema) => {
105
- const validated = (0, prepareGraphRouteSql_js_1.validateGraphRouteInputs)(schema, sourceColumn, targetColumn, edgeId, endpoints, options.weight, "shortestPath()");
105
+ const validated = (0, prepareGraphRouteSql_js_1.validateGraphRouteInputs)(schema, sourceColumn, targetColumn, edgeId, endpoints, options.weight, "shortestPath()", options.weight !== undefined);
106
106
  if (temporalOptions !== undefined) {
107
107
  (0, prepareGraphTemporalSql_js_1.default)(schema, temporalOptions, "shortestPath()");
108
108
  }
109
- return (0, graphRouteResultSchema_js_1.default)(schema, validated.distanceType, "shortestPath()", metrics.elapsedTime);
109
+ return (0, graphRouteResultSchema_js_1.default)(schema, validated.distanceType, "shortestPath()", metrics.elapsedTime, options.weight !== undefined);
110
110
  },
111
111
  });
112
112
  }
113
113
  function shortestPathSelect(input, schema, source, target, edgeId, routeEndpoints, direction, weight, temporalOptions, metrics) {
114
- const route = (0, prepareGraphRouteSql_js_1.prepareGraphRouteSql)(input, schema, source, target, edgeId, routeEndpoints, weight, "shortestPath()");
114
+ const route = (0, prepareGraphRouteSql_js_1.prepareGraphRouteSql)(input, schema, source, target, edgeId, routeEndpoints, weight, "shortestPath()", weight !== undefined);
115
115
  const prepared = route.traversal;
116
116
  if (temporalOptions !== undefined) {
117
117
  const temporal = (0, prepareGraphTemporalSql_js_1.default)(schema, temporalOptions, "shortestPath()");
118
- return temporalShortestPathSelect(route, direction, temporal, metrics);
118
+ return temporalShortestPathSelect(route, direction, temporal, metrics, weight !== undefined);
119
119
  }
120
120
  const distanceType = route.distanceType;
121
121
  // Exact shortest routes have optimal prefixes. Floating addition can erase
122
122
  // a prefix-cost difference later, so retain all simple prefixes up to the
123
123
  // best complete cost before selecting the full-route ties.
124
- const floating = route.weightType === "FLOAT" ||
125
- route.weightType === "DOUBLE";
124
+ const floating = metrics.minimize === "weight" &&
125
+ (route.weightType === "FLOAT" || route.weightType === "DOUBLE");
126
+ const metricType = metrics.minimize === "steps" ? "BIGINT" : distanceType;
126
127
  const relations = prepared.relationNames([
127
128
  "graph_route_endpoints",
128
129
  "graph_edges",
@@ -148,8 +149,17 @@ function shortestPathSelect(input, schema, source, target, edgeId, routeEndpoint
148
149
  const edgeToKey = `${q("edges")}.${q("__to_key")}`;
149
150
  const edgeTo = `${q("edges")}.${q("__to")}`;
150
151
  const edgeCost = `${q("edges")}.${q("__weight")}`;
152
+ const edgeMetric = metrics.minimize === "steps"
153
+ ? "CAST(1 AS BIGINT)"
154
+ : edgeCost;
151
155
  const routeDistance = `${q("routes")}.${q("distance")}`;
152
156
  const candidateDistance = `CAST(${routeDistance} + ${edgeCost} AS ${distanceType})`;
157
+ const routeMetric = metrics.minimize === "steps"
158
+ ? `len(${q("routes")}.${q("steps")})`
159
+ : routeDistance;
160
+ const candidateMetric = metrics.minimize === "steps"
161
+ ? `${routeMetric} + 1`
162
+ : candidateDistance;
153
163
  return `WITH RECURSIVE ${endpointRelation}(
154
164
  ${q("start")}, ${q("end")}, ${q("__start_key")}, ${q("__end_key")}
155
165
  ) AS (
@@ -181,13 +191,13 @@ function shortestPathSelect(input, schema, source, target, edgeId, routeEndpoint
181
191
  ${q("node")}, ${q("__node_key")}, ${q("distance")}
182
192
  ) USING KEY(${q("__node_key")}) AS (
183
193
  SELECT ${q("start")}, ${q("__start_key")},
184
- CAST(0 AS ${distanceType})
194
+ CAST(0 AS ${metricType})
185
195
  FROM ${endpointRelation}
186
196
  INNER JOIN ${toEndRelation}
187
197
  ON ${q("__start_key")} = ${q("__key")}
188
198
  UNION
189
199
  SELECT ${edgeTo}, ${edgeToKey},
190
- MIN(CAST(${q("reached")}.${q("distance")} + ${edgeCost} AS ${distanceType}))
200
+ MIN(CAST(${q("reached")}.${q("distance")} + ${edgeMetric} AS ${metricType}))
191
201
  FROM ${distancesRelation} AS ${q("reached")}
192
202
  INNER JOIN ${edgesRelation} AS ${q("edges")}
193
203
  ON ${q("reached")}.${q("__node_key")} = ${edgeFromKey}
@@ -197,7 +207,7 @@ function shortestPathSelect(input, schema, source, target, edgeId, routeEndpoint
197
207
  ON ${edgeToKey} = ${q("best")}.${q("__node_key")}
198
208
  GROUP BY ${edgeTo}, ${edgeToKey}, ${q("best")}.${q("distance")}
199
209
  HAVING ${q("best")}.${q("distance")} IS NULL
200
- OR MIN(CAST(${q("reached")}.${q("distance")} + ${edgeCost} AS ${distanceType})) < ${q("best")}.${q("distance")}
210
+ OR MIN(CAST(${q("reached")}.${q("distance")} + ${edgeMetric} AS ${metricType})) < ${q("best")}.${q("distance")}
201
211
  ), ${bestTotalRelation} AS (
202
212
  SELECT ${q("distances")}.${q("distance")}
203
213
  FROM ${distancesRelation} AS ${q("distances")}
@@ -236,23 +246,23 @@ function shortestPathSelect(input, schema, source, target, edgeId, routeEndpoint
236
246
  WHERE ${q("routes")}.${q("__node_key")} <> ${q("__end_key")}
237
247
  AND NOT list_contains(${q("routes")}.${q("__visited")}, ${edgeToKey})
238
248
  AND ${floating
239
- ? `${candidateDistance} <= ${q("best_total")}.${q("distance")}`
240
- : `${candidateDistance} = ${q("best_prefix")}.${q("distance")}`}
249
+ ? `${candidateMetric} <= ${q("best_total")}.${q("distance")}`
250
+ : `${candidateMetric} = ${q("best_prefix")}.${q("distance")}`}
241
251
  ), ${shortestRelation} AS (
242
252
  SELECT ${q("__edge_keys")}, ${q("steps")}
243
- FROM ${routesRelation}
253
+ FROM ${routesRelation} AS ${q("routes")}
244
254
  CROSS JOIN ${endpointRelation}
245
255
  CROSS JOIN ${bestTotalRelation} AS ${q("best_total")}
246
256
  WHERE ${q("__node_key")} = ${q("__end_key")}
247
- AND ${routesRelation}.${q("distance")} = ${q("best_total")}.${q("distance")}
257
+ AND ${routeMetric} = ${q("best_total")}.${q("distance")}
248
258
  ), ${rankedRelation} AS (
249
259
  SELECT CAST(row_number() OVER (ORDER BY ${q("__edge_keys")}) - 1 AS BIGINT) AS ${q("pathId")},
250
260
  ${q("steps")}
251
261
  FROM ${shortestRelation}
252
262
  )
253
- ${(0, graphRouteResultSelect_js_1.default)(rankedRelation, route.input, route.edgeIdColumn)}`;
263
+ ${(0, graphRouteResultSelect_js_1.default)(rankedRelation, route.input, route.edgeIdColumn, false, false, weight !== undefined)}`;
254
264
  }
255
- function temporalShortestPathSelect(route, direction, temporal, metrics) {
265
+ function temporalShortestPathSelect(route, direction, temporal, metrics, includeTotal) {
256
266
  const prepared = route.traversal;
257
267
  const q = quoteIdentifier_js_1.default;
258
268
  const startsSelect = `SELECT ${q("start")},
@@ -265,7 +275,7 @@ function temporalShortestPathSelect(route, direction, temporal, metrics) {
265
275
  : (0, buildGraphTemporalCostStateSql_js_1.default)(prepared, startsSelect, direction, temporal, route.distanceType, route.edgeWeight, [
266
276
  `${route.typedEdgeId} AS ${q("__edge_id")}`,
267
277
  `${route.edgeKey} AS ${q("__edge_key")}`,
268
- ]);
278
+ ], metrics.minimize === "steps" ? "steps" : "weight");
269
279
  const relations = prepared.relationNames([
270
280
  "graph_route_endpoints",
271
281
  "graph_nodes",
@@ -295,15 +305,21 @@ function temporalShortestPathSelect(route, direction, temporal, metrics) {
295
305
  const routeAnchor = `${q("routes")}.${q("__journey_anchor")}`;
296
306
  const firstElapsed = temporal.journeyElapsed("edges", firstAnchor, direction);
297
307
  const candidateElapsed = temporal.journeyElapsed("edges", routeAnchor, direction);
298
- const firstMetric = metrics.minimize === "elapsedTime"
299
- ? firstElapsed
300
- : edgeCost;
301
- const candidateMetric = metrics.minimize === "elapsedTime"
302
- ? candidateElapsed
303
- : candidateDistance;
304
- const routeMetric = metrics.minimize === "elapsedTime"
305
- ? `${q("routes")}.${q("__elapsed")}`
306
- : routeDistance;
308
+ const firstMetric = metrics.minimize === "steps"
309
+ ? "1"
310
+ : metrics.minimize === "elapsedTime"
311
+ ? firstElapsed
312
+ : edgeCost;
313
+ const routeMetric = metrics.minimize === "steps"
314
+ ? `len(${q("routes")}.${q("steps")})`
315
+ : metrics.minimize === "elapsedTime"
316
+ ? `${q("routes")}.${q("__elapsed")}`
317
+ : routeDistance;
318
+ const candidateMetric = metrics.minimize === "steps"
319
+ ? `${routeMetric} + 1`
320
+ : metrics.minimize === "elapsedTime"
321
+ ? candidateElapsed
322
+ : candidateDistance;
307
323
  const step = (distance, elapsed) => `struct_pack(
308
324
  ${q("edgeId")} := ${q("edges")}.${q("__edge_id")},
309
325
  ${q("source")} := ${q("edges")}.${q("__from")},
@@ -336,7 +352,7 @@ function temporalShortestPathSelect(route, direction, temporal, metrics) {
336
352
  INNER JOIN ${edgesRelation} AS ${q("edges")}
337
353
  ON ${q("reached")}.${q("__key")} = ${edgeToKey}
338
354
  ), ${bestTotalRelation} AS (
339
- SELECT MIN(${q("costs")}.${q("distance")}) AS ${q("distance")}
355
+ SELECT MIN(${q("costs")}.${q(metrics.minimize === "steps" ? "steps" : "distance")}) AS ${q("distance")}
340
356
  FROM ${costs.costRelation} AS ${q("costs")}
341
357
  INNER JOIN ${endpointRelation}
342
358
  ON ${q("costs")}.${q("__node_key")} = ${q("__end_key")}
@@ -391,7 +407,7 @@ function temporalShortestPathSelect(route, direction, temporal, metrics) {
391
407
  AS ${q("pathId")}, ${q("steps")}
392
408
  FROM ${shortestRelation}
393
409
  )
394
- ${(0, graphRouteResultSelect_js_1.default)(rankedRelation, route.input, route.edgeIdColumn, false, metrics.elapsedTime)}`;
410
+ ${(0, graphRouteResultSelect_js_1.default)(rankedRelation, route.input, route.edgeIdColumn, false, metrics.elapsedTime, includeTotal)}`;
395
411
  }
396
412
  // At the same physical event a later departure (or earlier incoming arrival)
397
413
  // dominates every future elapsed duration. Keyed improvements find the optimum
@@ -50,11 +50,11 @@ function similarityMahalanobis(table, columns, referencePoint, newColumn, option
50
50
  }
51
51
  async function execute(table, columns, referencePoint, newColumn, options) {
52
52
  const sourceColumns = Object.keys(await table.getTypes());
53
- const scoreColumn = options.similarityScoreColumn === true
53
+ const scoreColumn = options.similarityColumn === true
54
54
  ? "similarity"
55
- : options.similarityScoreColumn === false
55
+ : options.similarityColumn === false
56
56
  ? undefined
57
- : options.similarityScoreColumn;
57
+ : options.similarityColumn;
58
58
  const outputNames = scoreColumn === undefined
59
59
  ? [newColumn]
60
60
  : [newColumn, scoreColumn];