@graphty/cytoscape-extensions 0.0.28 → 0.0.29
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/algorithm-options.d.ts +5 -0
- package/dist/algorithm-options.d.ts.map +1 -0
- package/dist/algorithm-options.js +285 -0
- package/dist/algorithm-options.js.map +1 -0
- package/dist/algorithms.d.ts +489 -0
- package/dist/algorithms.d.ts.map +1 -0
- package/dist/algorithms.js +1184 -0
- package/dist/algorithms.js.map +1 -0
- package/dist/cdn/chunks/elements-DkrLtNP8.js +1 -0
- package/dist/cdn/chunks/gpu-platform-browser-VBah74fl.js +2825 -0
- package/dist/cdn/chunks/index-C4RZkds_.js +10 -0
- package/dist/cdn/chunks/index-CAhmhhmb.js +1 -0
- package/dist/cdn/chunks/io-Da5POp5D.js +268 -0
- package/dist/cdn/chunks/preload-helper-DEpZAvig.js +1 -0
- package/dist/cdn/chunks/samples-BkLzaDJ3.js +1 -0
- package/dist/cdn/chunks/sigv4-EokFic1V-CWJiFeEe.js +3 -0
- package/dist/cdn/chunks/sources-cypher-BGGD4kJ9.js +5 -0
- package/dist/cdn/chunks/sources-ndex-CxnPOYff.js +1 -0
- package/dist/cdn/chunks/sources-rest-BPNV8mX-.js +1 -0
- package/dist/cdn/chunks/sources-sparql-BiqRQuHD.js +5 -0
- package/dist/cdn/cytoscape-extensions.js +1 -0
- package/dist/cdn/io.js +1 -0
- package/dist/cytoscape-extensions.bundle.js +2825 -0
- package/dist/elements.d.ts +69 -0
- package/dist/elements.d.ts.map +1 -0
- package/dist/elements.js +343 -0
- package/dist/elements.js.map +1 -0
- package/dist/gpu-platform-browser.d.ts +11 -0
- package/dist/gpu-platform-browser.d.ts.map +1 -0
- package/dist/gpu-platform-browser.js +22 -0
- package/dist/gpu-platform-browser.js.map +1 -0
- package/dist/gpu-platform-node.d.ts +15 -0
- package/dist/gpu-platform-node.d.ts.map +1 -0
- package/dist/gpu-platform-node.js +27 -0
- package/dist/gpu-platform-node.js.map +1 -0
- package/dist/gpu.d.ts +149 -0
- package/dist/gpu.d.ts.map +1 -0
- package/dist/gpu.js +312 -0
- package/dist/gpu.js.map +1 -0
- package/dist/graph-data.d.ts +101 -0
- package/dist/graph-data.d.ts.map +1 -0
- package/dist/graph-data.js +147 -0
- package/dist/graph-data.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/io.d.ts +111 -0
- package/dist/io.d.ts.map +1 -0
- package/dist/io.js +258 -0
- package/dist/io.js.map +1 -0
- package/dist/layouts.d.ts +207 -0
- package/dist/layouts.d.ts.map +1 -0
- package/dist/layouts.js +615 -0
- package/dist/layouts.js.map +1 -0
- package/dist/lazy.d.ts +21 -0
- package/dist/lazy.d.ts.map +1 -0
- package/dist/lazy.js +32 -0
- package/dist/lazy.js.map +1 -0
- package/dist/samples.d.ts +115 -0
- package/dist/samples.d.ts.map +1 -0
- package/dist/samples.js +237 -0
- package/dist/samples.js.map +1 -0
- package/dist/snapshot.d.ts +81 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +225 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/webgpu-provider.d.ts +25 -0
- package/dist/webgpu-provider.d.ts.map +1 -0
- package/dist/webgpu-provider.js +53 -0
- package/dist/webgpu-provider.js.map +1 -0
- package/package.json +13 -9
package/dist/layouts.js
ADDED
|
@@ -0,0 +1,615 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every @graphty/layout layout as a Cytoscape.js 3.x layout extension, named "graphty-<name>".
|
|
3
|
+
*
|
|
4
|
+
* Two kinds:
|
|
5
|
+
* - static layouts compute once and hand their positions to Cytoscape's `layoutPositions`, which supplies the
|
|
6
|
+
* events, `fit`, `spacingFactor`, `transform` and the tween for any truthy `animate`;
|
|
7
|
+
* - the force simulations (ForceAtlas2, Fruchterman-Reingold, spring-electrical) step a `LayoutSimulation`. With
|
|
8
|
+
* `animate: true` they draw every frame and own their events; otherwise they run to the end and finish through
|
|
9
|
+
* `layoutPositions` like a static layout.
|
|
10
|
+
*
|
|
11
|
+
* Positions are 2D. A 3D run (`dim: 3`) is projected onto the x-y plane.
|
|
12
|
+
*/
|
|
13
|
+
import { makeMask, maskSet, maskTest } from "@graphty/graph-format";
|
|
14
|
+
import { arf, bfs, bipartite, circular, createSimulation, grid, kamadaKawai, Lcg, multipartite, planar, radial, random, rescaleInPlace, shell, spectral, spiral, } from "@graphty/layout";
|
|
15
|
+
import { backendOf, checkGpuMode, coreDestroyedError, cpuWithoutAsking, gpuFor, warnIfFixable, } from "./gpu.js";
|
|
16
|
+
import { hold, indexOf, indicesOf, toSnapshot } from "./snapshot.js";
|
|
17
|
+
export const DEFAULTS = {
|
|
18
|
+
animate: false,
|
|
19
|
+
animationDuration: 500,
|
|
20
|
+
fit: true,
|
|
21
|
+
padding: 30,
|
|
22
|
+
randomize: true,
|
|
23
|
+
refresh: 1,
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Groups the nodes by the value of a data field, in ascending value order; nodes without the field are left out.
|
|
27
|
+
* @param cs - the layout's snapshot
|
|
28
|
+
* @param field - the node data field
|
|
29
|
+
* @returns node indices per value
|
|
30
|
+
*/
|
|
31
|
+
function groupsByData(cs, field) {
|
|
32
|
+
const groups = new Map();
|
|
33
|
+
cs.nodes.forEach((node, i) => {
|
|
34
|
+
const v = node.data(field);
|
|
35
|
+
if (typeof v === "number" || typeof v === "string") {
|
|
36
|
+
const g = groups.get(v);
|
|
37
|
+
if (g === undefined) {
|
|
38
|
+
groups.set(v, [i]);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
g.push(i);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
const keys = [...groups.keys()].sort((a, b) => typeof a === "number" && typeof b === "number" ? a - b : String(a).localeCompare(String(b)));
|
|
46
|
+
return keys.map((k) => groups.get(k) ?? []);
|
|
47
|
+
}
|
|
48
|
+
// The @graphty/layout one-shot functions take index arrays, masks and column names where Cytoscape users hold
|
|
49
|
+
// selectors and collections; these entries translate the few options that differ and pass the rest through.
|
|
50
|
+
const STATIC = {
|
|
51
|
+
random: (s, o) => random(s, o),
|
|
52
|
+
circular: (s, o) => circular(s, o),
|
|
53
|
+
spiral: (s, o) => spiral(s, o),
|
|
54
|
+
grid: (s, o) => grid(s, o),
|
|
55
|
+
spectral: (s, o) => spectral(s, o),
|
|
56
|
+
planar: (s, o) => planar(s, o),
|
|
57
|
+
arf: (s, o) => arf(s, o),
|
|
58
|
+
"kamada-kawai": (s, o) => kamadaKawai(s, o),
|
|
59
|
+
shell: (s, o, cs) => {
|
|
60
|
+
const nlist = o.nlist;
|
|
61
|
+
return shell(s, { ...o, nlist: nlist?.map((sel) => indicesOf(cs, sel)) });
|
|
62
|
+
},
|
|
63
|
+
multipartite: (s, o, cs) => {
|
|
64
|
+
const subsets = (o.subsets ?? "subset");
|
|
65
|
+
const layers = typeof subsets === "string" ? groupsByData(cs, subsets) : subsets.map((x) => indicesOf(cs, x));
|
|
66
|
+
return multipartite(s, { ...o, subsets: layers });
|
|
67
|
+
},
|
|
68
|
+
bipartite: (s, o, cs) => {
|
|
69
|
+
if (o.top === undefined) {
|
|
70
|
+
return bipartite(s, o);
|
|
71
|
+
}
|
|
72
|
+
const mask = makeMask(s.nodeCount);
|
|
73
|
+
for (const i of indicesOf(cs, o.top)) {
|
|
74
|
+
maskSet(mask, i, true);
|
|
75
|
+
}
|
|
76
|
+
return bipartite(s, { ...o, top: mask });
|
|
77
|
+
},
|
|
78
|
+
bfs: (s, { root, ...o }, cs) => bfs(s, { ...o, start: indexOf(cs, root, "graphty layout: root") }),
|
|
79
|
+
radial: (s, o, cs) => radial(s, { ...o, root: indexOf(cs, o.root, "graphty layout: root") }),
|
|
80
|
+
};
|
|
81
|
+
// This package's own iteration budgets for the simulations, passed explicitly so a change of a @graphty/layout
|
|
82
|
+
// default does not change what a Cytoscape user gets; the caller's option overrides them.
|
|
83
|
+
export const SIMULATION_DEFAULTS = {
|
|
84
|
+
forceatlas2: { maxIter: 100 },
|
|
85
|
+
fruchtermanReingold: { iterations: 50 },
|
|
86
|
+
};
|
|
87
|
+
/** Registered name suffix -> @graphty/layout simulation type. */
|
|
88
|
+
export const SIMULATIONS = {
|
|
89
|
+
forceatlas2: "forceatlas2",
|
|
90
|
+
"fruchterman-reingold": "fruchtermanReingold",
|
|
91
|
+
"spring-electrical": "spring-electrical",
|
|
92
|
+
};
|
|
93
|
+
/** Every layout name this package registers, without the "graphty-" prefix. */
|
|
94
|
+
export const LAYOUT_NAMES = [...Object.keys(STATIC), ...Object.keys(SIMULATIONS)];
|
|
95
|
+
/**
|
|
96
|
+
* The bounding box in x1/y1/w/h form; default the viewport.
|
|
97
|
+
* @param bb - the option
|
|
98
|
+
* @param cy - the core
|
|
99
|
+
* @returns the box
|
|
100
|
+
*/
|
|
101
|
+
function box(bb, cy) {
|
|
102
|
+
if (bb === undefined) {
|
|
103
|
+
// a container detached from the page reads NaN (its computed padding is empty); use Cytoscape's own size
|
|
104
|
+
// for a core without a container, 1 x 1
|
|
105
|
+
const finite = (v) => (Number.isFinite(v) ? v : 1);
|
|
106
|
+
return { x1: 0, y1: 0, w: finite(cy.width()), h: finite(cy.height()) };
|
|
107
|
+
}
|
|
108
|
+
return "w" in bb ? bb : { x1: bb.x1, y1: bb.y1, w: bb.x2 - bb.x1, h: bb.y2 - bb.y1 };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The radius and centre the layout fills inside a box.
|
|
112
|
+
* @param b - the box
|
|
113
|
+
* @returns half the shorter side (at least 1) and the centre
|
|
114
|
+
*/
|
|
115
|
+
function frame(b) {
|
|
116
|
+
return { radius: Math.max(Math.min(b.w, b.h) / 2, 1), center: [b.x1 + b.w / 2, b.y1 + b.h / 2, 0] };
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* The x-y pairs of `n` rows of `stride` values, rescaled so the farthest placed node is `radius` from the centre. NaN
|
|
120
|
+
* rows (unplaced nodes) stay NaN.
|
|
121
|
+
* @param rows - the rows
|
|
122
|
+
* @param stride - values per row (2 or 3)
|
|
123
|
+
* @param n - row count
|
|
124
|
+
* @param b - the target box
|
|
125
|
+
* @returns 2n values
|
|
126
|
+
*/
|
|
127
|
+
function fitRows(rows, stride, n, b) {
|
|
128
|
+
const xy = new Float64Array(2 * n);
|
|
129
|
+
for (let i = 0; i < n; i++) {
|
|
130
|
+
xy[2 * i] = rows[stride * i];
|
|
131
|
+
xy[2 * i + 1] = rows[stride * i + 1];
|
|
132
|
+
}
|
|
133
|
+
const { radius, center } = frame(b);
|
|
134
|
+
return rescaleInPlace(xy, 2, radius, center);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* The x-y pairs of a simulation with locked nodes: each locked node where it stands, each free node scaled about
|
|
138
|
+
* the locked nodes' centroid by the largest factor that keeps every free node inside the box (by the factor that
|
|
139
|
+
* puts the farthest at half the box's shorter side when the centroid is outside the box).
|
|
140
|
+
* @param pos - the stride-3 positions, in pixels
|
|
141
|
+
* @param locked - the locked nodes' mask
|
|
142
|
+
* @param n - node count
|
|
143
|
+
* @param b - the target box
|
|
144
|
+
* @returns 2n values
|
|
145
|
+
*/
|
|
146
|
+
function fitAroundLocked(pos, locked, n, b) {
|
|
147
|
+
let cx = 0;
|
|
148
|
+
let cy = 0;
|
|
149
|
+
let count = 0;
|
|
150
|
+
for (let i = 0; i < n; i++) {
|
|
151
|
+
if (maskTest(locked, i)) {
|
|
152
|
+
cx += pos[3 * i];
|
|
153
|
+
cy += pos[3 * i + 1];
|
|
154
|
+
count++;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
cx /= count;
|
|
158
|
+
cy /= count;
|
|
159
|
+
const inside = cx >= b.x1 && cx <= b.x1 + b.w && cy >= b.y1 && cy <= b.y1 + b.h;
|
|
160
|
+
// the largest factor keeping one coordinate inside [lo, hi], seen from c
|
|
161
|
+
const limit = (c, d, lo, hi) => {
|
|
162
|
+
if (d === 0) {
|
|
163
|
+
return Infinity;
|
|
164
|
+
}
|
|
165
|
+
return ((d > 0 ? hi : lo) - c) / d;
|
|
166
|
+
};
|
|
167
|
+
let scale = Infinity;
|
|
168
|
+
let farthest = 0;
|
|
169
|
+
for (let i = 0; i < n; i++) {
|
|
170
|
+
if (!maskTest(locked, i)) {
|
|
171
|
+
const dx = pos[3 * i] - cx;
|
|
172
|
+
const dy = pos[3 * i + 1] - cy;
|
|
173
|
+
scale = Math.min(scale, limit(cx, dx, b.x1, b.x1 + b.w), limit(cy, dy, b.y1, b.y1 + b.h));
|
|
174
|
+
farthest = Math.max(farthest, Math.hypot(dx, dy));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (!inside) {
|
|
178
|
+
scale = farthest > 0 ? frame(b).radius / farthest : 1;
|
|
179
|
+
}
|
|
180
|
+
else if (!Number.isFinite(scale)) {
|
|
181
|
+
scale = 1;
|
|
182
|
+
}
|
|
183
|
+
const xy = new Float64Array(2 * n);
|
|
184
|
+
for (let i = 0; i < n; i++) {
|
|
185
|
+
const s = maskTest(locked, i) ? 1 : scale;
|
|
186
|
+
xy[2 * i] = cx + s * (pos[3 * i] - cx);
|
|
187
|
+
xy[2 * i + 1] = cy + s * (pos[3 * i + 1] - cy);
|
|
188
|
+
}
|
|
189
|
+
return xy;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* The per-node options as @graphty/layout takes them: a node data field (`nodeMass: "mass"`) becomes an id-keyed
|
|
193
|
+
* record, where a node whose field is missing or not a finite number gets the layout's default; an array or a typed
|
|
194
|
+
* array other than a Float32Array becomes a Float32Array in node order (@graphty/layout would read a plain array as
|
|
195
|
+
* an object keyed by id, so `[2, 5]` would set nodes "0" and "1").
|
|
196
|
+
* @param cs - the layout's snapshot
|
|
197
|
+
* @param o - the layout options
|
|
198
|
+
* @returns the converted options
|
|
199
|
+
*/
|
|
200
|
+
function nodeFields(cs, o) {
|
|
201
|
+
const out = {};
|
|
202
|
+
for (const key of ["nodeMass", "nodeSize"]) {
|
|
203
|
+
const field = o[key];
|
|
204
|
+
if (Array.isArray(field) || (ArrayBuffer.isView(field) && !(field instanceof Float32Array))) {
|
|
205
|
+
out[key] = Float32Array.from(field);
|
|
206
|
+
}
|
|
207
|
+
else if (typeof field === "string") {
|
|
208
|
+
const values = {};
|
|
209
|
+
cs.nodes.forEach((node) => {
|
|
210
|
+
const v = node.data(field);
|
|
211
|
+
if (typeof v === "number" && Number.isFinite(v)) {
|
|
212
|
+
values[node.id()] = v;
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
out[key] = values;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return out;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* The position function `layoutPositions` and `positions()` take: an unplaced node keeps its position.
|
|
222
|
+
* @param xy - 2n values by node index
|
|
223
|
+
* @returns the position of node i
|
|
224
|
+
*/
|
|
225
|
+
function positionOf(xy) {
|
|
226
|
+
return (node, i) => (Number.isNaN(xy[2 * i]) ? node.position() : { x: xy[2 * i], y: xy[2 * i + 1] });
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Ends a discrete run through Cytoscape's `layoutPositions` (events, fit, spacing, transform, tween).
|
|
230
|
+
* @param layout - the layout
|
|
231
|
+
* @param nodes - the nodes in index order
|
|
232
|
+
* @param xy - 2n values by node index
|
|
233
|
+
*/
|
|
234
|
+
function finishDiscrete(layout, nodes, xy) {
|
|
235
|
+
// layoutPositions memoizes by node id and calls back with ITS index (non-parent nodes in collection order),
|
|
236
|
+
// which is ours because the snapshot was built from the same non-parent nodes
|
|
237
|
+
const at = positionOf(xy);
|
|
238
|
+
// Cytoscape's typings declare the first parameter a string; it is the layout object (index.d.ts defect)
|
|
239
|
+
nodes.layoutPositions(layout, layout.options, at);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* The options handed to a @graphty/layout function: the caller's, with the layout's own frame and weight flag.
|
|
243
|
+
* @param o - the layout options
|
|
244
|
+
* @returns the options
|
|
245
|
+
*/
|
|
246
|
+
function graphtyOptions(o) {
|
|
247
|
+
return { ...o, dim: o.dim ?? 2, scale: 1, center: undefined, seed: o.seed ?? null, weight: o.weight !== undefined };
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* The snapshot of the layout's nodes (compound parents are positioned by Cytoscape from their children).
|
|
251
|
+
* @param o - the layout options
|
|
252
|
+
* @returns the snapshot
|
|
253
|
+
*/
|
|
254
|
+
function layoutSnapshot(o) {
|
|
255
|
+
return toSnapshot(o.eles.not(":parent"), { weight: o.weight });
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Throws when the run would tween on a core that cannot: a headless core without `styleEnabled: true`, where
|
|
259
|
+
* Cytoscape's own tween fails with "ani.play is not a function".
|
|
260
|
+
* @param o - the layout options
|
|
261
|
+
* @param simulation - whether the layout is a simulation, which draws `animate: true` frame by frame instead
|
|
262
|
+
*/
|
|
263
|
+
function checkTween(o, simulation) {
|
|
264
|
+
const tweens = simulation ? o.animate !== true && Boolean(o.animate) : Boolean(o.animate);
|
|
265
|
+
// styleEnabled() is public Cytoscape API that its typings leave out
|
|
266
|
+
if (tweens && !o.cy.styleEnabled()) {
|
|
267
|
+
throw new Error(`${o.name}: animate needs a core that renders; create a headless core with styleEnabled: true, or pass animate: false`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Runs a static layout.
|
|
272
|
+
* @param layout - the layout
|
|
273
|
+
* @param fn - the layout function
|
|
274
|
+
*/
|
|
275
|
+
function runStatic(layout, fn) {
|
|
276
|
+
const o = layout.options;
|
|
277
|
+
checkTween(o, false);
|
|
278
|
+
const cs = layoutSnapshot(o);
|
|
279
|
+
const r = fn(cs.snapshot, graphtyOptions(o), cs);
|
|
280
|
+
finishDiscrete(layout, cs.nodes, fitRows(r.positions, r.dim, r.n, box(o.boundingBox, o.cy)));
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Steps until settled or stopped. Synchronous for a CPU simulation; a GPU simulation's step is a promise, and then
|
|
284
|
+
* so is this.
|
|
285
|
+
* @param sim - the simulation
|
|
286
|
+
* @param layout - the layout (its `stopped` flag ends the run)
|
|
287
|
+
* @returns a promise only when the simulation is asynchronous
|
|
288
|
+
*/
|
|
289
|
+
function stepToEnd(sim, layout) {
|
|
290
|
+
while (!sim.settled && !layout.stopped && !layout.options.cy.destroyed()) {
|
|
291
|
+
const r = sim.step(50);
|
|
292
|
+
if (r instanceof Promise) {
|
|
293
|
+
return r.then(() => stepToEnd(sim, layout));
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return undefined;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Runs a simulation layout: on the caller's accelerator, on the CPU when no GPU is enabled (synchronously), or on
|
|
300
|
+
* the core's GPU once one is acquired. The decision is made before the simulation starts; a GPU failure after that
|
|
301
|
+
* is reported as layouterror, never finished on the CPU.
|
|
302
|
+
* @param layout - the layout
|
|
303
|
+
* @param type - the simulation type
|
|
304
|
+
*/
|
|
305
|
+
function runSimulation(layout, type) {
|
|
306
|
+
const o = layout.options;
|
|
307
|
+
checkTween(o, true);
|
|
308
|
+
checkGpuMode(o.name, o.gpu);
|
|
309
|
+
layout.stopped = false;
|
|
310
|
+
if (o.accelerator !== undefined) {
|
|
311
|
+
layout.backend =
|
|
312
|
+
o.accelerator === null
|
|
313
|
+
? { ran: "cpu", reason: "accelerator: null was passed", device: null }
|
|
314
|
+
: { ran: "gpu", reason: null, device: o.accelerator.kind };
|
|
315
|
+
simulate(layout, type, o.accelerator);
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
// "require" goes through gpuFor, which turns a known CPU decision into the error layouterror reports
|
|
319
|
+
const known = o.gpu === "require" ? null : cpuWithoutAsking(o.gpu);
|
|
320
|
+
if (known !== null) {
|
|
321
|
+
layout.backend = backendOf(known, false, "");
|
|
322
|
+
warnIfFixable(known, o.eles.nodes().length);
|
|
323
|
+
simulate(layout, type, null);
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
layout.looping = true;
|
|
327
|
+
gpuFor(o.cy, o.gpu)
|
|
328
|
+
.then((d) => {
|
|
329
|
+
layout.looping = false;
|
|
330
|
+
layout.backend = backendOf(d, d.gpu !== null, "");
|
|
331
|
+
warnIfFixable(d, o.eles.nodes().length);
|
|
332
|
+
if (layout.stopped || o.cy.destroyed()) {
|
|
333
|
+
layout.emit({ type: "layoutstop", layout });
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
simulate(layout, type, d.gpu?.accelerator ?? null);
|
|
337
|
+
})
|
|
338
|
+
.catch((error) => {
|
|
339
|
+
layout.looping = false;
|
|
340
|
+
// the core destroyed meanwhile ends the run as stop() would
|
|
341
|
+
if (!o.cy.destroyed()) {
|
|
342
|
+
layout.emit("layouterror", [error]);
|
|
343
|
+
}
|
|
344
|
+
layout.emit({ type: "layoutstop", layout });
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
/** Per core and simulation: pixels per simulation unit of its last run, which a randomize: false run continues. */
|
|
348
|
+
const DRAWN_SCALE = new WeakMap();
|
|
349
|
+
/**
|
|
350
|
+
* The x-y centroid of stride-3 rows.
|
|
351
|
+
* @param pos - the rows
|
|
352
|
+
* @param n - row count
|
|
353
|
+
* @returns the centroid, z 0
|
|
354
|
+
*/
|
|
355
|
+
function centroidOf(pos, n) {
|
|
356
|
+
let x = 0;
|
|
357
|
+
let y = 0;
|
|
358
|
+
for (let i = 0; i < n; i++) {
|
|
359
|
+
x += pos[3 * i];
|
|
360
|
+
y += pos[3 * i + 1];
|
|
361
|
+
}
|
|
362
|
+
return n === 0 ? [0, 0, 0] : [x / n, y / n, 0];
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Runs a simulation on an accelerator (null: the CPU).
|
|
366
|
+
* @param layout - the layout
|
|
367
|
+
* @param type - the simulation type
|
|
368
|
+
* @param accelerator - the accelerator
|
|
369
|
+
*/
|
|
370
|
+
function simulate(layout, type, accelerator) {
|
|
371
|
+
const o = layout.options;
|
|
372
|
+
if (accelerator === null && type === "spring-electrical") {
|
|
373
|
+
const reason = layout.backend?.reason ?? "none was available";
|
|
374
|
+
// nothing ran, so no backend: "cpu" would say the layout ran there (as with gpu: "require")
|
|
375
|
+
layout.backend = undefined;
|
|
376
|
+
const error = new Error(`graphty-spring-electrical has no CPU simulation and runs only on the GPU; no GPU ran because ${reason}`);
|
|
377
|
+
// reported as gpu: "require" reports it, after run() returns, whether or not the GPU was asked for
|
|
378
|
+
failLater(layout, error);
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
const cs = layoutSnapshot(o);
|
|
382
|
+
const s = cs.snapshot;
|
|
383
|
+
const n = s.nodeCount;
|
|
384
|
+
const b = box(o.boundingBox, o.cy);
|
|
385
|
+
const { radius, center } = frame(b);
|
|
386
|
+
const dim = o.dim ?? 2;
|
|
387
|
+
// The simulation reads and writes this stride-3 array in "scene" units; scene units are pixels here, so a
|
|
388
|
+
// locked node is pinned exactly where it stands. A randomized node starts anywhere in the box (Cytoscape's
|
|
389
|
+
// convention). Not left NaN for @graphty/layout's seedPositions to fill: with exactly one finite row (one locked
|
|
390
|
+
// node) its draw box has zero width and every seeded node lands on the locked one; Fruchterman-Reingold then
|
|
391
|
+
// never separates them, and ForceAtlas2Simulation.load does not seed NaN rows at all.
|
|
392
|
+
const pos = new Float32Array(3 * n);
|
|
393
|
+
const fixed = makeMask(n);
|
|
394
|
+
const rng = new Lcg(o.seed ?? null);
|
|
395
|
+
let anyLocked = false;
|
|
396
|
+
cs.nodes.forEach((node, i) => {
|
|
397
|
+
const locked = node.locked();
|
|
398
|
+
anyLocked || (anyLocked = locked);
|
|
399
|
+
maskSet(fixed, i, locked);
|
|
400
|
+
const p = node.position();
|
|
401
|
+
const keep = locked || o.randomize === false;
|
|
402
|
+
pos[3 * i] = keep ? p.x : b.x1 + rng.next() * b.w;
|
|
403
|
+
pos[3 * i + 1] = keep ? p.y : b.y1 + rng.next() * b.h;
|
|
404
|
+
pos[3 * i + 2] = keep || dim === 2 ? 0 : (rng.next() * 2 - 1) * radius;
|
|
405
|
+
});
|
|
406
|
+
// A continuation (randomize: false) reads the positions at the scale the last run of this simulation on this core
|
|
407
|
+
// drew them at, about their centroid. Read at the box's scale instead, the graph would start far smaller than the
|
|
408
|
+
// simulation's own size, and the first steps would jolt it back out.
|
|
409
|
+
const drawn = o.randomize === false && !anyLocked ? DRAWN_SCALE.get(o.cy)?.get(type) : undefined;
|
|
410
|
+
const scale = drawn ?? radius;
|
|
411
|
+
const sim = createSimulation(type, {
|
|
412
|
+
...SIMULATION_DEFAULTS[type],
|
|
413
|
+
...graphtyOptions(o),
|
|
414
|
+
...nodeFields(cs, o),
|
|
415
|
+
scale,
|
|
416
|
+
center: drawn === undefined ? center : centroidOf(pos, n),
|
|
417
|
+
iterationsPerStep: 1,
|
|
418
|
+
}, accelerator);
|
|
419
|
+
sim.load(s, pos);
|
|
420
|
+
if (anyLocked) {
|
|
421
|
+
sim.setFixed(fixed);
|
|
422
|
+
}
|
|
423
|
+
// a data change while the simulation runs must not release the snapshot its device upload came from
|
|
424
|
+
const unhold = hold(s);
|
|
425
|
+
const dispose = () => {
|
|
426
|
+
sim.dispose();
|
|
427
|
+
unhold();
|
|
428
|
+
if (!anyLocked) {
|
|
429
|
+
// pixels per simulation unit once fitted to the box: fitRows scales the farthest node to `radius`
|
|
430
|
+
const [cx, cy] = centroidOf(pos, n);
|
|
431
|
+
let farthest = 0;
|
|
432
|
+
for (let i = 0; i < n; i++) {
|
|
433
|
+
farthest = Math.max(farthest, Math.hypot(pos[3 * i] - cx, pos[3 * i + 1] - cy));
|
|
434
|
+
}
|
|
435
|
+
if (farthest > 0) {
|
|
436
|
+
const scales = DRAWN_SCALE.get(o.cy) ?? new Map();
|
|
437
|
+
scales.set(type, (scale * radius) / farthest);
|
|
438
|
+
DRAWN_SCALE.set(o.cy, scales);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
};
|
|
442
|
+
// Fitted to the box as a static result is; with a locked node, the free nodes are scaled about the locked ones
|
|
443
|
+
const xy = () => (anyLocked ? fitAroundLocked(pos, fixed, n, b) : fitRows(pos, 3, n, b));
|
|
444
|
+
// A core destroyed mid-run ends the run as stop() would: its device is gone with it ("GpuContext is disposed"),
|
|
445
|
+
// and a write to it fails in Cytoscape ("reading 'notify'" of its null renderer).
|
|
446
|
+
const fail = (error) => {
|
|
447
|
+
layout.looping = false;
|
|
448
|
+
dispose();
|
|
449
|
+
if (!o.cy.destroyed()) {
|
|
450
|
+
layout.emit("layouterror", [error]);
|
|
451
|
+
}
|
|
452
|
+
layout.emit({ type: "layoutstop", layout });
|
|
453
|
+
};
|
|
454
|
+
if (o.animate !== true) {
|
|
455
|
+
const done = () => {
|
|
456
|
+
layout.looping = false;
|
|
457
|
+
dispose();
|
|
458
|
+
if (o.cy.destroyed()) {
|
|
459
|
+
layout.emit({ type: "layoutstop", layout });
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
finishDiscrete(layout, cs.nodes, xy());
|
|
463
|
+
}
|
|
464
|
+
};
|
|
465
|
+
const r = stepToEnd(sim, layout);
|
|
466
|
+
if (r === undefined) {
|
|
467
|
+
done();
|
|
468
|
+
}
|
|
469
|
+
else {
|
|
470
|
+
layout.looping = true;
|
|
471
|
+
r.then(done, fail);
|
|
472
|
+
}
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
// Continuous: one frame per animation frame, `refresh` iterations each
|
|
476
|
+
layout.looping = true;
|
|
477
|
+
layout.emit({ type: "layoutstart", layout });
|
|
478
|
+
let first = true;
|
|
479
|
+
const schedule = typeof requestAnimationFrame === "function"
|
|
480
|
+
? requestAnimationFrame
|
|
481
|
+
: (f) => setTimeout(f, 16);
|
|
482
|
+
const end = () => {
|
|
483
|
+
layout.looping = false;
|
|
484
|
+
dispose();
|
|
485
|
+
if (o.stop !== undefined) {
|
|
486
|
+
layout.one("layoutstop", o.stop);
|
|
487
|
+
}
|
|
488
|
+
layout.emit({ type: "layoutstop", layout });
|
|
489
|
+
};
|
|
490
|
+
const draw = () => {
|
|
491
|
+
if (o.cy.destroyed()) {
|
|
492
|
+
end();
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
cs.nodes.positions(positionOf(xy()));
|
|
496
|
+
if (o.fit !== false) {
|
|
497
|
+
o.cy.fit(o.eles, o.padding);
|
|
498
|
+
}
|
|
499
|
+
if (first) {
|
|
500
|
+
first = false;
|
|
501
|
+
if (o.ready !== undefined) {
|
|
502
|
+
layout.one("layoutready", o.ready);
|
|
503
|
+
}
|
|
504
|
+
layout.emit({ type: "layoutready", layout });
|
|
505
|
+
}
|
|
506
|
+
if (sim.settled || layout.stopped) {
|
|
507
|
+
end();
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
schedule(tick);
|
|
511
|
+
}
|
|
512
|
+
};
|
|
513
|
+
const tick = () => {
|
|
514
|
+
if (layout.stopped || o.cy.destroyed()) {
|
|
515
|
+
draw();
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
let r;
|
|
519
|
+
try {
|
|
520
|
+
r = sim.step(o.refresh ?? 1);
|
|
521
|
+
}
|
|
522
|
+
catch (error) {
|
|
523
|
+
fail(error);
|
|
524
|
+
return;
|
|
525
|
+
}
|
|
526
|
+
if (r instanceof Promise) {
|
|
527
|
+
r.then(draw, fail);
|
|
528
|
+
}
|
|
529
|
+
else {
|
|
530
|
+
draw();
|
|
531
|
+
}
|
|
532
|
+
};
|
|
533
|
+
tick();
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Ends a run that never started: layouterror with the error, then layoutstop, after run() returns.
|
|
537
|
+
* @param layout - the layout
|
|
538
|
+
* @param error - the error
|
|
539
|
+
*/
|
|
540
|
+
function failLater(layout, error) {
|
|
541
|
+
layout.looping = true;
|
|
542
|
+
void Promise.resolve().then(() => {
|
|
543
|
+
layout.looping = false;
|
|
544
|
+
layout.emit("layouterror", [error]);
|
|
545
|
+
layout.emit({ type: "layoutstop", layout });
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
/** Each layout object's run body, set by its registrant's constructor. */
|
|
549
|
+
const RUN_BODIES = new WeakMap();
|
|
550
|
+
/**
|
|
551
|
+
* A registrant's run(): runs the layout's body, or refuses a destroyed core with E_CORE_DESTROYED.
|
|
552
|
+
* @returns the layout
|
|
553
|
+
*/
|
|
554
|
+
function runLayout() {
|
|
555
|
+
if (this.options.cy.destroyed()) {
|
|
556
|
+
failLater(this, coreDestroyedError());
|
|
557
|
+
}
|
|
558
|
+
else {
|
|
559
|
+
RUN_BODIES.get(this)?.(this);
|
|
560
|
+
}
|
|
561
|
+
return this;
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* A simulation registrant's stop(). A running loop ends itself on its next frame and emits layoutstop; otherwise
|
|
565
|
+
* act as the registry would.
|
|
566
|
+
* @returns the layout
|
|
567
|
+
*/
|
|
568
|
+
function stopLayout() {
|
|
569
|
+
if (this.looping) {
|
|
570
|
+
this.stopped = true;
|
|
571
|
+
}
|
|
572
|
+
else {
|
|
573
|
+
this.emit({ type: "layoutstop", layout: this });
|
|
574
|
+
}
|
|
575
|
+
return this;
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* A Cytoscape layout registrant. It must be a function constructor: the registry calls it as
|
|
579
|
+
* `registrant.call(this, options)`, which a native class rejects.
|
|
580
|
+
* @param run - the run body
|
|
581
|
+
* @param withStop - whether the registrant defines stop(); without one the registry emits layoutstop itself
|
|
582
|
+
* @returns the registrant
|
|
583
|
+
*/
|
|
584
|
+
function registrant(run, withStop) {
|
|
585
|
+
function GraphtyLayout(options) {
|
|
586
|
+
this.options = { ...DEFAULTS, ...options };
|
|
587
|
+
this.stopped = false;
|
|
588
|
+
this.looping = false;
|
|
589
|
+
RUN_BODIES.set(this, run);
|
|
590
|
+
}
|
|
591
|
+
const methods = { run: runLayout };
|
|
592
|
+
if (withStop) {
|
|
593
|
+
methods.stop = stopLayout;
|
|
594
|
+
}
|
|
595
|
+
// A function's prototype is typed any; assigning through Object.assign keeps the methods typed.
|
|
596
|
+
Object.assign(GraphtyLayout.prototype, methods);
|
|
597
|
+
return GraphtyLayout;
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* Registers every graphty layout as "graphty-<name>": `cytoscape.use(graphtyCytoscape)`.
|
|
601
|
+
* @param cytoscape - the cytoscape function
|
|
602
|
+
*/
|
|
603
|
+
export function registerLayouts(cytoscape) {
|
|
604
|
+
for (const [name, fn] of Object.entries(STATIC)) {
|
|
605
|
+
cytoscape("layout", `graphty-${name}`, registrant((l) => {
|
|
606
|
+
runStatic(l, fn);
|
|
607
|
+
}, false));
|
|
608
|
+
}
|
|
609
|
+
for (const [name, type] of Object.entries(SIMULATIONS)) {
|
|
610
|
+
cytoscape("layout", `graphty-${name}`, registrant((l) => {
|
|
611
|
+
runSimulation(l, type);
|
|
612
|
+
}, true));
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
//# sourceMappingURL=layouts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layouts.js","sourceRoot":"","sources":["../src/layouts.ts"],"names":[],"mappings":"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"}
|
package/dist/lazy.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loading the parts of the package that are fetched on first use (the generators and datasets, the file formats, the
|
|
3
|
+
* WebGPU code), with a warning when one never arrives.
|
|
4
|
+
*/
|
|
5
|
+
/** How long a part may take to load before the call warns that it may never load. */
|
|
6
|
+
export declare const STALL_MS = 5000;
|
|
7
|
+
/**
|
|
8
|
+
* A part of the package loaded on first use, warning on the console when it has not loaded after STALL_MS.
|
|
9
|
+
*
|
|
10
|
+
* In a Vite 6 or 7 (Rollup) production build, the part's chunk imports the chunk that holds the consumer's entry
|
|
11
|
+
* module, because both use @graphty/graph-format and Rollup puts shared code in the chunk that loads first. When that
|
|
12
|
+
* entry module awaits the call at its top level, the entry chunk is still evaluating, so the part can never run and
|
|
13
|
+
* the await never settles. ES modules report nothing, and no package layout avoids it (the package's synchronous
|
|
14
|
+
* methods need @graphty/graph-format up front), so the warning names the cause. A slow network shows it too; the
|
|
15
|
+
* call then carries on.
|
|
16
|
+
* @param load - the dynamic import
|
|
17
|
+
* @param call - what is waiting, as the reader wrote it ("graphtyDataset")
|
|
18
|
+
* @returns the import
|
|
19
|
+
*/
|
|
20
|
+
export declare function loadPart<T>(load: Promise<T>, call: string): Promise<T>;
|
|
21
|
+
//# sourceMappingURL=lazy.d.ts.map
|