@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.
- package/esm/class/SimpleTable.d.ts +191 -108
- package/esm/class/SimpleTable.d.ts.map +1 -1
- package/esm/class/SimpleTable.js +188 -105
- package/esm/helpers/buildGraphTemporalCostStateSql.d.ts +1 -1
- package/esm/helpers/buildGraphTemporalCostStateSql.d.ts.map +1 -1
- package/esm/helpers/buildGraphTemporalCostStateSql.js +23 -9
- package/esm/helpers/graphRouteResultSchema.d.ts +1 -1
- package/esm/helpers/graphRouteResultSchema.d.ts.map +1 -1
- package/esm/helpers/graphRouteResultSchema.js +3 -3
- package/esm/helpers/graphRouteResultSelect.d.ts +1 -1
- package/esm/helpers/graphRouteResultSelect.d.ts.map +1 -1
- package/esm/helpers/graphRouteResultSelect.js +2 -2
- package/esm/helpers/prepareGraphMetricOptions.d.ts +2 -2
- package/esm/helpers/prepareGraphMetricOptions.d.ts.map +1 -1
- package/esm/helpers/prepareGraphMetricOptions.js +5 -4
- package/esm/helpers/prepareGraphRouteSql.d.ts +2 -2
- package/esm/helpers/prepareGraphRouteSql.d.ts.map +1 -1
- package/esm/helpers/prepareGraphRouteSql.js +4 -4
- package/esm/helpers/validateGraphRouteResultSchema.d.ts +1 -1
- package/esm/helpers/validateGraphRouteResultSchema.d.ts.map +1 -1
- package/esm/helpers/validateGraphRouteResultSchema.js +3 -1
- package/esm/methods/distances.d.ts +1 -1
- package/esm/methods/distances.d.ts.map +1 -1
- package/esm/methods/distances.js +235 -73
- package/esm/methods/shortestPath.d.ts +1 -1
- package/esm/methods/shortestPath.d.ts.map +1 -1
- package/esm/methods/shortestPath.js +44 -28
- package/esm/methods/similarityMahalanobis.js +3 -3
- package/llm.md +214 -119
- package/llms.txt +1 -1
- package/package.json +1 -1
- package/script/class/SimpleTable.d.ts +191 -108
- package/script/class/SimpleTable.d.ts.map +1 -1
- package/script/class/SimpleTable.js +188 -105
- package/script/helpers/buildGraphTemporalCostStateSql.d.ts +1 -1
- package/script/helpers/buildGraphTemporalCostStateSql.d.ts.map +1 -1
- package/script/helpers/buildGraphTemporalCostStateSql.js +23 -9
- package/script/helpers/graphRouteResultSchema.d.ts +1 -1
- package/script/helpers/graphRouteResultSchema.d.ts.map +1 -1
- package/script/helpers/graphRouteResultSchema.js +3 -3
- package/script/helpers/graphRouteResultSelect.d.ts +1 -1
- package/script/helpers/graphRouteResultSelect.d.ts.map +1 -1
- package/script/helpers/graphRouteResultSelect.js +2 -2
- package/script/helpers/prepareGraphMetricOptions.d.ts +2 -2
- package/script/helpers/prepareGraphMetricOptions.d.ts.map +1 -1
- package/script/helpers/prepareGraphMetricOptions.js +5 -4
- package/script/helpers/prepareGraphRouteSql.d.ts +2 -2
- package/script/helpers/prepareGraphRouteSql.d.ts.map +1 -1
- package/script/helpers/prepareGraphRouteSql.js +4 -4
- package/script/helpers/validateGraphRouteResultSchema.d.ts +1 -1
- package/script/helpers/validateGraphRouteResultSchema.d.ts.map +1 -1
- package/script/helpers/validateGraphRouteResultSchema.js +3 -1
- package/script/methods/distances.d.ts +1 -1
- package/script/methods/distances.d.ts.map +1 -1
- package/script/methods/distances.js +235 -73
- package/script/methods/shortestPath.d.ts +1 -1
- package/script/methods/shortestPath.d.ts.map +1 -1
- package/script/methods/shortestPath.js +44 -28
- 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 =
|
|
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 ${
|
|
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")} + ${
|
|
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")} + ${
|
|
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
|
-
? `${
|
|
240
|
-
: `${
|
|
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 ${
|
|
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 === "
|
|
299
|
-
?
|
|
300
|
-
:
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
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.
|
|
53
|
+
const scoreColumn = options.similarityColumn === true
|
|
54
54
|
? "similarity"
|
|
55
|
-
: options.
|
|
55
|
+
: options.similarityColumn === false
|
|
56
56
|
? undefined
|
|
57
|
-
: options.
|
|
57
|
+
: options.similarityColumn;
|
|
58
58
|
const outputNames = scoreColumn === undefined
|
|
59
59
|
? [newColumn]
|
|
60
60
|
: [newColumn, scoreColumn];
|