universal-physics-tensor 0.24.0 → 0.28.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 (65) hide show
  1. package/README.md +22 -9
  2. package/bin/upt.mjs +843 -685
  3. package/dist/canonical/entries/atomic.d.ts +17 -0
  4. package/dist/canonical/entries/atomic.d.ts.map +1 -0
  5. package/dist/canonical/entries/atomic.js +71 -0
  6. package/dist/canonical/entries/atomic.js.map +1 -0
  7. package/dist/canonical/entries/electromagnetism.d.ts +18 -0
  8. package/dist/canonical/entries/electromagnetism.d.ts.map +1 -0
  9. package/dist/canonical/entries/electromagnetism.js +212 -0
  10. package/dist/canonical/entries/electromagnetism.js.map +1 -0
  11. package/dist/canonical/entries/fluids-waves.d.ts +18 -0
  12. package/dist/canonical/entries/fluids-waves.d.ts.map +1 -0
  13. package/dist/canonical/entries/fluids-waves.js +130 -0
  14. package/dist/canonical/entries/fluids-waves.js.map +1 -0
  15. package/dist/canonical/entries/mechanics.d.ts +18 -0
  16. package/dist/canonical/entries/mechanics.d.ts.map +1 -0
  17. package/dist/canonical/entries/mechanics.js +275 -0
  18. package/dist/canonical/entries/mechanics.js.map +1 -0
  19. package/dist/canonical/entries/thermo-nuclear-cosmo.d.ts +18 -0
  20. package/dist/canonical/entries/thermo-nuclear-cosmo.d.ts.map +1 -0
  21. package/dist/canonical/entries/thermo-nuclear-cosmo.js +56 -0
  22. package/dist/canonical/entries/thermo-nuclear-cosmo.js.map +1 -0
  23. package/dist/canonical/registry.d.ts.map +1 -1
  24. package/dist/canonical/registry.js +10 -0
  25. package/dist/canonical/registry.js.map +1 -1
  26. package/dist/composition/compose.d.ts.map +1 -1
  27. package/dist/composition/compose.js +14 -0
  28. package/dist/composition/compose.js.map +1 -1
  29. package/dist/composition/dimension-adjacency.d.ts +39 -0
  30. package/dist/composition/dimension-adjacency.d.ts.map +1 -0
  31. package/dist/composition/dimension-adjacency.js +44 -0
  32. package/dist/composition/dimension-adjacency.js.map +1 -0
  33. package/dist/composition/graph-viz-svg.d.ts +31 -0
  34. package/dist/composition/graph-viz-svg.d.ts.map +1 -0
  35. package/dist/composition/graph-viz-svg.js +45 -0
  36. package/dist/composition/graph-viz-svg.js.map +1 -0
  37. package/dist/composition/graph-viz.d.ts +100 -0
  38. package/dist/composition/graph-viz.d.ts.map +1 -0
  39. package/dist/composition/graph-viz.js +256 -0
  40. package/dist/composition/graph-viz.js.map +1 -0
  41. package/dist/composition/index.d.ts +8 -0
  42. package/dist/composition/index.d.ts.map +1 -1
  43. package/dist/composition/index.js +4 -0
  44. package/dist/composition/index.js.map +1 -1
  45. package/dist/composition/user-equation.d.ts +136 -0
  46. package/dist/composition/user-equation.d.ts.map +1 -0
  47. package/dist/composition/user-equation.js +247 -0
  48. package/dist/composition/user-equation.js.map +1 -0
  49. package/dist/dimensional/dimension-inference.d.ts +37 -0
  50. package/dist/dimensional/dimension-inference.d.ts.map +1 -0
  51. package/dist/dimensional/dimension-inference.js +79 -0
  52. package/dist/dimensional/dimension-inference.js.map +1 -0
  53. package/dist/index.d.ts +11 -0
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +16 -0
  56. package/dist/index.js.map +1 -1
  57. package/dist/numerical/formula-dimension.d.ts +16 -1
  58. package/dist/numerical/formula-dimension.d.ts.map +1 -1
  59. package/dist/numerical/formula-dimension.js +116 -84
  60. package/dist/numerical/formula-dimension.js.map +1 -1
  61. package/dist/numerical/formula-registry.d.ts +11 -1
  62. package/dist/numerical/formula-registry.d.ts.map +1 -1
  63. package/dist/numerical/formula-registry.js +12 -0
  64. package/dist/numerical/formula-registry.js.map +1 -1
  65. package/package.json +92 -91
@@ -0,0 +1,45 @@
1
+ /**
2
+ * SVG rendering for the physics map — render Graphviz DOT source to an SVG
3
+ * string via the optional **`@viz-js/viz`** peer (the real Graphviz compiled to
4
+ * WebAssembly: same `dot` output, in-process, no native binary, no subprocess).
5
+ *
6
+ * Kept separate from `graph-viz.ts` so that module stays pure, synchronous, and
7
+ * dependency-free (text only). The optional-renderer concern — a lazy dynamic
8
+ * import with graceful fallback, mirroring `numerical/formula-registry.ts`'s
9
+ * MathTS-peer pattern — lives here.
10
+ *
11
+ * @module composition/graph-viz-svg
12
+ */
13
+ /**
14
+ * Thrown by {@link renderDotToSvg} when the optional `@viz-js/viz` peer is not
15
+ * installed. The message names the install command and the no-install
16
+ * alternative.
17
+ *
18
+ * @public
19
+ */
20
+ export class SvgRendererUnavailableError extends Error {
21
+ constructor(message = 'SVG rendering needs the optional renderer: npm i @viz-js/viz ' +
22
+ '(or use --format=dot | dot -Tsvg)') {
23
+ super(message);
24
+ this.name = 'SvgRendererUnavailableError';
25
+ }
26
+ }
27
+ /**
28
+ * Render Graphviz DOT source (e.g. {@link buildVizModel}'s `toDot()`) to an SVG
29
+ * document string. Lazy-loads the optional `@viz-js/viz` peer.
30
+ *
31
+ * @throws {SvgRendererUnavailableError} if the peer is not installed.
32
+ * @public
33
+ */
34
+ export async function renderDotToSvg(dot) {
35
+ let viz;
36
+ try {
37
+ viz = (await import('@viz-js/viz'));
38
+ }
39
+ catch {
40
+ throw new SvgRendererUnavailableError();
41
+ }
42
+ const renderer = await viz.instance();
43
+ return renderer.renderString(dot, { format: 'svg' });
44
+ }
45
+ //# sourceMappingURL=graph-viz-svg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-viz-svg.js","sourceRoot":"","sources":["../../src/composition/graph-viz-svg.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;GAMG;AACH,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IACpD,YACE,OAAO,GAAG,+DAA+D;QACvE,mCAAmC;QAErC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC5C,CAAC;CACF;AASD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW;IAC9C,IAAI,GAAc,CAAC;IACnB,IAAI,CAAC;QACH,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,CAAyB,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,2BAA2B,EAAE,CAAC;IAC1C,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC;IACtC,OAAO,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Physics-map visualization — turn the composition hypergraph into Mermaid and
3
+ * Graphviz-DOT **source text**.
4
+ *
5
+ * The graph is bipartite in the drawing: round nodes are *quantities*
6
+ * (`mass`, `temperature`, …) and box nodes are *equations* — laws, bridges, or
7
+ * proposed relations — each an n-ary junction (its source quantities point in,
8
+ * its target points out). This makes "equations as junctions" literal and draws
9
+ * n-ary edges faithfully (a single Mermaid/DOT edge can only connect two nodes).
10
+ *
11
+ * The model computes its own connected components over the junctions — so a
12
+ * `--proposed` overlay participates in the clustering — and groups each component
13
+ * into its own subgraph so the genuinely disjointed map stays legible. For the
14
+ * pure-`BridgeEdge` case the component count matches the authoritative
15
+ * {@link linkageMap} (pinned by a drift-guard test).
16
+ *
17
+ * Pure string production: no file I/O (the CLI is the only file-touching layer).
18
+ *
19
+ * @module composition/graph-viz
20
+ */
21
+ import type { BridgeEdge } from './edge.js';
22
+ /**
23
+ * Epistemic status of a junction — drives node colour/shape. Bridges carry
24
+ * their catalog confidence; `law` is a diagonal/established-physics edge;
25
+ * `proposed` is a machine-derived, unadjudicated relation (rendered quarantined).
26
+ *
27
+ * @public
28
+ */
29
+ export type VizStatus = 'law' | 'established' | 'speculative' | 'highly-speculative' | 'proposed' | 'user';
30
+ /**
31
+ * A normalized equation junction: n source quantities → 1 target. The render
32
+ * model's unit of "equation", decoupled from both `BridgeEdge` and the internal
33
+ * `ProposedBridge` type (the CLI converts each into this shape).
34
+ *
35
+ * @public
36
+ */
37
+ export interface VizJunction {
38
+ /** Graph id, e.g. `'be-42'` or `'IC-…'`. */
39
+ readonly id: string;
40
+ /** Short human label. */
41
+ readonly label: string;
42
+ readonly status: VizStatus;
43
+ /** Source quantity names. */
44
+ readonly sources: readonly string[];
45
+ /** Target quantity name. */
46
+ readonly target: string;
47
+ }
48
+ /**
49
+ * One connected component of the bipartite graph.
50
+ *
51
+ * @public
52
+ */
53
+ export interface VizCluster {
54
+ /** Junction ids in this component. */
55
+ readonly junctionIds: readonly string[];
56
+ /** Distinct (canonical) quantity names touched by this component. */
57
+ readonly quantities: readonly string[];
58
+ /** Number of junctions (the cluster "size", matching `linkageMap`). */
59
+ readonly size: number;
60
+ /** Contains a `law`/`established` junction (anchored to known physics). */
61
+ readonly anchored: boolean;
62
+ }
63
+ /**
64
+ * Options for {@link buildVizModel}.
65
+ *
66
+ * @public
67
+ */
68
+ export interface VizOptions {
69
+ /** Diagram title (used as the graph label). */
70
+ readonly title?: string;
71
+ /** Already-normalized extra junctions to overlay (e.g. proposed relations). */
72
+ readonly extraJunctions?: readonly VizJunction[];
73
+ }
74
+ /**
75
+ * The render model: normalized junctions, their connected components, and the
76
+ * two serializers.
77
+ *
78
+ * @public
79
+ */
80
+ export interface VizModel {
81
+ readonly junctions: readonly VizJunction[];
82
+ readonly clusters: readonly VizCluster[];
83
+ toMermaid(): string;
84
+ toDot(): string;
85
+ }
86
+ /** Map a `BridgeEdge` to a `VizJunction` (raw quantity names).
87
+ *
88
+ * The display label is the compact catalog id (`BE-<n>`) when the edge is
89
+ * catalog-backed, else the edge's own label — a *map* reads better with short
90
+ * junction names; the full formula stays in the catalog. */
91
+ export declare function edgeToJunction(edge: BridgeEdge): VizJunction;
92
+ /**
93
+ * Build the bipartite, clustered render model from a graph (+ optional overlay).
94
+ * Quantity names are canonicalized via `QUANTITY_IDENTIFICATIONS` so the
95
+ * clustering matches the authoritative {@link linkageMap}.
96
+ *
97
+ * @public
98
+ */
99
+ export declare function buildVizModel(edges: readonly BridgeEdge[], opts?: VizOptions): VizModel;
100
+ //# sourceMappingURL=graph-viz.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-viz.d.ts","sourceRoot":"","sources":["../../src/composition/graph-viz.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAG5C;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GACjB,KAAK,GACL,aAAa,GACb,aAAa,GACb,oBAAoB,GACpB,UAAU,GACV,MAAM,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,6BAA6B;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,4BAA4B;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,sCAAsC;IACtC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,qEAAqE;IACrE,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,uEAAuE;IACvE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,+CAA+C;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CAClD;AAED;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,SAAS,EAAE,SAAS,WAAW,EAAE,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;IACzC,SAAS,IAAI,MAAM,CAAC;IACpB,KAAK,IAAI,MAAM,CAAC;CACjB;AAcD;;;;4DAI4D;AAC5D,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,CAS5D;AAsND;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,IAAI,GAAE,UAAe,GACpB,QAAQ,CA6BV"}
@@ -0,0 +1,256 @@
1
+ /**
2
+ * Physics-map visualization — turn the composition hypergraph into Mermaid and
3
+ * Graphviz-DOT **source text**.
4
+ *
5
+ * The graph is bipartite in the drawing: round nodes are *quantities*
6
+ * (`mass`, `temperature`, …) and box nodes are *equations* — laws, bridges, or
7
+ * proposed relations — each an n-ary junction (its source quantities point in,
8
+ * its target points out). This makes "equations as junctions" literal and draws
9
+ * n-ary edges faithfully (a single Mermaid/DOT edge can only connect two nodes).
10
+ *
11
+ * The model computes its own connected components over the junctions — so a
12
+ * `--proposed` overlay participates in the clustering — and groups each component
13
+ * into its own subgraph so the genuinely disjointed map stays legible. For the
14
+ * pure-`BridgeEdge` case the component count matches the authoritative
15
+ * {@link linkageMap} (pinned by a drift-guard test).
16
+ *
17
+ * Pure string production: no file I/O (the CLI is the only file-touching layer).
18
+ *
19
+ * @module composition/graph-viz
20
+ */
21
+ import { QUANTITY_IDENTIFICATIONS } from './compose.js';
22
+ /** Fill colour + dashed flag per status. Tweak here to restyle the whole map. */
23
+ const STATUS_STYLE = {
24
+ law: { fill: '#cfe3f7', stroke: '#3a6ea5', dashed: false }, // textbook law — blue
25
+ established: { fill: '#cde7d3', stroke: '#3f8f5b', dashed: false }, // solid bridge — green
26
+ speculative: { fill: '#fdebc8', stroke: '#c9881b', dashed: false }, // amber
27
+ 'highly-speculative': { fill: '#f5c6c6', stroke: '#c0392b', dashed: false }, // red
28
+ proposed: { fill: '#e6e6e6', stroke: '#888888', dashed: true }, // unadjudicated — grey dashed
29
+ user: { fill: '#e9d8fd', stroke: '#6b46c1', dashed: false }, // user-supplied — violet
30
+ };
31
+ /** Map a `BridgeEdge` to a `VizJunction` (raw quantity names).
32
+ *
33
+ * The display label is the compact catalog id (`BE-<n>`) when the edge is
34
+ * catalog-backed, else the edge's own label — a *map* reads better with short
35
+ * junction names; the full formula stays in the catalog. */
36
+ export function edgeToJunction(edge) {
37
+ const status = edge.kind === 'law' ? 'law' : edge.confidence;
38
+ return {
39
+ id: edge.id,
40
+ label: edge.beId != null ? `BE-${edge.beId}` : edge.label,
41
+ status,
42
+ sources: edge.sources.map((s) => s.name),
43
+ target: edge.target.name,
44
+ };
45
+ }
46
+ /** Quantity-name canonicalizer from `QUANTITY_IDENTIFICATIONS` (matches `linkageMap`). */
47
+ function makeCanon() {
48
+ const alias = new Map(QUANTITY_IDENTIFICATIONS.map((id) => [id.from, id.to]));
49
+ return (n) => alias.get(n) ?? n;
50
+ }
51
+ /** Distinct canonical quantity names of a junction (sources ∪ target). */
52
+ function quantitiesOf(j) {
53
+ return [...new Set([...j.sources, j.target])];
54
+ }
55
+ /** Union-find component grouping of junctions sharing a (canonical) quantity. */
56
+ function componentsOf(junctions) {
57
+ const parent = junctions.map((_, i) => i);
58
+ const find = (x) => parent[x] === x ? x : (parent[x] = find(parent[x]));
59
+ const union = (a, b) => {
60
+ parent[find(a)] = find(b);
61
+ };
62
+ const qToJunctions = new Map();
63
+ junctions.forEach((j, i) => {
64
+ for (const qty of quantitiesOf(j)) {
65
+ const arr = qToJunctions.get(qty) ?? [];
66
+ arr.push(i);
67
+ qToJunctions.set(qty, arr);
68
+ }
69
+ });
70
+ for (const idxs of qToJunctions.values()) {
71
+ for (let k = 1; k < idxs.length; k++)
72
+ union(idxs[0], idxs[k]);
73
+ }
74
+ const groups = new Map();
75
+ junctions.forEach((_, i) => {
76
+ const r = find(i);
77
+ const arr = groups.get(r) ?? [];
78
+ arr.push(i);
79
+ groups.set(r, arr);
80
+ });
81
+ const clusters = [...groups.values()].map((idxs) => {
82
+ const js = idxs.map((i) => junctions[i]);
83
+ const quantities = [...new Set(js.flatMap(quantitiesOf))].sort();
84
+ return {
85
+ junctionIds: js.map((j) => j.id),
86
+ quantities,
87
+ size: js.length,
88
+ anchored: js.some((j) => j.status === 'law' || j.status === 'established'),
89
+ };
90
+ });
91
+ // Deterministic: largest first, then by first junction id.
92
+ clusters.sort((a, b) => b.size - a.size || a.junctionIds[0].localeCompare(b.junctionIds[0]));
93
+ return clusters;
94
+ }
95
+ /** A stable, collision-free id factory mapping arbitrary keys to safe ids. */
96
+ function idFactory(prefix) {
97
+ const seen = new Map();
98
+ const used = new Set();
99
+ return (key) => {
100
+ const cached = seen.get(key);
101
+ if (cached)
102
+ return cached;
103
+ const base = `${prefix}_${key.replace(/[^A-Za-z0-9]/g, '_')}`;
104
+ let id = base;
105
+ let n = 1;
106
+ while (used.has(id))
107
+ id = `${base}_${n++}`;
108
+ used.add(id);
109
+ seen.set(key, id);
110
+ return id;
111
+ };
112
+ }
113
+ /** Escape a label for Mermaid `["…"]` — XML-entity-encode the characters that
114
+ * break the quoted form or are read as entities (`&`, `"`, `<`, `>`). */
115
+ const mmLabel = (s) => s
116
+ .replace(/&/g, '&amp;')
117
+ .replace(/"/g, '&quot;')
118
+ .replace(/</g, '&lt;')
119
+ .replace(/>/g, '&gt;');
120
+ /** Escape a label for a DOT double-quoted string. */
121
+ const dotLabel = (s) => s.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
122
+ const STATUSES_IN_ORDER = [
123
+ 'law',
124
+ 'established',
125
+ 'speculative',
126
+ 'highly-speculative',
127
+ 'proposed',
128
+ 'user',
129
+ ];
130
+ /**
131
+ * Drive a format-specific cluster renderer over the standard layout, identical
132
+ * for both emitters: multi-junction components first (each its own subgraph,
133
+ * keyed `0`,`1`,…, labelled `anchored cluster (n)` / `cluster (n)`), then a
134
+ * single `iso` subgraph collecting all singletons. The callback owns all
135
+ * per-format string production; this owns only the traversal and labelling.
136
+ */
137
+ function forEachClusterGroup(clusters, renderCluster) {
138
+ const multi = clusters.filter((c) => c.size > 1);
139
+ const singletons = clusters.filter((c) => c.size === 1);
140
+ multi.forEach((c, i) => renderCluster(`${c.anchored ? 'anchored ' : ''}cluster (${c.size})`, c.junctionIds, String(i)));
141
+ if (singletons.length) {
142
+ renderCluster(`isolated (${singletons.length})`, singletons.flatMap((c) => c.junctionIds), 'iso');
143
+ }
144
+ }
145
+ function emitMermaid(clusters, byId, title) {
146
+ const qid = idFactory('q');
147
+ const jid = idFactory('j');
148
+ const usedStatuses = new Set();
149
+ const out = [`flowchart LR`, `%% ${title}`];
150
+ const renderCluster = (label, junctionIds, key) => {
151
+ out.push(` subgraph cl_${key}["${mmLabel(label)}"]`);
152
+ out.push(` direction LR`);
153
+ const declared = new Set();
154
+ const declareQ = (name) => {
155
+ const id = qid(name);
156
+ if (!declared.has(id)) {
157
+ out.push(` ${id}(["${mmLabel(name)}"]):::qty`);
158
+ declared.add(id);
159
+ }
160
+ return id;
161
+ };
162
+ for (const id of junctionIds) {
163
+ const j = byId.get(id);
164
+ usedStatuses.add(j.status);
165
+ const jId = jid(j.id);
166
+ out.push(` ${jId}["${mmLabel(j.label)}"]:::${j.status}`);
167
+ for (const s of j.sources)
168
+ out.push(` ${declareQ(s)} --> ${jId}`);
169
+ out.push(` ${jId} --> ${declareQ(j.target)}`);
170
+ }
171
+ out.push(` end`);
172
+ };
173
+ forEachClusterGroup(clusters, renderCluster);
174
+ for (const st of STATUSES_IN_ORDER) {
175
+ if (!usedStatuses.has(st))
176
+ continue;
177
+ const { fill, stroke, dashed } = STATUS_STYLE[st];
178
+ out.push(` classDef ${st} fill:${fill},stroke:${stroke}${dashed ? ',stroke-dasharray:4 3' : ''}`);
179
+ }
180
+ out.push(` classDef qty fill:#ffffff,stroke:#999999`);
181
+ return out.join('\n') + '\n';
182
+ }
183
+ function emitDot(clusters, byId, title) {
184
+ const qid = idFactory('q');
185
+ const jid = idFactory('j');
186
+ const out = [
187
+ `digraph PhysicsMap {`,
188
+ ` label="${dotLabel(title)}";`,
189
+ ` rankdir=LR;`,
190
+ ` node [fontname="Helvetica"];`,
191
+ ];
192
+ const renderCluster = (label, junctionIds, key) => {
193
+ out.push(` subgraph cluster_${key} {`);
194
+ out.push(` label="${dotLabel(label)}";`);
195
+ const declared = new Set();
196
+ const declareQ = (name) => {
197
+ const id = qid(name);
198
+ if (!declared.has(id)) {
199
+ out.push(` ${id} [shape=ellipse,label="${dotLabel(name)}"];`);
200
+ declared.add(id);
201
+ }
202
+ return id;
203
+ };
204
+ for (const id of junctionIds) {
205
+ const j = byId.get(id);
206
+ const jId = jid(j.id);
207
+ const { fill, stroke, dashed } = STATUS_STYLE[j.status];
208
+ const style = dashed ? 'filled,dashed' : 'filled';
209
+ out.push(` ${jId} [shape=box,style="${style}",fillcolor="${fill}",color="${stroke}",label="${dotLabel(j.label)}"];`);
210
+ for (const s of j.sources)
211
+ out.push(` ${declareQ(s)} -> ${jId};`);
212
+ out.push(` ${jId} -> ${declareQ(j.target)};`);
213
+ }
214
+ out.push(` }`);
215
+ };
216
+ forEachClusterGroup(clusters, renderCluster);
217
+ out.push(`}`);
218
+ return out.join('\n') + '\n';
219
+ }
220
+ /**
221
+ * Build the bipartite, clustered render model from a graph (+ optional overlay).
222
+ * Quantity names are canonicalized via `QUANTITY_IDENTIFICATIONS` so the
223
+ * clustering matches the authoritative {@link linkageMap}.
224
+ *
225
+ * @public
226
+ */
227
+ export function buildVizModel(edges, opts = {}) {
228
+ const canon = makeCanon();
229
+ const normalize = (j) => ({
230
+ ...j,
231
+ sources: j.sources.map(canon),
232
+ target: canon(j.target),
233
+ });
234
+ const junctions = [
235
+ ...edges.map((e) => normalize(edgeToJunction(e))),
236
+ ...(opts.extraJunctions ?? []).map(normalize),
237
+ ];
238
+ // A duplicate junction id (e.g. a proposed overlay colliding with an edge id)
239
+ // would silently drop one from the rendered output — make it a loud error.
240
+ const byId = new Map();
241
+ for (const j of junctions) {
242
+ if (byId.has(j.id)) {
243
+ throw new Error(`buildVizModel: duplicate junction id '${j.id}'`);
244
+ }
245
+ byId.set(j.id, j);
246
+ }
247
+ const clusters = componentsOf(junctions);
248
+ const title = opts.title ?? 'UPT physics map';
249
+ return {
250
+ junctions,
251
+ clusters,
252
+ toMermaid: () => emitMermaid(clusters, byId, title),
253
+ toDot: () => emitDot(clusters, byId, title),
254
+ };
255
+ }
256
+ //# sourceMappingURL=graph-viz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-viz.js","sourceRoot":"","sources":["../../src/composition/graph-viz.ts"],"names":[],"mappings":"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"}
@@ -35,4 +35,12 @@ export { explainQuantity } from './explain.js';
35
35
  export type { Observable, ComposeSymbolicOptions } from './compose-symbolic.js';
36
36
  export { composeSymbolic, SymbolicCompositionError } from './compose-symbolic.js';
37
37
  export { SymbolicEvalError } from './expr-eval.js';
38
+ export type { VizStatus, VizJunction, VizCluster, VizOptions, VizModel, } from './graph-viz.js';
39
+ export { buildVizModel, edgeToJunction } from './graph-viz.js';
40
+ export { renderDotToSvg, SvgRendererUnavailableError } from './graph-viz-svg.js';
41
+ export type { DimensionAdjacency } from './dimension-adjacency.js';
42
+ export { dimensionAdjacency } from './dimension-adjacency.js';
43
+ export type { UserEquation, EquationLanding } from './user-equation.js';
44
+ export type { EquationAnalysis, EquationHint } from './user-equation.js';
45
+ export { parseUserEquation, resolveToCatalogName, suggestQuantities, suggestByDimension, equationLanding, analyzeUserEquation, UserEquationError, } from './user-equation.js';
38
46
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/composition/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,EACxB,oBAAoB,EACpB,YAAY,GACb,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EACL,YAAY,EACZ,aAAa,EACb,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EACL,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,sBAAsB,EACtB,QAAQ,GACT,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,GACT,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,YAAY,EACV,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,uBAAuB,EACvB,WAAW,EACX,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE7D,YAAY,EACV,qBAAqB,EACrB,cAAc,EACd,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,YAAY,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/composition/index.ts"],"names":[],"mappings":"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"}
@@ -25,4 +25,8 @@ export { retrodict, retrodictNode } from './retrodiction.js';
25
25
  export { explainQuantity } from './explain.js';
26
26
  export { composeSymbolic, SymbolicCompositionError } from './compose-symbolic.js';
27
27
  export { SymbolicEvalError } from './expr-eval.js';
28
+ export { buildVizModel, edgeToJunction } from './graph-viz.js';
29
+ export { renderDotToSvg, SvgRendererUnavailableError } from './graph-viz-svg.js';
30
+ export { dimensionAdjacency } from './dimension-adjacency.js';
31
+ export { parseUserEquation, resolveToCatalogName, suggestQuantities, suggestByDimension, equationLanding, analyzeUserEquation, UserEquationError, } from './user-equation.js';
28
32
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/composition/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9C,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,EACxB,oBAAoB,EACpB,YAAY,GACb,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EACL,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,sBAAsB,EACtB,QAAQ,GACT,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,GACT,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EACL,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAOxD,OAAO,EACL,uBAAuB,EACvB,WAAW,EACX,cAAc,GACf,MAAM,sBAAsB,CAAC;AAS9B,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAO7D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/composition/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9C,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,EACxB,oBAAoB,EACpB,YAAY,GACb,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EACL,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,sBAAsB,EACtB,QAAQ,GACT,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,GACT,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EACL,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAOxD,OAAO,EACL,uBAAuB,EACvB,WAAW,EACX,cAAc,GACf,MAAM,sBAAsB,CAAC;AAS9B,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAO7D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AASnD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAEjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG9D,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * User-equation injection — turn a free-form `TARGET = EXPR` string into a graph
3
+ * junction (a target quantity + its source quantities), resolve the user's
4
+ * symbols onto the catalog vocabulary, suggest near-misses, and report where the
5
+ * injected junction lands in a built {@link VizModel}.
6
+ *
7
+ * Free-form means no dimensions: source quantities are the RHS's free variables
8
+ * — extracted by the active formula parser via {@link getFormulaParser} (the
9
+ * MathTS expression parser when the optional peer is installed, else the built-in
10
+ * one; both already drop constants like `pi`/`tau`, numbers, and functions) —
11
+ * minus the physics {@link CONSTANTS}. Multi-word quantities are typed with
12
+ * underscores; resolution tries the literal form first, then the `_`↔`-` swap, so
13
+ * both the catalog's hyphenated (`photon-energy`) and underscored
14
+ * (`impact_parameter`) names connect.
15
+ *
16
+ * Pure: no file I/O. The injected junction is rendered as an `extraJunction`
17
+ * (status `'user'`) and is never written into the catalog.
18
+ *
19
+ * @module composition/user-equation
20
+ */
21
+ import type { VizModel, VizJunction } from './graph-viz.js';
22
+ import type { Dimension } from '../dimensional/types.js';
23
+ /** Thrown when a user equation cannot be parsed into a target + sources. @public */
24
+ export declare class UserEquationError extends Error {
25
+ constructor(message: string);
26
+ }
27
+ /**
28
+ * A parsed user equation: the target quantity and its source quantities, as
29
+ * written (underscores preserved; constants/numbers/functions removed).
30
+ *
31
+ * @public
32
+ */
33
+ export interface UserEquation {
34
+ readonly target: string;
35
+ readonly sources: readonly string[];
36
+ /** The original `TARGET = EXPR` text, for the junction label. */
37
+ readonly text: string;
38
+ }
39
+ /**
40
+ * Parse `TARGET = EXPR` into `{ target, sources }`. The target is the text left
41
+ * of the first `=`; the sources are the RHS's free variables minus the physics
42
+ * constants.
43
+ *
44
+ * Uses the active formula parser (MathTS when installed, built-in otherwise) to
45
+ * extract the RHS's free variables.
46
+ *
47
+ * @throws {UserEquationError} on a missing `=`, an empty target, an unparseable
48
+ * RHS, or an RHS with no source quantities.
49
+ * @public
50
+ */
51
+ export declare function parseUserEquation(equation: string): Promise<UserEquation>;
52
+ /**
53
+ * Resolve a user symbol to a catalog quantity name: the literal name first, then
54
+ * the `_`→`-` and `-`→`_` swaps, against `catalogNames`. Returns `null` if none
55
+ * match.
56
+ *
57
+ * @public
58
+ */
59
+ export declare function resolveToCatalogName(name: string, catalogNames: ReadonlySet<string>): string | null;
60
+ /**
61
+ * Up to `k` catalog names most similar to `name` — the "did you mean?" set for an
62
+ * unmatched user symbol. Names where one string contains the other rank first,
63
+ * then by edit distance, then by length.
64
+ *
65
+ * @public
66
+ */
67
+ export declare function suggestQuantities(name: string, catalogNames: Iterable<string>, k?: number): string[];
68
+ /**
69
+ * Catalog quantity names whose dimension equals `dim` (sorted, capped at `k`) —
70
+ * the dimension-based "did you mean?" set once an unknown symbol's dimension has
71
+ * been inferred.
72
+ *
73
+ * @public
74
+ */
75
+ export declare function suggestByDimension(dim: Dimension, catalogDims: ReadonlyMap<string, Dimension>, k?: number): string[];
76
+ /**
77
+ * Where the injected user junction landed, computed from a built `VizModel`.
78
+ *
79
+ * @public
80
+ */
81
+ export interface EquationLanding {
82
+ readonly isolated: boolean;
83
+ /** Junctions in the user equation's connected component (including itself). */
84
+ readonly clusterSize: number;
85
+ /** The component holds a law/established junction (anchored to known physics). */
86
+ readonly anchored: boolean;
87
+ /** User-equation quantities that also appear in a neighbouring junction. */
88
+ readonly sharedQuantities: readonly string[];
89
+ /** Other junction ids in the user equation's component. */
90
+ readonly connectedJunctionIds: readonly string[];
91
+ }
92
+ /**
93
+ * Describe where `userJunctionId` sits in `model`: its component, the junctions it
94
+ * connects to, and the quantities that link it to them.
95
+ *
96
+ * @public
97
+ */
98
+ export declare function equationLanding(model: VizModel, userJunctionId: string): EquationLanding;
99
+ /** A "did you mean?" suggestion for an unmatched symbol. */
100
+ export interface EquationHint {
101
+ readonly name: string;
102
+ readonly suggestions: readonly string[];
103
+ /** True when the suggestions come from the symbol's INFERRED dimension. */
104
+ readonly byDimension: boolean;
105
+ }
106
+ /**
107
+ * Full analysis of a user equation against a catalog name→dimension map: the
108
+ * `user` junction (for the graph), the dimensional verdict (RHS dimension vs the
109
+ * target's catalog dimension), and "did you mean?" hints (dimension-based when a
110
+ * single unknown's dimension can be inferred, else name-similarity).
111
+ *
112
+ * Physics constants (`hbar`, `c`, `k_B`, …) are supplied to the parser with
113
+ * their real dimensions (from `CONSTANTS`) so the dimensional check is correct.
114
+ *
115
+ * @public
116
+ */
117
+ export interface EquationAnalysis {
118
+ readonly junction: VizJunction;
119
+ /** Set when the RHS is not dimensionally well-formed (then dims are null). */
120
+ readonly parseError: string | null;
121
+ readonly rhsDimension: Dimension | null;
122
+ readonly targetDimension: Dimension | null;
123
+ /** rhsDimension === targetDimension; null when unknowable or parse failed. */
124
+ readonly consistent: boolean | null;
125
+ readonly hints: readonly EquationHint[];
126
+ }
127
+ /**
128
+ * Parse + dimensionally analyze a user `TARGET = EXPR` against `catalogDims`
129
+ * (catalog quantity name → dimension). Throws {@link UserEquationError} on a
130
+ * structurally malformed equation; reports a dimensional malformation via
131
+ * `parseError`.
132
+ *
133
+ * @public
134
+ */
135
+ export declare function analyzeUserEquation(equation: string, catalogDims: ReadonlyMap<string, Dimension>): Promise<EquationAnalysis>;
136
+ //# sourceMappingURL=user-equation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-equation.d.ts","sourceRoot":"","sources":["../../src/composition/user-equation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAKzD,oFAAoF;AACpF,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA8B/E;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,GAChC,MAAM,GAAG,IAAI,CAOf;AAsBD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC9B,CAAC,SAAI,GACJ,MAAM,EAAE,CAsBV;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,SAAS,EACd,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,EAC3C,CAAC,SAAI,GACJ,MAAM,EAAE,CAMV;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,+EAA+E;IAC/E,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,4EAA4E;IAC5E,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,2DAA2D;IAC3D,QAAQ,CAAC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;CAClD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,GAAG,eAAe,CAqBxF;AAED,4DAA4D;AAC5D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,2EAA2E;IAC3E,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,SAAS,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,eAAe,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3C,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;CACzC;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,GAC1C,OAAO,CAAC,gBAAgB,CAAC,CAiE3B"}