@osmix/router 0.0.2

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 (64) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +149 -0
  3. package/dist/src/algorithms/bidirectional.d.ts +19 -0
  4. package/dist/src/algorithms/bidirectional.d.ts.map +1 -0
  5. package/dist/src/algorithms/bidirectional.js +128 -0
  6. package/dist/src/algorithms/bidirectional.js.map +1 -0
  7. package/dist/src/algorithms/index.d.ts +17 -0
  8. package/dist/src/algorithms/index.d.ts.map +1 -0
  9. package/dist/src/algorithms/index.js +19 -0
  10. package/dist/src/algorithms/index.js.map +1 -0
  11. package/dist/src/algorithms/shortest-path.d.ts +24 -0
  12. package/dist/src/algorithms/shortest-path.d.ts.map +1 -0
  13. package/dist/src/algorithms/shortest-path.js +115 -0
  14. package/dist/src/algorithms/shortest-path.js.map +1 -0
  15. package/dist/src/binary-heap.d.ts +40 -0
  16. package/dist/src/binary-heap.d.ts.map +1 -0
  17. package/dist/src/binary-heap.js +122 -0
  18. package/dist/src/binary-heap.js.map +1 -0
  19. package/dist/src/graph.d.ts +135 -0
  20. package/dist/src/graph.d.ts.map +1 -0
  21. package/dist/src/graph.js +339 -0
  22. package/dist/src/graph.js.map +1 -0
  23. package/dist/src/index.d.ts +41 -0
  24. package/dist/src/index.d.ts.map +1 -0
  25. package/dist/src/index.js +41 -0
  26. package/dist/src/index.js.map +1 -0
  27. package/dist/src/router.d.ts +55 -0
  28. package/dist/src/router.d.ts.map +1 -0
  29. package/dist/src/router.js +189 -0
  30. package/dist/src/router.js.map +1 -0
  31. package/dist/src/types.d.ts +118 -0
  32. package/dist/src/types.d.ts.map +1 -0
  33. package/dist/src/types.js +5 -0
  34. package/dist/src/types.js.map +1 -0
  35. package/dist/src/utils.d.ts +20 -0
  36. package/dist/src/utils.d.ts.map +1 -0
  37. package/dist/src/utils.js +101 -0
  38. package/dist/src/utils.js.map +1 -0
  39. package/dist/test/algorithms.test.d.ts +2 -0
  40. package/dist/test/algorithms.test.d.ts.map +1 -0
  41. package/dist/test/algorithms.test.js +382 -0
  42. package/dist/test/algorithms.test.js.map +1 -0
  43. package/dist/test/router.bench.d.ts +2 -0
  44. package/dist/test/router.bench.d.ts.map +1 -0
  45. package/dist/test/router.bench.js +191 -0
  46. package/dist/test/router.bench.js.map +1 -0
  47. package/dist/test/router.test.d.ts +2 -0
  48. package/dist/test/router.test.d.ts.map +1 -0
  49. package/dist/test/router.test.js +515 -0
  50. package/dist/test/router.test.js.map +1 -0
  51. package/package.json +51 -0
  52. package/src/algorithms/bidirectional.ts +147 -0
  53. package/src/algorithms/index.ts +23 -0
  54. package/src/algorithms/shortest-path.ts +149 -0
  55. package/src/binary-heap.ts +147 -0
  56. package/src/graph.ts +414 -0
  57. package/src/index.ts +41 -0
  58. package/src/router.ts +262 -0
  59. package/src/types.ts +138 -0
  60. package/src/utils.ts +114 -0
  61. package/test/algorithms.test.ts +466 -0
  62. package/test/router.bench.ts +257 -0
  63. package/test/router.test.ts +738 -0
  64. package/tsconfig.json +9 -0
@@ -0,0 +1,382 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { astar, bidirectional, dijkstra } from "../src/algorithms";
3
+ /**
4
+ * Test suite for individual routing algorithms.
5
+ *
6
+ * These tests verify the core behavior of each algorithm in isolation,
7
+ * using simple mock graphs instead of full OSM data. This allows us to
8
+ * test specific edge cases and verify algorithm correctness.
9
+ */
10
+ // ---------------------------------------------------------------------------
11
+ // Mock Graph Helpers
12
+ // ---------------------------------------------------------------------------
13
+ /**
14
+ * Creates a simple graph function from an adjacency list.
15
+ * The adjacency list maps node IDs to their outgoing edges.
16
+ */
17
+ function createGraph(adjacencyList) {
18
+ return (nodeId) => adjacencyList.get(nodeId) ?? [];
19
+ }
20
+ /**
21
+ * Simple edge weight function that uses distance.
22
+ */
23
+ function distanceWeight(edge) {
24
+ return edge.distance;
25
+ }
26
+ /**
27
+ * Creates a mock edge with default values.
28
+ */
29
+ function mockEdge(targetNodeIndex, wayIndex, distance) {
30
+ return {
31
+ targetNodeIndex: targetNodeIndex,
32
+ wayIndex,
33
+ distance,
34
+ time: distance / 10, // 10 m/s default speed
35
+ };
36
+ }
37
+ /**
38
+ * Creates a simple linear graph: 1 <-> 2 <-> 3 <-> 4
39
+ * Bidirectional edges for proper routing.
40
+ */
41
+ function createLinearGraph() {
42
+ return new Map([
43
+ [1, [mockEdge(2, 100, 10)]],
44
+ [2, [mockEdge(1, 100, 10), mockEdge(3, 101, 10)]],
45
+ [3, [mockEdge(2, 101, 10), mockEdge(4, 102, 10)]],
46
+ [4, [mockEdge(3, 102, 10)]],
47
+ ]);
48
+ }
49
+ /**
50
+ * Creates a graph with multiple paths (bidirectional):
51
+ *
52
+ * 1 <---(way 100, dist 10)---> 2
53
+ * ^ ^
54
+ * | (way 101, dist 5) | (way 102, dist 5)
55
+ * v v
56
+ * 3 <---(way 103, dist 10)---> 4
57
+ *
58
+ * Path 1->2->4 has distance 15
59
+ * Path 1->3->4 has distance 15
60
+ */
61
+ function createSquareGraph() {
62
+ return new Map([
63
+ [1, [mockEdge(2, 100, 10), mockEdge(3, 101, 5)]],
64
+ [2, [mockEdge(1, 100, 10), mockEdge(4, 102, 5)]],
65
+ [3, [mockEdge(1, 101, 5), mockEdge(4, 103, 10)]],
66
+ [4, [mockEdge(2, 102, 5), mockEdge(3, 103, 10)]],
67
+ ]);
68
+ }
69
+ /**
70
+ * Creates a graph where shortest path is indirect (bidirectional):
71
+ *
72
+ * 1 <---(way 100, dist 100)---> 4 (direct but long)
73
+ * ^
74
+ * | (way 101, dist 10)
75
+ * v
76
+ * 2 <---(way 102, dist 10)---> 3 <---(way 103, dist 10)---> 4
77
+ *
78
+ * Direct path: 100
79
+ * Indirect path: 30 (should be chosen)
80
+ */
81
+ function createIndirectShorterGraph() {
82
+ return new Map([
83
+ [
84
+ 1,
85
+ [
86
+ mockEdge(4, 100, 100), // Direct but long
87
+ mockEdge(2, 101, 10), // Indirect start
88
+ ],
89
+ ],
90
+ [2, [mockEdge(1, 101, 10), mockEdge(3, 102, 10)]],
91
+ [3, [mockEdge(2, 102, 10), mockEdge(4, 103, 10)]],
92
+ [4, [mockEdge(1, 100, 100), mockEdge(3, 103, 10)]],
93
+ ]);
94
+ }
95
+ /**
96
+ * Creates a disconnected graph where node 4 is unreachable.
97
+ * Nodes 1-3 are connected bidirectionally, but 4 has no edges.
98
+ */
99
+ function createDisconnectedGraph() {
100
+ return new Map([
101
+ [1, [mockEdge(2, 100, 10)]],
102
+ [2, [mockEdge(1, 100, 10), mockEdge(3, 101, 10)]],
103
+ [3, [mockEdge(2, 101, 10)]],
104
+ [4, []], // Unreachable - no edges to/from this node
105
+ ]);
106
+ }
107
+ /**
108
+ * Creates a mock coordinate function for A* heuristic.
109
+ *
110
+ * The coordinates are carefully chosen so that the heuristic (straight-line
111
+ * distance) is admissible - it never overestimates the actual path cost.
112
+ * This ensures A* will find optimal paths.
113
+ *
114
+ * Node layout (not to scale):
115
+ * 1 ---- 2 ---- 3 ---- 4
116
+ *
117
+ * Each segment is ~5m (0.00005 degrees), so total 1->4 is ~15m.
118
+ * Edge weights are 10+ units, so heuristic <= actual cost (admissible).
119
+ */
120
+ function createCoordFn() {
121
+ const coords = new Map([
122
+ [1, [0, 0]],
123
+ [2, [0.00005, 0]], // ~5m east
124
+ [3, [0.0001, 0]], // ~10m east
125
+ [4, [0.00015, 0]], // ~15m east
126
+ ]);
127
+ return (nodeId) => coords.get(nodeId);
128
+ }
129
+ // ---------------------------------------------------------------------------
130
+ // Dijkstra Tests
131
+ // ---------------------------------------------------------------------------
132
+ describe("dijkstra", () => {
133
+ it("should find direct path between adjacent nodes", () => {
134
+ const graph = createGraph(createLinearGraph());
135
+ const path = dijkstra(graph, 1, 2, distanceWeight);
136
+ expect(path).not.toBeNull();
137
+ expect(path?.length).toBe(2);
138
+ expect(path?.[0]?.nodeIndex).toBe(1);
139
+ expect(path?.[1]?.nodeIndex).toBe(2);
140
+ expect(path?.[1]?.wayIndex).toBe(100);
141
+ });
142
+ it("should find path through multiple nodes", () => {
143
+ const graph = createGraph(createLinearGraph());
144
+ const path = dijkstra(graph, 1, 4, distanceWeight);
145
+ expect(path).not.toBeNull();
146
+ expect(path?.length).toBe(4);
147
+ // Verify node order
148
+ const nodeIds = path?.map((p) => p.nodeIndex);
149
+ expect(nodeIds).toEqual([1, 2, 3, 4]);
150
+ // Verify way indexes are tracked
151
+ expect(path?.[1]?.wayIndex).toBe(100);
152
+ expect(path?.[2]?.wayIndex).toBe(101);
153
+ expect(path?.[3]?.wayIndex).toBe(102);
154
+ });
155
+ it("should return null when no path exists", () => {
156
+ const graph = createGraph(createDisconnectedGraph());
157
+ const path = dijkstra(graph, 1, 4, distanceWeight);
158
+ expect(path).toBeNull();
159
+ });
160
+ it("should handle same start and end node", () => {
161
+ const graph = createGraph(createLinearGraph());
162
+ const path = dijkstra(graph, 1, 1, distanceWeight);
163
+ expect(path).not.toBeNull();
164
+ expect(path?.length).toBe(1);
165
+ expect(path?.[0]?.nodeIndex).toBe(1);
166
+ });
167
+ it("should find shortest path when indirect is shorter", () => {
168
+ const graph = createGraph(createIndirectShorterGraph());
169
+ const path = dijkstra(graph, 1, 4, distanceWeight);
170
+ expect(path).not.toBeNull();
171
+ // Should take indirect route 1->2->3->4 (cost 30) not 1->4 (cost 100)
172
+ const nodeIds = path?.map((p) => p.nodeIndex);
173
+ expect(nodeIds).toEqual([1, 2, 3, 4]);
174
+ // Verify total cost
175
+ const lastSegment = path?.[path.length - 1];
176
+ expect(lastSegment?.cost).toBe(30);
177
+ });
178
+ it("should calculate correct costs", () => {
179
+ const graph = createGraph(createLinearGraph());
180
+ const path = dijkstra(graph, 1, 4, distanceWeight);
181
+ expect(path).not.toBeNull();
182
+ // Each edge has distance 10
183
+ expect(path?.[0]?.cost).toBe(0); // Start node
184
+ expect(path?.[1]?.cost).toBe(10);
185
+ expect(path?.[2]?.cost).toBe(20);
186
+ expect(path?.[3]?.cost).toBe(30);
187
+ });
188
+ it("should track correct way indexes in path", () => {
189
+ const graph = createGraph(createSquareGraph());
190
+ const path = dijkstra(graph, 1, 4, distanceWeight);
191
+ expect(path).not.toBeNull();
192
+ // Verify way indexes are present for traversed edges
193
+ const wayIndexes = path?.slice(1).map((p) => p.wayIndex);
194
+ expect(wayIndexes?.every((idx) => idx !== undefined)).toBe(true);
195
+ });
196
+ });
197
+ // ---------------------------------------------------------------------------
198
+ // A* Tests
199
+ // ---------------------------------------------------------------------------
200
+ describe("astar", () => {
201
+ it("should find direct path between adjacent nodes", () => {
202
+ const graph = createGraph(createLinearGraph());
203
+ const path = astar(graph, 1, 2, distanceWeight, createCoordFn());
204
+ expect(path).not.toBeNull();
205
+ expect(path?.length).toBe(2);
206
+ expect(path?.[0]?.nodeIndex).toBe(1);
207
+ expect(path?.[1]?.nodeIndex).toBe(2);
208
+ });
209
+ it("should find path through multiple nodes", () => {
210
+ const graph = createGraph(createLinearGraph());
211
+ const path = astar(graph, 1, 4, distanceWeight, createCoordFn());
212
+ expect(path).not.toBeNull();
213
+ const nodeIds = path?.map((p) => p.nodeIndex);
214
+ expect(nodeIds).toEqual([1, 2, 3, 4]);
215
+ });
216
+ it("should return null when no path exists", () => {
217
+ const graph = createGraph(createDisconnectedGraph());
218
+ const path = astar(graph, 1, 4, distanceWeight, createCoordFn());
219
+ expect(path).toBeNull();
220
+ });
221
+ it("should handle same start and end node", () => {
222
+ const graph = createGraph(createLinearGraph());
223
+ const path = astar(graph, 1, 1, distanceWeight, createCoordFn());
224
+ expect(path).not.toBeNull();
225
+ expect(path?.length).toBe(1);
226
+ expect(path?.[0]?.nodeIndex).toBe(1);
227
+ });
228
+ it("should find shortest path when indirect is shorter", () => {
229
+ const graph = createGraph(createIndirectShorterGraph());
230
+ const path = astar(graph, 1, 4, distanceWeight, createCoordFn());
231
+ expect(path).not.toBeNull();
232
+ const nodeIds = path?.map((p) => p.nodeIndex);
233
+ expect(nodeIds).toEqual([1, 2, 3, 4]);
234
+ });
235
+ it("should use heuristic to guide search", () => {
236
+ // With heuristic, A* should explore fewer nodes than Dijkstra
237
+ // We can verify it finds the correct path
238
+ const graph = createGraph(createIndirectShorterGraph());
239
+ const path = astar(graph, 1, 4, distanceWeight, createCoordFn());
240
+ expect(path).not.toBeNull();
241
+ expect(path?.[path.length - 1]?.cost).toBe(30);
242
+ });
243
+ it("should return null when coordinate function is missing", () => {
244
+ const graph = createGraph(createLinearGraph());
245
+ const path = astar(graph, 1, 4, distanceWeight, undefined);
246
+ expect(path).toBeNull();
247
+ });
248
+ it("should handle missing coordinate for node gracefully", () => {
249
+ const graph = createGraph(createLinearGraph());
250
+ // Coordinate function that only knows about nodes 1 and 4
251
+ const partialCoordFn = (nodeId) => {
252
+ if (nodeId === 1)
253
+ return [0, 0];
254
+ if (nodeId === 4)
255
+ return [0.001, 0.001];
256
+ return undefined;
257
+ };
258
+ const path = astar(graph, 1, 4, distanceWeight, partialCoordFn);
259
+ // A* should still find a path, using 0 heuristic for unknown nodes
260
+ expect(path).not.toBeNull();
261
+ const nodeIds = path?.map((p) => p.nodeIndex);
262
+ expect(nodeIds).toEqual([1, 2, 3, 4]);
263
+ });
264
+ it("should track correct way indexes in path", () => {
265
+ const graph = createGraph(createSquareGraph());
266
+ const path = astar(graph, 1, 4, distanceWeight, createCoordFn());
267
+ expect(path).not.toBeNull();
268
+ const wayIndexes = path?.slice(1).map((p) => p.wayIndex);
269
+ expect(wayIndexes?.every((idx) => idx !== undefined)).toBe(true);
270
+ });
271
+ });
272
+ // ---------------------------------------------------------------------------
273
+ // Bidirectional Tests
274
+ // ---------------------------------------------------------------------------
275
+ describe("bidirectional", () => {
276
+ it("should find direct path between adjacent nodes", () => {
277
+ const graph = createGraph(createLinearGraph());
278
+ const path = bidirectional(graph, 1, 2, distanceWeight);
279
+ expect(path).not.toBeNull();
280
+ // Bidirectional may have different path structure but same nodes
281
+ const nodeIds = path?.map((p) => p.nodeIndex);
282
+ expect(nodeIds).toContain(1);
283
+ expect(nodeIds).toContain(2);
284
+ });
285
+ it("should find path through multiple nodes", () => {
286
+ const graph = createGraph(createLinearGraph());
287
+ const path = bidirectional(graph, 1, 4, distanceWeight);
288
+ expect(path).not.toBeNull();
289
+ const nodeIds = path?.map((p) => p.nodeIndex);
290
+ // Should contain all nodes in the path
291
+ expect(nodeIds).toContain(1);
292
+ expect(nodeIds).toContain(4);
293
+ });
294
+ it("should return null when no path exists", () => {
295
+ const graph = createGraph(createDisconnectedGraph());
296
+ const path = bidirectional(graph, 1, 4, distanceWeight);
297
+ expect(path).toBeNull();
298
+ });
299
+ it("should handle same start and end node", () => {
300
+ const graph = createGraph(createLinearGraph());
301
+ const path = bidirectional(graph, 1, 1, distanceWeight);
302
+ expect(path).not.toBeNull();
303
+ expect(path?.some((p) => p.nodeIndex === 1)).toBe(true);
304
+ });
305
+ it("should meet in the middle correctly", () => {
306
+ // Create a symmetric graph where meeting in middle is clear
307
+ // 1 <-> 2 <-> 3 <-> 4 <-> 5
308
+ const symmetricGraph = new Map([
309
+ [1, [mockEdge(2, 100, 10)]],
310
+ [2, [mockEdge(1, 100, 10), mockEdge(3, 101, 10)]],
311
+ [3, [mockEdge(2, 101, 10), mockEdge(4, 102, 10)]],
312
+ [4, [mockEdge(3, 102, 10), mockEdge(5, 103, 10)]],
313
+ [5, [mockEdge(4, 103, 10)]],
314
+ ]);
315
+ const graph = createGraph(symmetricGraph);
316
+ const path = bidirectional(graph, 1, 5, distanceWeight);
317
+ expect(path).not.toBeNull();
318
+ // Should include start and end
319
+ const nodeIds = path?.map((p) => p.nodeIndex);
320
+ expect(nodeIds).toContain(1);
321
+ expect(nodeIds).toContain(5);
322
+ });
323
+ it("should combine forward and backward paths properly", () => {
324
+ const graph = createGraph(createSquareGraph());
325
+ const path = bidirectional(graph, 1, 4, distanceWeight);
326
+ expect(path).not.toBeNull();
327
+ // Path should go from 1 to 4
328
+ const nodeIds = path?.map((p) => p.nodeIndex);
329
+ expect(nodeIds?.[0]).toBe(1);
330
+ // Last node should be 4 or path should include 4
331
+ expect(nodeIds).toContain(4);
332
+ });
333
+ it("should track way indexes in combined path", () => {
334
+ const graph = createGraph(createSquareGraph());
335
+ const path = bidirectional(graph, 1, 4, distanceWeight);
336
+ expect(path).not.toBeNull();
337
+ // Way indexes should be present (except possibly for start node)
338
+ const wayIndexes = path
339
+ ?.filter((p) => p.wayIndex !== undefined)
340
+ .map((p) => p.wayIndex);
341
+ expect(wayIndexes?.length).toBeGreaterThan(0);
342
+ });
343
+ });
344
+ // ---------------------------------------------------------------------------
345
+ // Cross-Algorithm Comparison Tests
346
+ // ---------------------------------------------------------------------------
347
+ describe("algorithm consistency", () => {
348
+ it("should find same path length with all algorithms", () => {
349
+ const graph = createGraph(createIndirectShorterGraph());
350
+ const dijkstraPath = dijkstra(graph, 1, 4, distanceWeight);
351
+ const astarPath = astar(graph, 1, 4, distanceWeight, createCoordFn());
352
+ const biPath = bidirectional(graph, 1, 4, distanceWeight);
353
+ // All should find a path
354
+ expect(dijkstraPath).not.toBeNull();
355
+ expect(astarPath).not.toBeNull();
356
+ expect(biPath).not.toBeNull();
357
+ // Dijkstra and A* should have same final cost
358
+ const dijkstraCost = dijkstraPath?.[dijkstraPath.length - 1]?.cost;
359
+ const astarCost = astarPath?.[astarPath.length - 1]?.cost;
360
+ expect(dijkstraCost).toBe(astarCost);
361
+ });
362
+ it("all algorithms should return null for unreachable nodes", () => {
363
+ const graph = createGraph(createDisconnectedGraph());
364
+ expect(dijkstra(graph, 1, 4, distanceWeight)).toBeNull();
365
+ expect(astar(graph, 1, 4, distanceWeight, createCoordFn())).toBeNull();
366
+ expect(bidirectional(graph, 1, 4, distanceWeight)).toBeNull();
367
+ });
368
+ it("all algorithms should handle trivial single-node path", () => {
369
+ const graph = createGraph(createLinearGraph());
370
+ const dijkstraPath = dijkstra(graph, 1, 1, distanceWeight);
371
+ const astarPath = astar(graph, 1, 1, distanceWeight, createCoordFn());
372
+ const biPath = bidirectional(graph, 1, 1, distanceWeight);
373
+ expect(dijkstraPath).not.toBeNull();
374
+ expect(astarPath).not.toBeNull();
375
+ expect(biPath).not.toBeNull();
376
+ // All should include node 1
377
+ expect(dijkstraPath?.some((p) => p.nodeIndex === 1)).toBe(true);
378
+ expect(astarPath?.some((p) => p.nodeIndex === 1)).toBe(true);
379
+ expect(biPath?.some((p) => p.nodeIndex === 1)).toBe(true);
380
+ });
381
+ });
382
+ //# sourceMappingURL=algorithms.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"algorithms.test.js","sourceRoot":"","sources":["../../test/algorithms.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=router.bench.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.bench.d.ts","sourceRoot":"","sources":["../../test/router.bench.ts"],"names":[],"mappings":""}
@@ -0,0 +1,191 @@
1
+ import { Osm } from "@osmix/core";
2
+ import { getFixtureFile, PBFs } from "@osmix/shared/test/fixtures";
3
+ import { bench, group, run } from "mitata";
4
+ import { fromPbf } from "osmix";
5
+ import { buildGraph } from "../src";
6
+ import { Router } from "../src/router";
7
+ /**
8
+ * Router Benchmark Suite using mitata
9
+ *
10
+ * Run with: bun test/router.bench.ts
11
+ *
12
+ * These benchmarks compare the performance of different routing algorithms
13
+ * using both real-world OSM data (Monaco) and synthetic grid networks.
14
+ */
15
+ // ---------------------------------------------------------------------------
16
+ // Synthetic Grid Helper
17
+ // ---------------------------------------------------------------------------
18
+ /**
19
+ * Creates a synthetic grid network for benchmarking.
20
+ *
21
+ * The grid consists of nodes arranged in a square pattern with
22
+ * horizontal and vertical ways connecting adjacent nodes.
23
+ *
24
+ * @param size - Number of nodes in each dimension (size x size total)
25
+ * @param spacing - Spacing between nodes in degrees (~100m per 0.001)
26
+ */
27
+ function createSyntheticGrid(size, spacing) {
28
+ const osm = new Osm({ id: "synthetic-grid" });
29
+ // Create nodes in a grid pattern
30
+ for (let row = 0; row < size; row++) {
31
+ for (let col = 0; col < size; col++) {
32
+ const nodeId = row * size + col + 1;
33
+ osm.nodes.addNode({
34
+ id: nodeId,
35
+ lat: row * spacing,
36
+ lon: col * spacing,
37
+ });
38
+ }
39
+ }
40
+ osm.nodes.buildIndex();
41
+ osm.nodes.buildSpatialIndex();
42
+ // Create horizontal ways (connecting nodes in each row)
43
+ let wayId = 1;
44
+ for (let row = 0; row < size; row++) {
45
+ const refs = [];
46
+ for (let col = 0; col < size; col++) {
47
+ refs.push(row * size + col + 1);
48
+ }
49
+ osm.ways.addWay({
50
+ id: wayId++,
51
+ refs,
52
+ tags: { highway: "residential" },
53
+ });
54
+ }
55
+ // Create vertical ways (connecting nodes in each column)
56
+ for (let col = 0; col < size; col++) {
57
+ const refs = [];
58
+ for (let row = 0; row < size; row++) {
59
+ refs.push(row * size + col + 1);
60
+ }
61
+ osm.ways.addWay({
62
+ id: wayId++,
63
+ refs,
64
+ tags: { highway: "residential" },
65
+ });
66
+ }
67
+ osm.ways.buildIndex();
68
+ osm.ways.buildSpatialIndex();
69
+ osm.buildIndexes();
70
+ return osm;
71
+ }
72
+ // ---------------------------------------------------------------------------
73
+ // Setup
74
+ // ---------------------------------------------------------------------------
75
+ console.log("Setting up benchmark data...");
76
+ // Load Monaco PBF
77
+ const monacoPbf = PBFs["monaco"];
78
+ const pbfData = await getFixtureFile(monacoPbf.url);
79
+ const monacoOsm = await fromPbf(pbfData, {
80
+ buildSpatialIndexes: ["node", "way"],
81
+ });
82
+ const monacoGraph = buildGraph(monacoOsm);
83
+ const monacoRouter = new Router(monacoOsm, monacoGraph);
84
+ // Create synthetic grid
85
+ const GRID_SIZE = 50;
86
+ const GRID_SPACING = 0.001;
87
+ const gridOsm = createSyntheticGrid(GRID_SIZE, GRID_SPACING);
88
+ const gridGraph = buildGraph(gridOsm);
89
+ const gridRouter = new Router(gridOsm, gridGraph);
90
+ // Pre-snap coordinates to node indexes for benchmarking
91
+ const monacoShortFrom = monacoGraph.findNearestRoutableNode(monacoOsm, [7.42, 43.735], 500).nodeIndex;
92
+ const monacoShortTo = monacoGraph.findNearestRoutableNode(monacoOsm, [7.425, 43.738], 500).nodeIndex;
93
+ const monacoLongFrom = monacoGraph.findNearestRoutableNode(monacoOsm, [7.41, 43.725], 500).nodeIndex;
94
+ const monacoLongTo = monacoGraph.findNearestRoutableNode(monacoOsm, [7.44, 43.745], 500).nodeIndex;
95
+ const gridShortFrom = gridGraph.findNearestRoutableNode(gridOsm, [0.01, 0.01], 200).nodeIndex;
96
+ const gridShortTo = gridGraph.findNearestRoutableNode(gridOsm, [0.015, 0.015], 200).nodeIndex;
97
+ const gridLongFrom = gridGraph.findNearestRoutableNode(gridOsm, [0, 0], 200).nodeIndex;
98
+ const gridLongTo = gridGraph.findNearestRoutableNode(gridOsm, [(GRID_SIZE - 1) * GRID_SPACING, (GRID_SIZE - 1) * GRID_SPACING], 200).nodeIndex;
99
+ console.log("Setup complete. Running benchmarks...\n");
100
+ // ---------------------------------------------------------------------------
101
+ // Monaco PBF Benchmarks
102
+ // ---------------------------------------------------------------------------
103
+ group("Monaco - Short Distance (~500m)", () => {
104
+ bench("Dijkstra", () => {
105
+ monacoRouter.route(monacoShortFrom, monacoShortTo, {
106
+ algorithm: "dijkstra",
107
+ });
108
+ });
109
+ bench("A*", () => {
110
+ monacoRouter.route(monacoShortFrom, monacoShortTo, {
111
+ algorithm: "astar",
112
+ });
113
+ });
114
+ bench("Bidirectional", () => {
115
+ monacoRouter.route(monacoShortFrom, monacoShortTo, {
116
+ algorithm: "bidirectional",
117
+ });
118
+ });
119
+ });
120
+ group("Monaco - Long Distance (~2km)", () => {
121
+ bench("Dijkstra", () => {
122
+ monacoRouter.route(monacoLongFrom, monacoLongTo, {
123
+ algorithm: "dijkstra",
124
+ });
125
+ });
126
+ bench("A*", () => {
127
+ monacoRouter.route(monacoLongFrom, monacoLongTo, {
128
+ algorithm: "astar",
129
+ });
130
+ });
131
+ bench("Bidirectional", () => {
132
+ monacoRouter.route(monacoLongFrom, monacoLongTo, {
133
+ algorithm: "bidirectional",
134
+ });
135
+ });
136
+ });
137
+ // ---------------------------------------------------------------------------
138
+ // Synthetic Grid Benchmarks
139
+ // ---------------------------------------------------------------------------
140
+ group("Grid 50x50 - Short Path", () => {
141
+ bench("Dijkstra", () => {
142
+ gridRouter.route(gridShortFrom, gridShortTo, {
143
+ algorithm: "dijkstra",
144
+ });
145
+ });
146
+ bench("A*", () => {
147
+ gridRouter.route(gridShortFrom, gridShortTo, {
148
+ algorithm: "astar",
149
+ });
150
+ });
151
+ bench("Bidirectional", () => {
152
+ gridRouter.route(gridShortFrom, gridShortTo, {
153
+ algorithm: "bidirectional",
154
+ });
155
+ });
156
+ });
157
+ group("Grid 50x50 - Long Path (corner to corner)", () => {
158
+ bench("Dijkstra", () => {
159
+ gridRouter.route(gridLongFrom, gridLongTo, {
160
+ algorithm: "dijkstra",
161
+ });
162
+ });
163
+ bench("A*", () => {
164
+ gridRouter.route(gridLongFrom, gridLongTo, {
165
+ algorithm: "astar",
166
+ });
167
+ });
168
+ bench("Bidirectional", () => {
169
+ gridRouter.route(gridLongFrom, gridLongTo, {
170
+ algorithm: "bidirectional",
171
+ });
172
+ });
173
+ });
174
+ // ---------------------------------------------------------------------------
175
+ // Router Initialization Benchmarks
176
+ // ---------------------------------------------------------------------------
177
+ group("Router Initialization", () => {
178
+ bench("Monaco OSM (14k nodes, 3k ways)", () => {
179
+ new Router(monacoOsm, buildGraph(monacoOsm));
180
+ });
181
+ bench("Grid 50x50 (2.5k nodes)", () => {
182
+ new Router(gridOsm, buildGraph(gridOsm));
183
+ });
184
+ });
185
+ // ---------------------------------------------------------------------------
186
+ // Run benchmarks
187
+ // ---------------------------------------------------------------------------
188
+ await run({
189
+ colors: true,
190
+ });
191
+ //# sourceMappingURL=router.bench.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.bench.js","sourceRoot":"","sources":["../../test/router.bench.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=router.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.test.d.ts","sourceRoot":"","sources":["../../test/router.test.ts"],"names":[],"mappings":""}