@linklabjs/core 0.1.0 → 0.1.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.
- package/dist/api/DomainNode.d.ts +154 -0
- package/dist/api/DomainNode.d.ts.map +1 -0
- package/dist/api/DomainNode.js +1157 -0
- package/dist/api/DomainNode.js.map +1 -0
- package/dist/api/Graph.d.ts +117 -0
- package/dist/api/Graph.d.ts.map +1 -0
- package/dist/api/Graph.js +212 -0
- package/dist/api/Graph.js.map +1 -0
- package/dist/api/PathBuilder.d.ts +76 -0
- package/dist/api/PathBuilder.d.ts.map +1 -0
- package/dist/api/PathBuilder.js +182 -0
- package/dist/api/PathBuilder.js.map +1 -0
- package/dist/api/index.d.ts +8 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +7 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/loadGraph.d.ts +57 -0
- package/dist/api/loadGraph.d.ts.map +1 -0
- package/dist/api/loadGraph.js +153 -0
- package/dist/api/loadGraph.js.map +1 -0
- package/dist/api/test-api.d.ts +9 -0
- package/dist/api/test-api.d.ts.map +1 -0
- package/dist/api/test-api.js +133 -0
- package/dist/api/test-api.js.map +1 -0
- package/dist/api/test-domain.d.ts +13 -0
- package/dist/api/test-domain.d.ts.map +1 -0
- package/dist/api/test-domain.js +105 -0
- package/dist/api/test-domain.js.map +1 -0
- package/dist/api/types.d.ts +69 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +22 -0
- package/dist/api/types.js.map +1 -0
- package/dist/config/synonyms.json +25 -0
- package/dist/core/EventBus.d.ts +56 -0
- package/dist/core/EventBus.d.ts.map +1 -0
- package/dist/core/EventBus.js +147 -0
- package/dist/core/EventBus.js.map +1 -0
- package/dist/core/GraphEvents.d.ts +118 -0
- package/dist/core/GraphEvents.d.ts.map +1 -0
- package/dist/core/GraphEvents.js +23 -0
- package/dist/core/GraphEvents.js.map +1 -0
- package/dist/core/PathFinder.d.ts +43 -0
- package/dist/core/PathFinder.d.ts.map +1 -0
- package/dist/core/PathFinder.js +264 -0
- package/dist/core/PathFinder.js.map +1 -0
- package/dist/formatters/BaseFormatter.d.ts +15 -0
- package/dist/formatters/BaseFormatter.d.ts.map +1 -0
- package/dist/formatters/BaseFormatter.js +9 -0
- package/dist/formatters/BaseFormatter.js.map +1 -0
- package/dist/graph/GraphAssembler.d.ts +14 -0
- package/dist/graph/GraphAssembler.d.ts.map +1 -0
- package/dist/graph/GraphAssembler.js +44 -0
- package/dist/graph/GraphAssembler.js.map +1 -0
- package/dist/graph/GraphCompiler.d.ts +37 -0
- package/dist/graph/GraphCompiler.d.ts.map +1 -0
- package/dist/graph/GraphCompiler.js +355 -0
- package/dist/graph/GraphCompiler.js.map +1 -0
- package/dist/graph/GraphExtractor.d.ts +21 -0
- package/dist/graph/GraphExtractor.d.ts.map +1 -0
- package/dist/graph/GraphExtractor.js +145 -0
- package/dist/graph/GraphExtractor.js.map +1 -0
- package/dist/graph/GraphOptimizer.d.ts +104 -0
- package/dist/graph/GraphOptimizer.d.ts.map +1 -0
- package/dist/graph/GraphOptimizer.js +306 -0
- package/dist/graph/GraphOptimizer.js.map +1 -0
- package/dist/graph/GraphTrainer.d.ts +52 -0
- package/dist/graph/GraphTrainer.d.ts.map +1 -0
- package/dist/graph/GraphTrainer.js +188 -0
- package/dist/graph/GraphTrainer.js.map +1 -0
- package/dist/http/LinkBuilder.d.ts +82 -0
- package/dist/http/LinkBuilder.d.ts.map +1 -0
- package/dist/http/LinkBuilder.js +190 -0
- package/dist/http/LinkBuilder.js.map +1 -0
- package/dist/http/TrailRequest.d.ts +39 -0
- package/dist/http/TrailRequest.d.ts.map +1 -0
- package/dist/http/TrailRequest.js +22 -0
- package/dist/http/TrailRequest.js.map +1 -0
- package/dist/http/example-netflix.d.ts +6 -0
- package/dist/http/example-netflix.d.ts.map +1 -0
- package/dist/http/example-netflix.js +52 -0
- package/dist/http/example-netflix.js.map +1 -0
- package/dist/http/index.d.ts +32 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +27 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/plugin.d.ts +110 -0
- package/dist/http/plugin.d.ts.map +1 -0
- package/dist/http/plugin.js +217 -0
- package/dist/http/plugin.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +71 -0
- package/dist/index.js.map +1 -0
- package/dist/instrumentation/TelemetryShim.d.ts +114 -0
- package/dist/instrumentation/TelemetryShim.d.ts.map +1 -0
- package/dist/instrumentation/TelemetryShim.js +107 -0
- package/dist/instrumentation/TelemetryShim.js.map +1 -0
- package/dist/navigation/NavigationEngine.d.ts +69 -0
- package/dist/navigation/NavigationEngine.d.ts.map +1 -0
- package/dist/navigation/NavigationEngine.js +361 -0
- package/dist/navigation/NavigationEngine.js.map +1 -0
- package/dist/navigation/Resolver.d.ts +35 -0
- package/dist/navigation/Resolver.d.ts.map +1 -0
- package/dist/navigation/Resolver.js +113 -0
- package/dist/navigation/Resolver.js.map +1 -0
- package/dist/navigation/Scheduler.d.ts +36 -0
- package/dist/navigation/Scheduler.d.ts.map +1 -0
- package/dist/navigation/Scheduler.js +107 -0
- package/dist/navigation/Scheduler.js.map +1 -0
- package/dist/navigation/Trail.d.ts +129 -0
- package/dist/navigation/Trail.d.ts.map +1 -0
- package/dist/navigation/Trail.js +202 -0
- package/dist/navigation/Trail.js.map +1 -0
- package/dist/navigation/TrailParser.d.ts +96 -0
- package/dist/navigation/TrailParser.d.ts.map +1 -0
- package/dist/navigation/TrailParser.js +180 -0
- package/dist/navigation/TrailParser.js.map +1 -0
- package/dist/navigation/index.d.ts +10 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +9 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/providers/MockProvider.d.ts +29 -0
- package/dist/providers/MockProvider.d.ts.map +1 -0
- package/dist/providers/MockProvider.js +55 -0
- package/dist/providers/MockProvider.js.map +1 -0
- package/dist/providers/PostgresProvider.d.ts +46 -0
- package/dist/providers/PostgresProvider.d.ts.map +1 -0
- package/dist/providers/PostgresProvider.js +152 -0
- package/dist/providers/PostgresProvider.js.map +1 -0
- package/dist/runtime/CompiledGraphEngine.d.ts +74 -0
- package/dist/runtime/CompiledGraphEngine.d.ts.map +1 -0
- package/dist/runtime/CompiledGraphEngine.js +211 -0
- package/dist/runtime/CompiledGraphEngine.js.map +1 -0
- package/dist/runtime/DataLoader.d.ts +90 -0
- package/dist/runtime/DataLoader.d.ts.map +1 -0
- package/dist/runtime/DataLoader.js +178 -0
- package/dist/runtime/DataLoader.js.map +1 -0
- package/dist/runtime/Engine.d.ts +36 -0
- package/dist/runtime/Engine.d.ts.map +1 -0
- package/dist/runtime/Engine.js +128 -0
- package/dist/runtime/Engine.js.map +1 -0
- package/dist/runtime/QueryEngine.d.ts +80 -0
- package/dist/runtime/QueryEngine.d.ts.map +1 -0
- package/dist/runtime/QueryEngine.js +188 -0
- package/dist/runtime/QueryEngine.js.map +1 -0
- package/dist/scenarios/test-metro-paris/config.json +6 -0
- package/dist/scenarios/test-metro-paris/graph.json +16325 -0
- package/dist/scenarios/test-metro-paris/queries.d.ts +22 -0
- package/dist/scenarios/test-metro-paris/queries.d.ts.map +1 -0
- package/dist/scenarios/test-metro-paris/queries.js +128 -0
- package/dist/scenarios/test-metro-paris/queries.js.map +1 -0
- package/dist/scenarios/test-metro-paris/stack.json +1 -0
- package/dist/scenarios/test-musicians/config.json +10 -0
- package/dist/scenarios/test-musicians/graph.json +20 -0
- package/dist/scenarios/test-musicians/stack.json +1 -0
- package/dist/scenarios/test-netflix/actions.d.ts +14 -0
- package/dist/scenarios/test-netflix/actions.d.ts.map +1 -0
- package/dist/scenarios/test-netflix/actions.js +86 -0
- package/dist/scenarios/test-netflix/actions.js.map +1 -0
- package/dist/scenarios/test-netflix/config.json +6 -0
- package/dist/scenarios/test-netflix/data/categories.json +1 -0
- package/dist/scenarios/test-netflix/data/companies.json +1 -0
- package/dist/scenarios/test-netflix/data/credits.json +19797 -0
- package/dist/scenarios/test-netflix/data/departments.json +18 -0
- package/dist/scenarios/test-netflix/data/jobs.json +142 -0
- package/dist/scenarios/test-netflix/data/movies.json +3497 -0
- package/dist/scenarios/test-netflix/data/people.json +1 -0
- package/dist/scenarios/test-netflix/data/synonyms.json +7 -0
- package/dist/scenarios/test-netflix/data/users.json +70 -0
- package/dist/scenarios/test-netflix/graph.json +1017 -0
- package/dist/scenarios/test-netflix/queries.d.ts +29 -0
- package/dist/scenarios/test-netflix/queries.d.ts.map +1 -0
- package/dist/scenarios/test-netflix/queries.js +134 -0
- package/dist/scenarios/test-netflix/queries.js.map +1 -0
- package/dist/scenarios/test-netflix/stack.json +14 -0
- package/dist/schema/GraphBuilder.d.ts +9 -0
- package/dist/schema/GraphBuilder.d.ts.map +1 -0
- package/dist/schema/GraphBuilder.js +90 -0
- package/dist/schema/GraphBuilder.js.map +1 -0
- package/dist/schema/JsonSchemaExtractor.d.ts +21 -0
- package/dist/schema/JsonSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/JsonSchemaExtractor.js +88 -0
- package/dist/schema/JsonSchemaExtractor.js.map +1 -0
- package/dist/schema/SchemaAnalyzer.d.ts +41 -0
- package/dist/schema/SchemaAnalyzer.d.ts.map +1 -0
- package/dist/schema/SchemaAnalyzer.js +144 -0
- package/dist/schema/SchemaAnalyzer.js.map +1 -0
- package/dist/schema/SchemaExtractor.d.ts +10 -0
- package/dist/schema/SchemaExtractor.d.ts.map +1 -0
- package/dist/schema/SchemaExtractor.js +90 -0
- package/dist/schema/SchemaExtractor.js.map +1 -0
- package/dist/schema/SynonymResolver.d.ts +55 -0
- package/dist/schema/SynonymResolver.d.ts.map +1 -0
- package/dist/schema/SynonymResolver.js +121 -0
- package/dist/schema/SynonymResolver.js.map +1 -0
- package/dist/scripts/dictionary.json +796 -0
- package/dist/scripts/graph.json +664 -0
- package/dist/scripts/regenerate.d.ts +23 -0
- package/dist/scripts/regenerate.d.ts.map +1 -0
- package/dist/scripts/regenerate.js +206 -0
- package/dist/scripts/regenerate.js.map +1 -0
- package/dist/types/index.d.ts +394 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PathFinder - Dijkstra + DFS limité
|
|
3
|
+
*
|
|
4
|
+
* Deux algorithmes selon l'usage :
|
|
5
|
+
*
|
|
6
|
+
* findShortestPath() → Dijkstra (chemin optimal garanti, performant)
|
|
7
|
+
* findAllPaths() → DFS limité (N meilleurs chemins alternatifs)
|
|
8
|
+
*
|
|
9
|
+
* Sur un graphe de métro (300+ stations, 900+ arêtes),
|
|
10
|
+
* le DFS pur explose. Dijkstra est l'algorithme correct.
|
|
11
|
+
*/
|
|
12
|
+
export class PathFinder {
|
|
13
|
+
graph;
|
|
14
|
+
adjacencyList;
|
|
15
|
+
constructor(graph) {
|
|
16
|
+
this.graph = graph;
|
|
17
|
+
this.adjacencyList = this.buildAdjacencyList(graph);
|
|
18
|
+
}
|
|
19
|
+
// ==================== DIJKSTRA ====================
|
|
20
|
+
/**
|
|
21
|
+
* Chemin le plus court par poids (Dijkstra).
|
|
22
|
+
* Garanti optimal. Performant sur grands graphes.
|
|
23
|
+
*/
|
|
24
|
+
findShortestPath(from, to) {
|
|
25
|
+
const dist = new Map();
|
|
26
|
+
const prev = new Map();
|
|
27
|
+
const visited = new Set();
|
|
28
|
+
// Initialisation
|
|
29
|
+
for (const node of this.graph.nodes) {
|
|
30
|
+
dist.set(node.id, Infinity);
|
|
31
|
+
}
|
|
32
|
+
dist.set(from, 0);
|
|
33
|
+
prev.set(from, null);
|
|
34
|
+
// Priority queue simple (pour notre taille, suffisant)
|
|
35
|
+
const queue = new Set(this.graph.nodes.map(n => n.id));
|
|
36
|
+
while (queue.size > 0) {
|
|
37
|
+
// Nœud non visité avec distance minimale
|
|
38
|
+
let u = null;
|
|
39
|
+
let minDist = Infinity;
|
|
40
|
+
for (const node of queue) {
|
|
41
|
+
const d = dist.get(node) ?? Infinity;
|
|
42
|
+
if (d < minDist) {
|
|
43
|
+
minDist = d;
|
|
44
|
+
u = node;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (u === null || u === to)
|
|
48
|
+
break;
|
|
49
|
+
if (minDist === Infinity)
|
|
50
|
+
break; // Graphe non connexe
|
|
51
|
+
queue.delete(u);
|
|
52
|
+
visited.add(u);
|
|
53
|
+
const neighbors = this.adjacencyList.get(u) ?? [];
|
|
54
|
+
for (const { to: v, edge } of neighbors) {
|
|
55
|
+
if (visited.has(v))
|
|
56
|
+
continue;
|
|
57
|
+
const alt = (dist.get(u) ?? Infinity) + edge.weight;
|
|
58
|
+
if (alt < (dist.get(v) ?? Infinity)) {
|
|
59
|
+
dist.set(v, alt);
|
|
60
|
+
prev.set(v, { node: u, edge });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (!prev.has(to) && to !== from)
|
|
65
|
+
return null;
|
|
66
|
+
if ((dist.get(to) ?? Infinity) === Infinity)
|
|
67
|
+
return null;
|
|
68
|
+
// Reconstruction du chemin
|
|
69
|
+
const path = [];
|
|
70
|
+
const edges = [];
|
|
71
|
+
let current = to;
|
|
72
|
+
while (current !== null) {
|
|
73
|
+
path.unshift(current);
|
|
74
|
+
const p = prev.get(current);
|
|
75
|
+
if (p) {
|
|
76
|
+
edges.unshift(p.edge);
|
|
77
|
+
current = p.node;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
current = null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
path,
|
|
85
|
+
edges,
|
|
86
|
+
length: path.length,
|
|
87
|
+
joins: path.length - 1,
|
|
88
|
+
weight: dist.get(to) ?? 0,
|
|
89
|
+
indirect: path.length > 2
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* N meilleurs chemins (Yen's K-shortest paths simplifié).
|
|
94
|
+
* Trouve le plus court via Dijkstra, puis des alternatives
|
|
95
|
+
* en pénalisant les arêtes du chemin précédent.
|
|
96
|
+
*/
|
|
97
|
+
findAllPaths(from, to, maxPaths = 3, _maxDepth = 50, transferPenalty = 0, allowedVia, minHops = 0) {
|
|
98
|
+
const results = [];
|
|
99
|
+
const penalized = new Set(); // arêtes temporairement exclues
|
|
100
|
+
for (let k = 0; k < maxPaths; k++) {
|
|
101
|
+
const result = this.dijkstraWithExclusions(from, to, penalized, transferPenalty, allowedVia, minHops);
|
|
102
|
+
if (!result)
|
|
103
|
+
break;
|
|
104
|
+
results.push(result);
|
|
105
|
+
// Pénaliser la dernière arête du chemin trouvé pour forcer une alternative
|
|
106
|
+
if (result.edges.length > 0) {
|
|
107
|
+
const lastEdge = result.edges[result.edges.length - 1];
|
|
108
|
+
penalized.add(lastEdge.name ?? `${lastEdge.from}->${lastEdge.to}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return results.map(r => r.path);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Dijkstra avec exclusion d'arêtes (pour les chemins alternatifs)
|
|
115
|
+
*/
|
|
116
|
+
dijkstraWithExclusions(from, to, excluded, transferPenalty = 0, allowedVia, minHops = 0) {
|
|
117
|
+
const dist = new Map();
|
|
118
|
+
const prev = new Map();
|
|
119
|
+
const visited = new Set();
|
|
120
|
+
for (const node of this.graph.nodes)
|
|
121
|
+
dist.set(node.id, Infinity);
|
|
122
|
+
dist.set(from, 0);
|
|
123
|
+
prev.set(from, null);
|
|
124
|
+
const queue = new Set(this.graph.nodes.map(n => n.id));
|
|
125
|
+
while (queue.size > 0) {
|
|
126
|
+
let u = null;
|
|
127
|
+
let minDist = Infinity;
|
|
128
|
+
for (const node of queue) {
|
|
129
|
+
const d = dist.get(node) ?? Infinity;
|
|
130
|
+
if (d < minDist) {
|
|
131
|
+
minDist = d;
|
|
132
|
+
u = node;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (u === null || u === to || minDist === Infinity)
|
|
136
|
+
break;
|
|
137
|
+
queue.delete(u);
|
|
138
|
+
visited.add(u);
|
|
139
|
+
for (const { to: v, edge } of this.adjacencyList.get(u) ?? []) {
|
|
140
|
+
if (visited.has(v))
|
|
141
|
+
continue;
|
|
142
|
+
const edgeKey = edge.name ?? `${edge.from}->${edge.to}`;
|
|
143
|
+
if (excluded.has(edgeKey))
|
|
144
|
+
continue;
|
|
145
|
+
// Filtre via — si spécifié, ignorer les arêtes dont le type n'est pas dans la liste
|
|
146
|
+
if (allowedVia && allowedVia.length > 0) {
|
|
147
|
+
const edgeType = edge.metadata?.type ?? edge.via;
|
|
148
|
+
if (!allowedVia.includes(edgeType))
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
// Pénalité sur changement de ligne — deux cas :
|
|
152
|
+
// 1. Arête explicitement TRANSFER (self-loop de correspondance)
|
|
153
|
+
// 2. Changement de ligne implicite (arête DIRECT mais ligne différente de la précédente)
|
|
154
|
+
let penalty = 0;
|
|
155
|
+
if (transferPenalty > 0) {
|
|
156
|
+
const isExplicitTransfer = edge.metadata?.type === 'TRANSFER';
|
|
157
|
+
const prevEdge = prev.get(u);
|
|
158
|
+
const prevLineId = prevEdge?.edge?.metadata?.lineId;
|
|
159
|
+
const currLineId = edge.metadata?.lineId;
|
|
160
|
+
const isLineChange = prevLineId && currLineId && prevLineId !== currLineId
|
|
161
|
+
&& edge.metadata?.type !== 'TRANSFER';
|
|
162
|
+
if (isExplicitTransfer || isLineChange) {
|
|
163
|
+
penalty = transferPenalty;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const alt = (dist.get(u) ?? Infinity) + edge.weight + penalty;
|
|
167
|
+
if (alt < (dist.get(v) ?? Infinity)) {
|
|
168
|
+
dist.set(v, alt);
|
|
169
|
+
prev.set(v, { node: u, edge });
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if ((dist.get(to) ?? Infinity) === Infinity)
|
|
174
|
+
return null;
|
|
175
|
+
const path = [];
|
|
176
|
+
const edges = [];
|
|
177
|
+
let current = to;
|
|
178
|
+
while (current !== null) {
|
|
179
|
+
path.unshift(current);
|
|
180
|
+
const p = prev.get(current);
|
|
181
|
+
if (p) {
|
|
182
|
+
edges.unshift(p.edge);
|
|
183
|
+
current = p.node;
|
|
184
|
+
}
|
|
185
|
+
else
|
|
186
|
+
current = null;
|
|
187
|
+
}
|
|
188
|
+
// Filtre minHops — rejeter les chemins trop courts
|
|
189
|
+
if (minHops > 0 && path.length - 1 < minHops)
|
|
190
|
+
return null;
|
|
191
|
+
return {
|
|
192
|
+
path, edges,
|
|
193
|
+
length: path.length,
|
|
194
|
+
joins: path.length - 1,
|
|
195
|
+
weight: dist.get(to) ?? 0,
|
|
196
|
+
indirect: path.length > 2
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
// ==================== HELPERS ====================
|
|
200
|
+
getPathWeight(path) {
|
|
201
|
+
let total = 0;
|
|
202
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
203
|
+
const edge = this.graph.edges.find(e => e.from === path[i] && e.to === path[i + 1]);
|
|
204
|
+
if (edge)
|
|
205
|
+
total += edge.weight;
|
|
206
|
+
}
|
|
207
|
+
return total;
|
|
208
|
+
}
|
|
209
|
+
getPathDetails(path) {
|
|
210
|
+
const edges = [];
|
|
211
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
212
|
+
const edge = this.graph.edges.find(e => e.from === path[i] && e.to === path[i + 1]);
|
|
213
|
+
if (edge)
|
|
214
|
+
edges.push(edge);
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
path, edges,
|
|
218
|
+
length: path.length,
|
|
219
|
+
joins: path.length - 1,
|
|
220
|
+
weight: this.getPathWeight(path),
|
|
221
|
+
indirect: path.length > 2
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
hasPath(from, to) {
|
|
225
|
+
return this.findShortestPath(from, to) !== null;
|
|
226
|
+
}
|
|
227
|
+
getReachableNodes(from, maxDepth = 50) {
|
|
228
|
+
const reachable = new Set();
|
|
229
|
+
const visited = new Set();
|
|
230
|
+
const dfs = (node, depth) => {
|
|
231
|
+
if (depth > maxDepth || visited.has(node))
|
|
232
|
+
return;
|
|
233
|
+
visited.add(node);
|
|
234
|
+
reachable.add(node);
|
|
235
|
+
for (const { to } of this.adjacencyList.get(node) ?? [])
|
|
236
|
+
dfs(to, depth + 1);
|
|
237
|
+
};
|
|
238
|
+
dfs(from, 0);
|
|
239
|
+
reachable.delete(from);
|
|
240
|
+
return reachable;
|
|
241
|
+
}
|
|
242
|
+
buildAdjacencyList(graph) {
|
|
243
|
+
const adj = new Map();
|
|
244
|
+
for (const edge of graph.edges) {
|
|
245
|
+
if (!adj.has(edge.from))
|
|
246
|
+
adj.set(edge.from, []);
|
|
247
|
+
adj.get(edge.from).push({ to: edge.to, edge });
|
|
248
|
+
if (!adj.has(edge.to))
|
|
249
|
+
adj.set(edge.to, []);
|
|
250
|
+
}
|
|
251
|
+
return adj;
|
|
252
|
+
}
|
|
253
|
+
getStats() {
|
|
254
|
+
const degrees = new Map();
|
|
255
|
+
for (const node of this.graph.nodes)
|
|
256
|
+
degrees.set(node.id, 0);
|
|
257
|
+
for (const edge of this.graph.edges) {
|
|
258
|
+
degrees.set(edge.from, (degrees.get(edge.from) ?? 0) + 1);
|
|
259
|
+
}
|
|
260
|
+
const avgDegree = Array.from(degrees.values()).reduce((s, d) => s + d, 0) / degrees.size;
|
|
261
|
+
return { nodes: this.graph.nodes.length, edges: this.graph.edges.length, avgDegree };
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=PathFinder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PathFinder.js","sourceRoot":"","sources":["../../src/core/PathFinder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BaseFormatter - Interface pour les formatters de sortie
|
|
3
|
+
*
|
|
4
|
+
* Chaque scénario peut avoir son propre formatter.
|
|
5
|
+
* Le formatter transforme un résultat brut du NavigationEngine
|
|
6
|
+
* en sortie lisible par un humain.
|
|
7
|
+
*/
|
|
8
|
+
import type { NavigationPath, EngineStepResult } from '../types/index.js';
|
|
9
|
+
export interface PathFormatter {
|
|
10
|
+
/** Formate un chemin pour l'affichage humain */
|
|
11
|
+
format(path: NavigationPath): string;
|
|
12
|
+
/** Formate un step complet de résultat */
|
|
13
|
+
formatResult(result: EngineStepResult): string;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=BaseFormatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseFormatter.d.ts","sourceRoot":"","sources":["../../src/formatters/BaseFormatter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEzE,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,MAAM,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAAA;IAEpC,0CAA0C;IAC1C,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAA;CAC/C"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BaseFormatter - Interface pour les formatters de sortie
|
|
3
|
+
*
|
|
4
|
+
* Chaque scénario peut avoir son propre formatter.
|
|
5
|
+
* Le formatter transforme un résultat brut du NavigationEngine
|
|
6
|
+
* en sortie lisible par un humain.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=BaseFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseFormatter.js","sourceRoot":"","sources":["../../src/formatters/BaseFormatter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphAssembler — Dictionary → Graph V3
|
|
3
|
+
*
|
|
4
|
+
* Transforme le Dictionary produit par GraphBuilder
|
|
5
|
+
* en Graph V3 (nodes + edges) prêt pour PathFinder.
|
|
6
|
+
*
|
|
7
|
+
* Corrige le bug d'itération : dictionary.tables est une Table[]
|
|
8
|
+
* (liste), pas un Record<string, Table> (dictionnaire).
|
|
9
|
+
*/
|
|
10
|
+
import type { Dictionary, Graph } from '../types/index.js';
|
|
11
|
+
export declare class GraphAssembler {
|
|
12
|
+
assemble(dictionary: Dictionary): Graph;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=GraphAssembler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GraphAssembler.d.ts","sourceRoot":"","sources":["../../src/graph/GraphAssembler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAwB,MAAM,mBAAmB,CAAA;AAEhF,qBAAa,cAAc;IAEzB,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,KAAK;CAmCxC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphAssembler — Dictionary → Graph V3
|
|
3
|
+
*
|
|
4
|
+
* Transforme le Dictionary produit par GraphBuilder
|
|
5
|
+
* en Graph V3 (nodes + edges) prêt pour PathFinder.
|
|
6
|
+
*
|
|
7
|
+
* Corrige le bug d'itération : dictionary.tables est une Table[]
|
|
8
|
+
* (liste), pas un Record<string, Table> (dictionnaire).
|
|
9
|
+
*/
|
|
10
|
+
export class GraphAssembler {
|
|
11
|
+
assemble(dictionary) {
|
|
12
|
+
const nodes = [];
|
|
13
|
+
const edges = [];
|
|
14
|
+
// 1. Tables → Nodes
|
|
15
|
+
// dictionary.tables est une Table[] — itération sur les éléments, pas les indices
|
|
16
|
+
for (const table of dictionary.tables) {
|
|
17
|
+
nodes.push({
|
|
18
|
+
id: table.name,
|
|
19
|
+
type: 'table',
|
|
20
|
+
rowCount: table.rowCount,
|
|
21
|
+
columns: table.columns.map(c => ({ name: c, type: 'string' }))
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
// 2. Relations → Edges
|
|
25
|
+
for (const rel of dictionary.relations) {
|
|
26
|
+
edges.push({
|
|
27
|
+
name: rel.label,
|
|
28
|
+
from: rel.from,
|
|
29
|
+
to: rel.to,
|
|
30
|
+
via: rel.via,
|
|
31
|
+
weight: typeof rel.weight === 'string'
|
|
32
|
+
? parseFloat(rel.weight)
|
|
33
|
+
: (rel.weight ?? 1),
|
|
34
|
+
metadata: {
|
|
35
|
+
type: rel.type,
|
|
36
|
+
condition: rel.condition,
|
|
37
|
+
metadataField: rel.metadataField
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return { nodes, edges };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=GraphAssembler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GraphAssembler.js","sourceRoot":"","sources":["../../src/graph/GraphAssembler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,OAAO,cAAc;IAEzB,QAAQ,CAAC,UAAsB;QAC7B,MAAM,KAAK,GAAgB,EAAE,CAAA;QAC7B,MAAM,KAAK,GAAgB,EAAE,CAAA;QAE7B,oBAAoB;QACpB,kFAAkF;QAClF,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,KAAK,CAAC,IAAI;gBACd,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;aAC/D,CAAC,CAAA;QACJ,CAAC;QAED,uBAAuB;QACvB,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,GAAG,CAAC,KAAK;gBACf,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;oBACpC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;oBACxB,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;gBACrB,QAAQ,EAAE;oBACR,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,aAAa,EAAE,GAAG,CAAC,aAAa;iBACjC;aACF,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphCompiler — v2.0.0
|
|
3
|
+
*
|
|
4
|
+
* Changements vs v1 :
|
|
5
|
+
* - Routes sémantiques (semantic_view) compilées et incluses
|
|
6
|
+
* - compiled-graph contient physical + semantic routes
|
|
7
|
+
* - version bump : '2.0.0'
|
|
8
|
+
*
|
|
9
|
+
* v2.1 :
|
|
10
|
+
* - Support expose config (ADR-0010)
|
|
11
|
+
* - node.exposed compilé depuis CompilerConfig.expose
|
|
12
|
+
*/
|
|
13
|
+
import type { Graph, CompiledGraph, CompilerConfig, MetricsMap } from '../types/index.js';
|
|
14
|
+
export interface EdgeMetadata {
|
|
15
|
+
fromCol: string;
|
|
16
|
+
toCol: string;
|
|
17
|
+
condition?: Record<string, unknown>;
|
|
18
|
+
label?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare class GraphCompiler {
|
|
21
|
+
private config;
|
|
22
|
+
constructor(config?: Partial<CompilerConfig>);
|
|
23
|
+
compile(graph: Graph, metrics: MetricsMap): CompiledGraph;
|
|
24
|
+
private compileNodes;
|
|
25
|
+
private compileSemanticRoute;
|
|
26
|
+
private getAllPairs;
|
|
27
|
+
private compilePath;
|
|
28
|
+
private resolveEdges;
|
|
29
|
+
static getStats(compiled: CompiledGraph): {
|
|
30
|
+
totalRoutes: number;
|
|
31
|
+
fallbackRatio: string;
|
|
32
|
+
semantic: number;
|
|
33
|
+
physical: number;
|
|
34
|
+
composed: number;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=GraphCompiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GraphCompiler.d.ts","sourceRoot":"","sources":["../../src/graph/GraphCompiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAa,UAAU,EAA2B,MAAM,mBAAmB,CAAA;AAG7H,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAqE;gBAEvE,MAAM,GAAE,OAAO,CAAC,cAAc,CAAM;IAUhD,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,GAAG,aAAa;IAiLzD,OAAO,CAAC,YAAY;IAoBpB,OAAO,CAAC,oBAAoB;IAmD5B,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,WAAW;IA6EnB,OAAO,CAAC,YAAY;IA4BpB,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,aAAa;;;;;;;CAgBxC"}
|