@kortexya/nodus 0.1.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 (252) hide show
  1. package/LICENSE +37 -0
  2. package/README.md +60 -0
  3. package/__vite-plugin-wasm-helper-1Aiokjk5.js +24 -0
  4. package/assets/hypergraphWorker-DV0aFI3L.js +1 -0
  5. package/assets/layoutWorker-DwDJwbgr.js +285 -0
  6. package/assets/nodus_wasm-C0vDfO5K.js +1 -0
  7. package/chunk-DmhlhrBa.js +11 -0
  8. package/nodus.src.bundle.js +33577 -0
  9. package/nodus_render_wasm-Bs6hlsx-.js +2617 -0
  10. package/nodus_wasm-DKYQVSUZ.js +2789 -0
  11. package/package.json +61 -0
  12. package/types/Nodus.d.ts +100 -0
  13. package/types/algorithms/concentric/index.d.ts +29 -0
  14. package/types/algorithms/concentricFactory.d.ts +43 -0
  15. package/types/algorithms/force/Alea.d.ts +13 -0
  16. package/types/algorithms/force/BVH.d.ts +35 -0
  17. package/types/algorithms/force/LayoutData.d.ts +40 -0
  18. package/types/algorithms/force/Packing.d.ts +31 -0
  19. package/types/algorithms/force/Physics.d.ts +61 -0
  20. package/types/algorithms/force/SEC.d.ts +14 -0
  21. package/types/algorithms/force/Topology.d.ts +3 -0
  22. package/types/algorithms/force/index.d.ts +54 -0
  23. package/types/algorithms/force-gpu/ParticleSystem.d.ts +45 -0
  24. package/types/algorithms/force-gpu/Settings.d.ts +60 -0
  25. package/types/algorithms/force-gpu/Simulation.d.ts +7 -0
  26. package/types/algorithms/force-gpu/getGlContext.d.ts +10 -0
  27. package/types/algorithms/force-gpu/gpuLayout.d.ts +14 -0
  28. package/types/algorithms/force-gpu/index.d.ts +2 -0
  29. package/types/algorithms/force-gpu/kernels/index.d.ts +176 -0
  30. package/types/algorithms/force-gpu/kernels/utils.d.ts +31 -0
  31. package/types/algorithms/force-gpu/shaders/aabb.d.ts +2 -0
  32. package/types/algorithms/force-gpu/shaders/bhExpand.d.ts +2 -0
  33. package/types/algorithms/force-gpu/shaders/bhTranslate.d.ts +2 -0
  34. package/types/algorithms/force-gpu/shaders/cellLookup.d.ts +2 -0
  35. package/types/algorithms/force-gpu/shaders/index.d.ts +9 -0
  36. package/types/algorithms/force-gpu/shaders/integrate.d.ts +2 -0
  37. package/types/algorithms/force-gpu/shaders/morton.d.ts +2 -0
  38. package/types/algorithms/force-gpu/shaders/sortIntervals.d.ts +2 -0
  39. package/types/algorithms/force-gpu/shaders/sortKeys.d.ts +2 -0
  40. package/types/algorithms/force-gpu/shaders/types.d.ts +10 -0
  41. package/types/algorithms/force-gpu/webgl/helpers.d.ts +24 -0
  42. package/types/algorithms/force-gpu/webgl/index.d.ts +4 -0
  43. package/types/algorithms/force-gpu/webgl/program.d.ts +15 -0
  44. package/types/algorithms/forceFactory.d.ts +55 -0
  45. package/types/algorithms/forceLinkFactory.d.ts +40 -0
  46. package/types/algorithms/grid/index.d.ts +26 -0
  47. package/types/algorithms/gridFactory.d.ts +30 -0
  48. package/types/algorithms/hierarchical/index.d.ts +80 -0
  49. package/types/algorithms/hierarchical/sugiyama.d.ts +144 -0
  50. package/types/algorithms/hierarchicalFactory.d.ts +49 -0
  51. package/types/algorithms/index.d.ts +13 -0
  52. package/types/algorithms/radial/index.d.ts +33 -0
  53. package/types/algorithms/radialFactory.d.ts +54 -0
  54. package/types/algorithms/sequential/index.d.ts +37 -0
  55. package/types/algorithms/sequentialFactory.d.ts +37 -0
  56. package/types/core/Edge.d.ts +67 -0
  57. package/types/core/EdgeList.d.ts +86 -0
  58. package/types/core/Node.d.ts +89 -0
  59. package/types/core/NodeList.d.ts +105 -0
  60. package/types/core/Transformation.d.ts +108 -0
  61. package/types/core/enums.d.ts +16 -0
  62. package/types/geometry/BoundingBox.d.ts +41 -0
  63. package/types/geometry/index.d.ts +276 -0
  64. package/types/geometry/types.d.ts +27 -0
  65. package/types/hypergraph/Hypergraph.d.ts +74 -0
  66. package/types/hypergraph/KoenigGraph.d.ts +29 -0
  67. package/types/hypergraph/Simplifier.d.ts +39 -0
  68. package/types/hypergraph/Statistics.d.ts +55 -0
  69. package/types/hypergraph/forbidden/StrangledHyperedge.d.ts +12 -0
  70. package/types/hypergraph/forbidden/StrangledVertex.d.ts +16 -0
  71. package/types/hypergraph/forbidden/ThreeAdjacentCluster2.d.ts +10 -0
  72. package/types/hypergraph/forbidden/TwoAdjacentCluster3.d.ts +14 -0
  73. package/types/hypergraph/forbidden/index.d.ts +22 -0
  74. package/types/hypergraph/index.d.ts +21 -0
  75. package/types/hypergraph/layout/Adam.d.ts +12 -0
  76. package/types/hypergraph/layout/Energy.d.ts +55 -0
  77. package/types/hypergraph/layout/LBFGS.d.ts +32 -0
  78. package/types/hypergraph/layout/Optimizer.d.ts +60 -0
  79. package/types/hypergraph/layout/Reverser.d.ts +42 -0
  80. package/types/hypergraph/operations/AtomicOperation.d.ts +54 -0
  81. package/types/hypergraph/operations/HyperedgeMerger.d.ts +30 -0
  82. package/types/hypergraph/operations/HyperedgeRemoval.d.ts +27 -0
  83. package/types/hypergraph/operations/VertexMerger.d.ts +32 -0
  84. package/types/hypergraph/operations/VertexRemoval.d.ts +30 -0
  85. package/types/hypergraph/operations/index.d.ts +19 -0
  86. package/types/hypergraph/osfkb/adapter.d.ts +315 -0
  87. package/types/hypergraph/render/Interaction.d.ts +40 -0
  88. package/types/hypergraph/render/PolygonRenderer.d.ts +50 -0
  89. package/types/hypergraph/render/SVGPolygonRenderer.d.ts +7 -0
  90. package/types/hypergraph/types.d.ts +170 -0
  91. package/types/index.d.ts +21 -0
  92. package/types/internals/Algorithms.d.ts +68 -0
  93. package/types/internals/AlgorithmsPrimitives.d.ts +18 -0
  94. package/types/internals/Animations.d.ts +39 -0
  95. package/types/internals/AttributePathPrimitives.d.ts +2 -0
  96. package/types/internals/Brand.d.ts +22 -0
  97. package/types/internals/Camera.d.ts +115 -0
  98. package/types/internals/CameraInteractions.d.ts +15 -0
  99. package/types/internals/CameraInteractionsPrimitives.d.ts +18 -0
  100. package/types/internals/Captor.d.ts +56 -0
  101. package/types/internals/CaptorPrimitives.d.ts +9 -0
  102. package/types/internals/ClassModule.d.ts +42 -0
  103. package/types/internals/ConnectNodes.d.ts +23 -0
  104. package/types/internals/CurvatureManager.d.ts +14 -0
  105. package/types/internals/DataModule.d.ts +29 -0
  106. package/types/internals/Disabled.d.ts +27 -0
  107. package/types/internals/DomModule.d.ts +87 -0
  108. package/types/internals/DragModule.d.ts +14 -0
  109. package/types/internals/ElementSet.d.ts +17 -0
  110. package/types/internals/EventsModule.d.ts +41 -0
  111. package/types/internals/FlexArray.d.ts +54 -0
  112. package/types/internals/Geo.d.ts +127 -0
  113. package/types/internals/Graph.d.ts +109 -0
  114. package/types/internals/Graphics.d.ts +112 -0
  115. package/types/internals/GraphicsEngine.d.ts +96 -0
  116. package/types/internals/Hover.d.ts +32 -0
  117. package/types/internals/Hypergraph.d.ts +112 -0
  118. package/types/internals/IndexList.d.ts +28 -0
  119. package/types/internals/IndividualAttributes.d.ts +27 -0
  120. package/types/internals/Interactions.d.ts +45 -0
  121. package/types/internals/Keyboard.d.ts +25 -0
  122. package/types/internals/LabelManager.d.ts +56 -0
  123. package/types/internals/Lasso.d.ts +22 -0
  124. package/types/internals/Layers.d.ts +79 -0
  125. package/types/internals/LayersPrimitives.d.ts +5 -0
  126. package/types/internals/Layouts.d.ts +35 -0
  127. package/types/internals/LayoutsInternal.d.ts +37 -0
  128. package/types/internals/LayoutsPrimitives.d.ts +23 -0
  129. package/types/internals/Legend.d.ts +33 -0
  130. package/types/internals/LegendPrimitives.d.ts +3 -0
  131. package/types/internals/Locate.d.ts +43 -0
  132. package/types/internals/LocatePrimitives.d.ts +20 -0
  133. package/types/internals/MappingManager.d.ts +27 -0
  134. package/types/internals/MappingPrimitives.d.ts +29 -0
  135. package/types/internals/Module.d.ts +23 -0
  136. package/types/internals/Mouse.d.ts +42 -0
  137. package/types/internals/NodusModules.d.ts +99 -0
  138. package/types/internals/PositionModule.d.ts +10 -0
  139. package/types/internals/PulseModule.d.ts +29 -0
  140. package/types/internals/Quadtree.d.ts +100 -0
  141. package/types/internals/RectangleSelect.d.ts +18 -0
  142. package/types/internals/Resizing.d.ts +48 -0
  143. package/types/internals/Rewiring.d.ts +64 -0
  144. package/types/internals/SchemaWatchPrimitives.d.ts +75 -0
  145. package/types/internals/Selection.d.ts +52 -0
  146. package/types/internals/SelectionModule.d.ts +27 -0
  147. package/types/internals/Settings.d.ts +20 -0
  148. package/types/internals/Snapping.d.ts +54 -0
  149. package/types/internals/Spatial.d.ts +50 -0
  150. package/types/internals/SpatialPrimitives.d.ts +75 -0
  151. package/types/internals/Storage.d.ts +46 -0
  152. package/types/internals/StyleRulesModule.d.ts +21 -0
  153. package/types/internals/Synchronizer.d.ts +17 -0
  154. package/types/internals/Tooltip.d.ts +25 -0
  155. package/types/internals/TooltipPrimitives.d.ts +21 -0
  156. package/types/internals/Topology.d.ts +50 -0
  157. package/types/internals/Touch.d.ts +16 -0
  158. package/types/internals/Transformations.d.ts +36 -0
  159. package/types/internals/VirtualMouse.d.ts +52 -0
  160. package/types/internals/WasmHGrid.d.ts +25 -0
  161. package/types/internals/WatcherModule.d.ts +25 -0
  162. package/types/internals/Workers.d.ts +79 -0
  163. package/types/internals/algorithmExports.d.ts +333 -0
  164. package/types/internals/algorithmHelpers.d.ts +36 -0
  165. package/types/internals/attributes/AttributesManager.d.ts +216 -0
  166. package/types/internals/attributes/ElementAttributesManager.d.ts +119 -0
  167. package/types/internals/attributes/attributeHelpers.d.ts +70 -0
  168. package/types/internals/attributes/flexArrayFactories.d.ts +277 -0
  169. package/types/internals/easing.d.ts +15 -0
  170. package/types/internals/helpers.d.ts +79 -0
  171. package/types/internals/hypergraphWorker.d.ts +37 -0
  172. package/types/internals/hypergraphWorkerHost.d.ts +40 -0
  173. package/types/internals/labels/SpatialGrid.d.ts +29 -0
  174. package/types/internals/labels/fillEdgeTexts.d.ts +25 -0
  175. package/types/internals/labels/fillNodeTexts.d.ts +24 -0
  176. package/types/internals/labels/helpers.d.ts +180 -0
  177. package/types/internals/layoutWorker.d.ts +21 -0
  178. package/types/internals/rendering/BoundariesManager.d.ts +53 -0
  179. package/types/internals/rendering/Buffer2.d.ts +91 -0
  180. package/types/internals/rendering/BufferList.d.ts +86 -0
  181. package/types/internals/rendering/CpuRenderer.d.ts +128 -0
  182. package/types/internals/rendering/EasingManager.d.ts +40 -0
  183. package/types/internals/rendering/EdgeDrawer.d.ts +54 -0
  184. package/types/internals/rendering/ElementGroup.d.ts +66 -0
  185. package/types/internals/rendering/MemoryManager.d.ts +71 -0
  186. package/types/internals/rendering/NodeDrawer.d.ts +49 -0
  187. package/types/internals/rendering/PatternManager.d.ts +29 -0
  188. package/types/internals/rendering/RENDER_MAPPING.d.ts +5 -0
  189. package/types/internals/rendering/RendererBase.d.ts +127 -0
  190. package/types/internals/rendering/ShapeManager.d.ts +46 -0
  191. package/types/internals/rendering/TextManager.d.ts +112 -0
  192. package/types/internals/rendering/canvasHelpers.d.ts +5 -0
  193. package/types/internals/rendering/constants.d.ts +125 -0
  194. package/types/internals/rendering/curveHelpers.d.ts +96 -0
  195. package/types/internals/rendering/drawerHelpers.d.ts +32 -0
  196. package/types/internals/rendering/float16.d.ts +25 -0
  197. package/types/internals/rendering/hitDetection.d.ts +89 -0
  198. package/types/internals/rendering/loadGraph.d.ts +103 -0
  199. package/types/internals/rendering/objectInfo.d.ts +46 -0
  200. package/types/internals/rendering/packing.d.ts +46 -0
  201. package/types/internals/rendering/shapeHelpers.d.ts +26 -0
  202. package/types/internals/rendering/types.d.ts +143 -0
  203. package/types/internals/renderingBinaryPrimitives.d.ts +110 -0
  204. package/types/internals/utilsExports.d.ts +408 -0
  205. package/types/internals/wasmBackend.d.ts +38 -0
  206. package/types/internals/wasmColumns.d.ts +61 -0
  207. package/types/internals/wasmInit.d.ts +1 -0
  208. package/types/modules/APIModule.d.ts +8 -0
  209. package/types/modules/AlgorithmsAPI.d.ts +15 -0
  210. package/types/modules/BrandAPI.d.ts +6 -0
  211. package/types/modules/CaptorAPI.d.ts +9 -0
  212. package/types/modules/ClassesAPI.d.ts +9 -0
  213. package/types/modules/DebugAPI.d.ts +18 -0
  214. package/types/modules/DisabledAPI.d.ts +11 -0
  215. package/types/modules/DomAPI.d.ts +9 -0
  216. package/types/modules/EventsAPI.d.ts +16 -0
  217. package/types/modules/ExportAPI.d.ts +23 -0
  218. package/types/modules/GeneratorsAPI.d.ts +12 -0
  219. package/types/modules/GeoAPI.d.ts +20 -0
  220. package/types/modules/GraphAPI.d.ts +26 -0
  221. package/types/modules/GraphicsAPI.d.ts +8 -0
  222. package/types/modules/HypergraphAPI.d.ts +71 -0
  223. package/types/modules/KeyboardAPI.d.ts +6 -0
  224. package/types/modules/LayersAPI.d.ts +7 -0
  225. package/types/modules/LayoutsAPI.d.ts +25 -0
  226. package/types/modules/LegendAPI.d.ts +9 -0
  227. package/types/modules/MouseAPI.d.ts +16 -0
  228. package/types/modules/ParseAPI.d.ts +83 -0
  229. package/types/modules/RulesAPI.d.ts +7 -0
  230. package/types/modules/SchemaAPI.d.ts +9 -0
  231. package/types/modules/SelectionAPI.d.ts +12 -0
  232. package/types/modules/SettingsAPI.d.ts +9 -0
  233. package/types/modules/StylesAPI.d.ts +64 -0
  234. package/types/modules/ToolsAPI.d.ts +68 -0
  235. package/types/modules/TransformationsAPI.d.ts +30 -0
  236. package/types/modules/ViewAPI.d.ts +52 -0
  237. package/types/publicTypes.d.ts +56 -0
  238. package/types/renderers/CanvasRenderer.d.ts +86 -0
  239. package/types/renderers/Renderer.d.ts +13 -0
  240. package/types/renderers/SVGRenderer.d.ts +57 -0
  241. package/types/renderers/WasmGraphRenderer.d.ts +118 -0
  242. package/types/renderers/WasmRendererAdapter.d.ts +38 -0
  243. package/types/tools/ConnectNodesAPI.d.ts +42 -0
  244. package/types/tools/LassoAPI.d.ts +78 -0
  245. package/types/tools/RectangleSelectAPI.d.ts +51 -0
  246. package/types/tools/ResizingAPI.d.ts +62 -0
  247. package/types/tools/RewiringAPI.d.ts +78 -0
  248. package/types/tools/SnappingAPI.d.ts +71 -0
  249. package/types/tools/ToolsAPI.d.ts +46 -0
  250. package/types/tools/TooltipAPI.d.ts +141 -0
  251. package/types/transformations/TransformationsEngine.d.ts +602 -0
  252. package/types/utils/index.d.ts +6 -0
package/LICENSE ADDED
@@ -0,0 +1,37 @@
1
+ Nodus — Proprietary Software License
2
+ Copyright (c) 2026 Kortexya. All Rights Reserved.
3
+
4
+ This software, including its source code, object code, documentation, and all
5
+ associated materials (collectively, the "Software"), is the confidential and
6
+ proprietary property of Kortexya ("the Company"). The Software is licensed, not
7
+ sold, and is protected by copyright, trade secret, and other intellectual
8
+ property laws and treaties.
9
+
10
+ NO LICENSE GRANTED BY DEFAULT. No license or right, express or implied, by
11
+ estoppel or otherwise, to any intellectual property of the Company is granted
12
+ by the mere availability or distribution of this package. All rights are
13
+ reserved by the Company.
14
+
15
+ Without the prior, express, written permission of the Company, you may NOT,
16
+ in whole or in part:
17
+
18
+ 1. use, execute, or run the Software for any purpose;
19
+ 2. copy, reproduce, publish, distribute, or sublicense the Software;
20
+ 3. modify, adapt, translate, or create derivative works of the Software;
21
+ 4. reverse engineer, decompile, disassemble, or otherwise attempt to derive
22
+ the source code, structure, or organization of the Software; or
23
+ 5. remove, alter, or obscure any proprietary notice contained herein.
24
+
25
+ Any permission to use the Software, if granted, is non-exclusive,
26
+ non-transferable, revocable, and governed exclusively by the terms of a
27
+ separate written agreement executed with the Company. Absent such an agreement,
28
+ no rights whatsoever are granted and all rights are reserved.
29
+
30
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
31
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
32
+ FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND NONINFRINGEMENT. IN NO EVENT SHALL
33
+ THE COMPANY BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN
34
+ ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION
35
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
36
+
37
+ For licensing inquiries, contact: david.loiret@kortexya.com
package/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # Nodus
2
+
3
+ A high-performance graph visualization engine for the web. Nodus renders large
4
+ node–link diagrams across Canvas, SVG, WebGL and WebGPU back-ends, with built-in
5
+ layouts (force, hierarchical, radial, grid, concentric, sequential), styling
6
+ rules, interaction tools and hypergraph support.
7
+
8
+ ## Install
9
+
10
+ ```bash
11
+ npm install --save @kortexya/nodus
12
+ ```
13
+
14
+ Or drop the bundle straight into a page:
15
+
16
+ ```html
17
+ <script src="path/to/nodus.umd.cjs"></script>
18
+ <script>
19
+ const nodus = new Nodus({ container: 'graph-container' });
20
+ </script>
21
+ ```
22
+
23
+ With ES modules:
24
+
25
+ ```html
26
+ <script type="module">
27
+ import { Nodus } from '@kortexya/nodus';
28
+ const nodus = new Nodus({ container: 'graph-container' });
29
+ </script>
30
+ ```
31
+
32
+ ## Usage
33
+
34
+ ```js
35
+ import { Nodus } from '@kortexya/nodus';
36
+
37
+ const nodus = new Nodus({ container: document.getElementById('graph') });
38
+
39
+ await nodus.setGraph({
40
+ nodes: [{ id: 'a' }, { id: 'b' }],
41
+ edges: [{ source: 'a', target: 'b' }],
42
+ });
43
+
44
+ await nodus.layouts.force({ duration: 0 });
45
+ await nodus.view.locateGraph();
46
+ ```
47
+
48
+ ## Build from source
49
+
50
+ The library lives in [`src/`](src). Produce a single-file bundle with:
51
+
52
+ ```bash
53
+ npm run build # → nodus.src.bundle.js
54
+ ```
55
+
56
+ For local development, run the Vite dev server and open the example pages:
57
+
58
+ ```bash
59
+ npx vite --host 127.0.0.1 --port 5199
60
+ ```
@@ -0,0 +1,24 @@
1
+ //#region ../../../__vite-plugin-wasm-helper
2
+ var e = async (e = {}, t) => {
3
+ let n;
4
+ if (t.startsWith("data:")) {
5
+ let r = t.replace(/^data:.*?base64,/, ""), i;
6
+ if (typeof Buffer == "function" && typeof Buffer.from == "function") i = Buffer.from(r, "base64");
7
+ else if (typeof atob == "function") {
8
+ let e = atob(r);
9
+ i = new Uint8Array(e.length);
10
+ for (let t = 0; t < e.length; t++) i[t] = e.charCodeAt(t);
11
+ } else throw Error("Cannot decode base64-encoded data URL");
12
+ n = await WebAssembly.instantiate(i, e);
13
+ } else {
14
+ let r = await fetch(t), i = r.headers.get("Content-Type") || "";
15
+ if ("instantiateStreaming" in WebAssembly && i.startsWith("application/wasm")) n = await WebAssembly.instantiateStreaming(r, e);
16
+ else {
17
+ let t = await r.arrayBuffer();
18
+ n = await WebAssembly.instantiate(t, e);
19
+ }
20
+ }
21
+ return n.instance.exports;
22
+ };
23
+ //#endregion
24
+ export { e as t };
@@ -0,0 +1 @@
1
+ const e=[`geometry`,`graph`,`attr`,`spatial`,`transform`,`layout`,`hyper`,`render`];function t(){let t={};for(let n of e)t[n]=`ts`;return t}let n=t();function r(r){if(n=t(),r){if(r.all===`ts`||r.all===`wasm`)for(let t of e)n[t]=r.all;for(let t of e){let e=r[t];(e===`ts`||e===`wasm`)&&(n[t]=e)}}}function i(e){return n[e]===`wasm`}let a=null;function o(){return a}function s(e){a=e}var c=class e{_vertices=new Map;_hyperedges=new Map;_incidence=new Map;_struct=null;_intern=new Map;_nextIntern=1n;_internOf(e){let t=this._intern.get(e);return t===void 0&&(t=this._nextIntern++,this._intern.set(e,t)),t}_hs(){if(!this._struct){let e=o();this._struct=new e.HyperStruct}return this._struct}constructor(e){this._hs(),e&&this.load(e)}load(e){this._struct?.free?.(),this._struct=null,this._intern.clear(),this._nextIntern=1n,this._hs(),this._vertices.clear(),this._hyperedges.clear(),this._incidence.clear();for(let t of e.vertices)this.addVertex(t);for(let t of e.hyperedges)this.addHyperedge(t);return this}toData(){return{vertices:Array.from(this._vertices.values()).map(e=>({...e})),hyperedges:Array.from(this._hyperedges.values()).map(e=>({...e,vertices:e.vertices.slice()}))}}clone(){return new e(this.toData())}vertexCount(){return this._vertices.size}hyperedgeCount(){return this._hyperedges.size}hasVertex(e){return this._vertices.has(e)}hasHyperedge(e){return this._hyperedges.has(e)}getVertex(e){return this._vertices.get(e)}getHyperedge(e){return this._hyperedges.get(e)}vertices(){return this._vertices.values()}hyperedges(){return this._hyperedges.values()}vertexIds(){return this._vertices.keys()}hyperedgeIds(){return this._hyperedges.keys()}addVertex(e){if(this._vertices.has(e.id))throw Error(`Vertex ${e.id} already exists`);return this._hs().add_vertex(this._internOf(e.id)),this._vertices.set(e.id,{...e}),this._incidence.set(e.id,new Set),this}addHyperedge(e){if(this._hyperedges.has(e.id))throw Error(`Hyperedge ${e.id} already exists`);let t=e.vertices.slice();{let n=new BigInt64Array(t.length);for(let e=0;e<t.length;e++)n[e]=this._internOf(t[e]);this._hs().add_hyperedge(this._internOf(e.id),n)}this._hyperedges.set(e.id,{...e,vertices:t});for(let n of t){let t=this._incidence.get(n);t||(t=new Set,this._incidence.set(n,t)),t.add(e.id)}return this}removeVertex(e){if(!this._vertices.get(e))throw Error(`Vertex ${e} not found`);this._hs().remove_vertex(this._internOf(e));let t=Array.from(this._incidence.get(e)??[]);for(let n of t){let t=this._hyperedges.get(n);t.vertices=t.vertices.filter(t=>t!==e)}return this._vertices.delete(e),this._incidence.delete(e),{incidentHyperedges:t}}removeHyperedge(e){let t=this._hyperedges.get(e);if(!t)throw Error(`Hyperedge ${e} not found`);this._hs().remove_hyperedge(this._internOf(e));let n=t.vertices.slice();for(let t of n){let n=this._incidence.get(t);n&&n.delete(e)}return this._hyperedges.delete(e),{incidentVertices:n}}setHyperedgeVertices(e,t){let n=this._hyperedges.get(e);if(!n)throw Error(`Hyperedge ${e} not found`);{let n=new BigInt64Array(t.length);for(let e=0;e<t.length;e++)n[e]=this._internOf(t[e]);this._hs().set_hyperedge_vertices(this._internOf(e),n)}for(let t of n.vertices){let n=this._incidence.get(t);n&&n.delete(e)}n.vertices=t.slice();for(let n of t){let t=this._incidence.get(n);t||(t=new Set,this._incidence.set(n,t)),t.add(e)}}incidentHyperedges(e){let t=this._incidence.get(e);return t?Array.from(t):[]}hyperedgeVertices(e){return this._hyperedges.get(e)?.vertices.slice()??[]}vertexAdjacent(e,t){if(e===t)return!1;let n=this._incidence.get(e),r=this._incidence.get(t);if(!n||!r)return!1;if(n.size>r.size)return this.vertexAdjacent(t,e);for(let e of n)if(r.has(e))return!0;return!1}hyperedgeAdjacent(e,t){if(e===t)return!1;let n=this._hyperedges.get(e)?.vertices,r=this._hyperedges.get(t)?.vertices;if(!n||!r)return!1;let i=new Set(r);for(let e of n)if(i.has(e))return!0;return!1}sharedHyperedges(e,t){if(e===t)return[];let n=this._incidence.get(e),r=this._incidence.get(t);if(!n||!r)return[];let i=[];for(let e of n)r.has(e)&&i.push(e);return i}sharedVertices(e,t){if(e===t)return[];let n=this._hyperedges.get(e)?.vertices,r=this._hyperedges.get(t)?.vertices;if(!n||!r)return[];let i=new Set(r);return n.filter(e=>i.has(e))}adjacentVertices(e){let t=new Set;for(let n of this._incidence.get(e)??[]){let r=this._hyperedges.get(n);if(r)for(let n of r.vertices)n!==e&&t.add(n)}return Array.from(t)}adjacentHyperedges(e){let t=new Set,n=this._hyperedges.get(e);if(!n)return[];for(let r of n.vertices)for(let n of this._incidence.get(r)??[])n!==e&&t.add(n);return Array.from(t)}degree(e){return this._incidence.get(e)?.size??0}cardinality(e){return this._hyperedges.get(e)?.vertices.length??0}isLinear(){return this._hs().is_linear()}isConnected(){return this._hs().is_connected()}isConnectedAfterRemoval(e){if(e.vertex!==void 0&&!this._vertices.has(e.vertex)||e.hyperedge!==void 0&&!this._hyperedges.has(e.hyperedge))return this.isConnected();let t=e.vertex===void 0?NaN:Number(this._internOf(e.vertex)),n=e.hyperedge===void 0?NaN:Number(this._internOf(e.hyperedge));return this._hs().is_connected_after_removal(t,n)}};function l(e,t,n){let{vCount:r,eCount:i}=e,a=t,o=2*r,s=t.length,c=new Float64Array(s),l=0;if(n.coordination>0){for(let r=0;r<i;r++){let i=e.hyperedgeVerts[r],s=i.length;if(s===0)continue;let u=0,d=0;for(let e of i)u+=a[2*e],d+=a[2*e+1];u/=s,d/=s;let f=o+2*r,p=t[f]-u,m=t[f+1]-d;l+=n.coordination*(p*p+m*m),c[f]+=n.coordination*2*p,c[f+1]+=n.coordination*2*m;let h=-n.coordination*2/s;for(let e of i)c[2*e]+=h*p,c[2*e+1]+=h*m}for(let i=0;i<r;i++){let r=e.vertexInHyperedges[i],s=r.length;if(s===0)continue;let u=0,d=0;for(let e of r)u+=t[o+2*e],d+=t[o+2*e+1];u/=s,d/=s;let f=2*i,p=a[f]-u,m=a[f+1]-d;l+=n.coordination*(p*p+m*m),c[f]+=n.coordination*2*p,c[f+1]+=n.coordination*2*m;let h=-n.coordination*2/s;for(let e of r)c[o+2*e]+=h*p,c[o+2*e+1]+=h*m}}for(let t=0;t<i;t++){let r=e.hyperedgeVerts[t],i=r.length;if(i<3)continue;let o=new Float64Array(i),s=new Float64Array(i);for(let e=0;e<i;e++)o[e]=a[2*r[e]],s[e]=a[2*r[e]+1];let u=0,d=0;for(let e=0;e<i;e++)u+=o[e],d+=s[e];if(u/=i,d/=i,n.area>0){let a=e.targetArea[t],u=0;for(let e=0;e<i;e++){let t=(e+1)%i;u+=o[e]*s[t]-o[t]*s[e]}u*=.5;let d=(Math.abs(u)-a)/Math.max(1,a);l+=n.area*d*d;let f=u>=0?1:-1,p=n.area*2*d*f/Math.max(1,a);for(let e=0;e<i;e++){let t=(e+1)%i,n=(e-1+i)%i,a=.5*(s[t]-s[n]),l=.5*(o[n]-o[t]);c[2*r[e]]+=p*a,c[2*r[e]+1]+=p*l}}if(n.regularity>0){let e=new Float64Array(i),t=new Float64Array(i),a=new Float64Array(i),u=0;for(let n=0;n<i;n++){let r=(n+1)%i;e[n]=o[r]-o[n],t[n]=s[r]-s[n],a[n]=Math.sqrt(e[n]*e[n]+t[n]*t[n])||1e-9,u+=a[n]}u/=i;for(let o=0;o<i;o++){let s=a[o]-u;l+=n.regularity*s*s;let d=2*n.regularity*s,f=(o+1)%i,p=e[o]/a[o],m=t[o]/a[o];c[2*r[o]]+=-d*p,c[2*r[o]+1]+=-d*m,c[2*r[f]]+=d*p,c[2*r[f]+1]+=d*m}}if(n.intersection>0)for(let e=0;e<i;e++){let t=(e+1)%i,a=o[e]-u,f=s[e]-d,p=o[t]-u,m=a*(s[t]-d)-f*p;if(m<0){l+=n.intersection*m*m;let i=2*n.intersection*m;c[2*r[e]]+=i*(s[t]-d),c[2*r[e]+1]+=i*-(o[t]-u),c[2*r[t]]+=i*-(s[e]-d),c[2*r[t]+1]+=i*(o[e]-u)}}}if(n.separation>0){let t=new Float64Array(i),r=new Float64Array(i),o=new Float64Array(i);for(let n=0;n<i;n++){let i=e.hyperedgeVerts[n],s=i.length;if(s===0)continue;let c=0,l=0;for(let e of i)c+=a[2*e],l+=a[2*e+1];t[n]=c/s,r[n]=l/s;let u=e.originalCardinality[n],d=Math.sqrt(u>=3?2*e.targetArea[n]/(u*Math.sin(2*Math.PI/u)):e.targetArea[n]/Math.PI);if(e.phase===`separation`){let e=0;for(let t=0;t<i.length;t++){let n=i[t];for(let r=t+1;r<i.length;r++){let t=i[r],o=a[2*n]-a[2*t],s=a[2*n+1]-a[2*t+1],c=o*o+s*s;c>e&&(e=c)}}let t=Math.sqrt(e)*.5;o[n]=Math.max(t,d)}else o[n]=d}for(let a=0;a<i;a++)for(let s=a+1;s<i;s++){let i=e.hyperedgeVerts[a],d=e.hyperedgeVerts[s];if(u(i,d))continue;let f=t[s]-t[a],p=r[s]-r[a],m=Math.sqrt(f*f+p*p)||1e-9,h=o[a]+o[s]+e.bufferDistance-m;if(h>0){l+=n.separation*h*h;let e=-2*n.separation*h/m,t=e*-f,r=e*-p,a=e*f,o=e*p,s=i.length,u=d.length;for(let e of i)c[2*e]+=t/s,c[2*e+1]+=r/s;for(let e of d)c[2*e]+=a/u,c[2*e+1]+=o/u}}}return{energy:l,grad:c}}function u(e,t){let n=new Set(e);for(let e of t)if(n.has(e))return!0;return!1}function d(e,t,n={}){let r=n.m??8,i=n.maxIter??200,a=n.tol??1e-5,o=n.c1??1e-4,s=n.alphaInit??1,c=n.alphaShrink??.5,l=n.maxLineSearch??25,u=t.length,d=new Float64Array(t),{energy:g,grad:_}=e(d);h(_,n.mask);let v=[],y=[],b=[];for(let t=0;t<i;t++){let i=p(_);if(n.onIter&&n.onIter(t,g,i),i<a)return{x:d,energy:g,iterations:t,converged:!0};let x=new Float64Array(_),S=Array(v.length);for(let e=v.length-1;e>=0;e--){let t=b[e]*f(v[e],x);S[e]=t,m(-t,y[e],x)}let C=1;if(v.length>0){let e=v[v.length-1],t=y[y.length-1];C=f(e,t)/(f(t,t)||1e-12)}let w=new Float64Array(x.length);for(let e=0;e<x.length;e++)w[e]=C*x[e];for(let e=0;e<v.length;e++){let t=b[e]*f(y[e],w);m(S[e]-t,v[e],w)}let T=new Float64Array(w.length);for(let e=0;e<w.length;e++)T[e]=-w[e];h(T,n.mask);let E=f(_,T);if(E>=0){v.length=0,y.length=0,b.length=0;for(let e=0;e<T.length;e++)T[e]=-_[e];h(T,n.mask)}let D=s,O=new Float64Array(u),k,A=_,j=!1;for(let t=0;t<l;t++){for(let e=0;e<u;e++)O[e]=d[e]+D*T[e];let t=e(O);if(k=t.energy,A=t.grad,k<=g+o*D*E){j=!0;break}D*=c}if(!j)return{x:d,energy:g,iterations:t,converged:!1};let M=new Float64Array(u),N=new Float64Array(u);for(let e=0;e<u;e++)M[e]=O[e]-d[e],N[e]=A[e]-_[e];let P=f(M,N);P>1e-12&&(v.push(M),y.push(N),b.push(1/P),v.length>r&&(v.shift(),y.shift(),b.shift()));for(let e=0;e<u;e++)d[e]=O[e];g=k,_=A,h(_,n.mask)}return{x:d,energy:g,iterations:i,converged:!1}}function f(e,t){let n=0;for(let r=0;r<e.length;r++)n+=e[r]*t[r];return n}function p(e){return Math.sqrt(f(e,e))}function m(e,t,n){for(let r=0;r<t.length;r++)n[r]+=e*t[r]}function h(e,t){if(t)for(let n=0;n<e.length;n++)t[n]||(e[n]=0)}function g(e,t,n={}){let r=n.lr??.01,i=n.beta1??.9,a=n.beta2??.999,o=n.eps??1e-8,s=n.maxIter??1e3,c=n.tol??1e-5,l=t.length,u=new Float64Array(t),d=new Float64Array(l),f=new Float64Array(l),p=0;for(let t=1;t<=s;t++){let s=e(u);p=s.energy;let m=s.grad;if(n.mask)for(let e=0;e<l;e++)n.mask[e]||(m[e]=0);let h=0;for(let e=0;e<l;e++)h+=m[e]*m[e];if(h=Math.sqrt(h),n.onIter&&n.onIter(t,p,h),h<c)return{x:u,energy:p,iterations:t,converged:!0};let g=1-i**+t,_=1-a**+t;for(let e=0;e<l;e++){d[e]=i*d[e]+(1-i)*m[e],f[e]=a*f[e]+(1-a)*m[e]*m[e];let t=d[e]/g,n=f[e]/_;u[e]-=r*t/(Math.sqrt(n)+o)}}return{x:u,energy:p,iterations:s,converged:!1}}const _={regularity:1,area:1,separation:.5,intersection:2,coordination:1},v={regularity:0,area:0,separation:1,intersection:0,coordination:1};function y(e){let{H:t,options:n}=e,r={..._,...n.weights??{}},a=n.targetAreaPerCardinality??(e=>80*Math.max(1,e)),o=n.bufferDistance??10,s=x(t,a,o,e.originalCardinality),c=new Float64Array(2*(s.vCount+s.eCount)),u=2*s.vCount,f=Array.from(t.vertexIds());for(let t=0;t<f.length;t++){let n=f[t],r=s.vIndex.get(n),i=e.initialPositions?.get(n);if(i)c[2*r]=i.x,c[2*r+1]=i.y;else{let e=t/f.length*2*Math.PI;c[2*r]=Math.cos(e)*200,c[2*r+1]=Math.sin(e)*200}}for(let n of t.hyperedges()){let t=s.eIndex.get(n.id),r=e.initialDualPositions?.get(n.id);if(r)c[u+2*t]=r.x,c[u+2*t+1]=r.y;else{let e=0,n=0,r=s.hyperedgeVerts[t];for(let t of r)e+=c[2*t],n+=c[2*t+1];let i=r.length||1;c[u+2*t]=e/i,c[u+2*t+1]=n/i}}let p=n.solver??`lbfgs`;if(i(`hyper`)){let e=b(t,s,c,r,o,n,f,p);if(e)return e}let m=0,h=0,y=(e,t)=>{n.onProgress?.({scale:0,phase:`separation`,iter:e,energy:t})};s.phase=`separation`;let T=e=>(S(s,e),l(s,e,v)),E=p===`lbfgs`?d(T,c,{maxIter:n.separationIters??200,onIter:y}):g(T,c,{maxIter:n.separationIters??200,onIter:y});c.set(E.x),m+=E.iterations;let D=(e,t)=>{n.onProgress?.({scale:0,phase:`regularity`,iter:e,energy:t})};s.phase=`regularity`;let O=e=>(S(s,e),l(s,e,r)),k=p===`lbfgs`?d(O,c,{maxIter:n.regularityIters??300,onIter:D}):g(O,c,{maxIter:n.regularityIters??300,onIter:D});return c.set(k.x),m+=k.iterations,h=k.energy,{vertexPositions:C(c,s,t),dualPositions:w(c,s,t),energy:h,iterations:m,state:c,model:s}}function b(e,t,n,r,i,a,s,c){let l=o();if(!l||typeof l.HyperStruct!=`function`)return null;let u=Array.from(e.hyperedgeIds()),d=new Map,f=0n,p=e=>{let t=d.get(e);return t===void 0&&(t=f++,d.set(e,t)),t},m=new l.HyperStruct;for(let e of s)m.add_vertex(p(e));for(let t of u){let n=e.hyperedgeVertices(t),r=new BigInt64Array(n.length);for(let e=0;e<n.length;e++)r[e]=p(n[e]);m.add_hyperedge(p(t),r)}let h=new Float64Array(u.length);for(let e=0;e<u.length;e++){let n=t.originalCardinality[e],r=t.targetArea[e];h[e]=Math.sqrt(n>=3?2*r/(n*Math.sin(2*Math.PI/n)):r/Math.PI)}let g=n.slice(0,2*t.vCount),_=n.slice(2*t.vCount),v=a.separationIters??200,y=a.regularityIters??300,b=a.onProgress,x=b?(e,t,n)=>b({scale:0,phase:e===0?`separation`:`regularity`,iter:t,energy:n}):void 0,S=m.layout_optimize(r.regularity,r.area,r.separation,r.intersection,r.coordination,i,v,y,g,_,Float64Array.from(t.targetArea),h,+(c===`adam`),x),C=2*(t.vCount+t.eCount),w=S.slice(0,C),T=S[C],E=S[C+1],D=2*t.vCount,O=new Map;for(let e=0;e<s.length;e++)O.set(s[e],{x:w[2*e],y:w[2*e+1]});let k=new Map;for(let e=0;e<u.length;e++)k.set(u[e],{x:w[D+2*e],y:w[D+2*e+1]});return{vertexPositions:O,dualPositions:k,energy:T,iterations:E,state:w,model:t}}function x(e,t,n,r){let i=Array.from(e.vertexIds()),a=Array.from(e.hyperedgeIds()),o=new Map,s=new Map;for(let e=0;e<i.length;e++)o.set(i[e],e);for(let e=0;e<a.length;e++)s.set(a[e],e);let c=a.map(t=>e.hyperedgeVertices(t).map(e=>o.get(e)).filter(e=>e!==void 0)),l=c.map(e=>e.length),u=a.map((e,t)=>r?.get(e)??l[t]),d=u.map(e=>t(e)),f=i.map(()=>[]);for(let e=0;e<a.length;e++)for(let t of c[e])f[t].push(e);return{vIndex:o,eIndex:s,vCount:i.length,eCount:a.length,hyperedgeVerts:c,cardinality:l,originalCardinality:u,targetArea:d,vertexInHyperedges:f,bufferDistance:n,phase:`regularity`}}function S(e,t){for(let n=0;n<e.eCount;n++){let r=e.hyperedgeVerts[n];if(r.length<3)continue;let i=0,a=0;for(let e of r)i+=t[2*e],a+=t[2*e+1];i/=r.length,a/=r.length;let o=r.map(e=>({vi:e,a:Math.atan2(t[2*e+1]-a,t[2*e]-i)})).sort((e,t)=>e.a-t.a).map(e=>e.vi);for(let e=0;e<r.length;e++)r[e]=o[e]}}function C(e,t,n){let r=new Map;for(let i of n.vertices()){let n=t.vIndex.get(i.id);r.set(i.id,{x:e[2*n],y:e[2*n+1]})}return r}function w(e,t,n){let r=2*t.vCount,i=new Map;for(let a of n.hyperedges()){let n=t.eIndex.get(a.id);i.set(a.id,{x:e[r+2*n],y:e[r+2*n+1]})}return i}function T(e,t,n,r,i){let a=e.ranges.degree.max-e.ranges.degree.min,o=e.ranges.cardinality.max-e.ranges.cardinality.min,s=Math.max(a,o)||1,c=Math.min(e.ranges.degree.min,e.ranges.cardinality.min),l=e.ranges.adjacency.min,u=e.ranges.adjacency.max-l||1,d=e.ranges.betweenness.min,f=e.ranges.betweenness.max-d||1,p=(n-c)/s,m=(r-l)/u,h=(i-d)/f;return t.alpha*p+t.beta*m-t.gamma*h}var E=class{kind=`vertexRemoval`;constructor(e){this.vid=e}isLegal(e){if(!e.hasVertex(this.vid))return!1;let t=e.incidentHyperedges(this.vid);for(let n=0;n<t.length;n++)for(let r=n+1;r<t.length;r++){let i=t[n],a=t[r];if(e.sharedVertices(i,a).filter(e=>e!==this.vid).length===0)return!1}return!!e.isConnectedAfterRemoval({vertex:this.vid})}apply(e){let t=e.getVertex(this.vid);if(!t)throw Error(`Vertex ${this.vid} not found`);let n=this.footprint(e),r=e.incidentHyperedges(this.vid),i={};for(let t of r)i[String(t)]=e.hyperedgeVertices(t);let a={vertex:{...t},incident:r,incidentLists:i};return e.removeVertex(this.vid),{kind:this.kind,vertices:[this.vid],hyperedges:[],footprintVertices:n.vertices,footprintHyperedges:n.hyperedges,snapshot:a}}invert(e,t){let n=t.snapshot;e.addVertex(n.vertex);for(let t of n.incident){let r=e.getHyperedge(t);if(!r)continue;let i=n.incidentLists?.[String(t)];e.setHyperedgeVertices(t,i??[...r.vertices,this.vid])}}footprint(e){let t=e.incidentHyperedges(this.vid),n=new Set([this.vid]);for(let r of t){let t=e.getHyperedge(r);if(t)for(let e of t.vertices)n.add(e)}return{vertices:Array.from(n),hyperedges:t}}priority(e,t,n){let r=this.footprint(e),i=0;for(let e of r.vertices)i=Math.max(i,t.degree.get(e)??0);for(let e of r.hyperedges)i=Math.max(i,t.cardinality.get(e)??0);let a=t.adjacencyFactor.get(this.vid)??0,o=t.betweenness.get(this.vid)??0;return T(t,n,i,a,o)}},D=class{kind=`hyperedgeRemoval`;constructor(e){this.eid=e}isLegal(e){if(!e.hasHyperedge(this.eid))return!1;let t=e.hyperedgeVertices(this.eid);for(let n=0;n<t.length;n++)for(let r=n+1;r<t.length;r++){let i=t[n],a=t[r];if(e.sharedHyperedges(i,a).filter(e=>e!==this.eid).length===0)return!1}return!!e.isConnectedAfterRemoval({hyperedge:this.eid})}apply(e){let t=e.getHyperedge(this.eid);if(!t)throw Error(`Hyperedge ${this.eid} not found`);let n=this.footprint(e),r={hyperedge:{...t,vertices:t.vertices.slice()}};return e.removeHyperedge(this.eid),{kind:this.kind,vertices:[],hyperedges:[this.eid],footprintVertices:n.vertices,footprintHyperedges:n.hyperedges,snapshot:r}}invert(e,t){e.addHyperedge(t.snapshot.hyperedge)}footprint(e){let t=e.hyperedgeVertices(this.eid),n=new Set([this.eid]);for(let r of t)for(let t of e.incidentHyperedges(r))n.add(t);return{vertices:t,hyperedges:Array.from(n)}}priority(e,t,n){let r=this.footprint(e),i=0;for(let e of r.vertices)i=Math.max(i,t.degree.get(e)??0);for(let e of r.hyperedges)i=Math.max(i,t.cardinality.get(e)??0);let a=t.adjacencyFactor.get(this.eid)??0,o=t.betweenness.get(this.eid)??0;return T(t,n,i,a,o)}},O=class{kind=`vertexMerger`;constructor(e,t){this.retained=e,this.absorbed=t}isLegal(e){return!e.hasVertex(this.retained)||!e.hasVertex(this.absorbed)||this.retained===this.absorbed?!1:e.sharedHyperedges(this.retained,this.absorbed).length>=2}apply(e){if(!e.hasVertex(this.retained)||!e.hasVertex(this.absorbed))throw Error(`Merger operands missing`);let t=this.footprint(e),n={...e.getVertex(this.absorbed)},r=e.incidentHyperedges(this.absorbed),i=new Set(e.incidentHyperedges(this.retained)),a={},o=new Set([...r,...i]);for(let t of o)a[String(t)]=e.hyperedgeVertices(t);for(let t of r){let n=e.getHyperedge(t);n&&(i.has(t)?e.setHyperedgeVertices(t,n.vertices.filter(e=>e!==this.absorbed)):e.setHyperedgeVertices(t,n.vertices.map(e=>e===this.absorbed?this.retained:e)))}return e.removeVertex(this.absorbed),{kind:this.kind,vertices:[this.retained,this.absorbed],hyperedges:[],footprintVertices:t.vertices,footprintHyperedges:t.hyperedges,snapshot:{absorbedVertex:n,incidentAbsorbed:r,incidentLists:a}}}invert(e,t){let n=t.snapshot;e.addVertex(n.absorbedVertex);for(let[t,r]of Object.entries(n.incidentLists??{}))e.hasHyperedge(t)&&e.setHyperedgeVertices(t,r)}footprint(e){let t=new Set([this.retained,this.absorbed]),n=new Set;for(let t of e.incidentHyperedges(this.retained))n.add(t);for(let t of e.incidentHyperedges(this.absorbed))n.add(t);for(let r of n){let n=e.getHyperedge(r);if(n)for(let e of n.vertices)t.add(e)}return{vertices:Array.from(t),hyperedges:Array.from(n)}}priority(e,t,n){let r=this.footprint(e),i=0;for(let e of r.vertices)i=Math.max(i,t.degree.get(e)??0);for(let e of r.hyperedges)i=Math.max(i,t.cardinality.get(e)??0);let a=t.adjacencyFactor.get(this.retained)??0,o=t.adjacencyFactor.get(this.absorbed)??0,s=t.betweenness.get(this.retained)??0,c=t.betweenness.get(this.absorbed)??0;return T(t,n,i,(a+o)/2,(s+c)/2)}},k=class{kind=`hyperedgeMerger`;constructor(e,t){this.retained=e,this.absorbed=t}isLegal(e){return!e.hasHyperedge(this.retained)||!e.hasHyperedge(this.absorbed)||this.retained===this.absorbed?!1:e.sharedVertices(this.retained,this.absorbed).length>=2}apply(e){let t=this.footprint(e),n={...e.getHyperedge(this.absorbed),vertices:e.hyperedgeVertices(this.absorbed)},r=new Set(e.hyperedgeVertices(this.retained)),i=[...r];for(let e of n.vertices)r.has(e)||i.push(e);return e.setHyperedgeVertices(this.retained,i),e.removeHyperedge(this.absorbed),{kind:this.kind,vertices:[],hyperedges:[this.retained,this.absorbed],footprintVertices:t.vertices,footprintHyperedges:t.hyperedges,snapshot:{absorbedHE:n,retainedOriginalVerts:Array.from(r)}}}invert(e,t){let n=t.snapshot;e.setHyperedgeVertices(this.retained,n.retainedOriginalVerts),e.addHyperedge(n.absorbedHE)}footprint(e){let t=new Set;for(let n of e.hyperedgeVertices(this.retained))t.add(n);for(let n of e.hyperedgeVertices(this.absorbed))t.add(n);let n=new Set([this.retained,this.absorbed]);for(let r of t)for(let t of e.incidentHyperedges(r))n.add(t);return{vertices:Array.from(t),hyperedges:Array.from(n)}}priority(e,t,n){let r=this.footprint(e),i=0;for(let e of r.vertices)i=Math.max(i,t.degree.get(e)??0);for(let e of r.hyperedges)i=Math.max(i,t.cardinality.get(e)??0);let a=t.adjacencyFactor.get(this.retained)??0,o=t.adjacencyFactor.get(this.absorbed)??0,s=t.betweenness.get(this.retained)??0,c=t.betweenness.get(this.absorbed)??0;return T(t,n,i,(a+o)/2,(s+c)/2)}};function A(e){switch(e.kind){case`vertexRemoval`:return new E(e.vertices[0]);case`hyperedgeRemoval`:return new D(e.hyperedges[0]);case`vertexMerger`:return new O(e.vertices[0],e.vertices[1]);case`hyperedgeMerger`:return new k(e.hyperedges[0],e.hyperedges[1])}}const j={regularity:1,area:1,separation:.5,intersection:2,coordination:1};function M(e){let t={...j,...e.options.weights??{}},n=e.options.targetAreaPerCardinality??(e=>80*Math.max(1,e)),r=e.options.bufferDistance??10,i=e.options.solver??`lbfgs`,a=e.options.onProgress,o=new Map(e.vertexPositions),s=new Map(e.dualPositions);for(let c=e.operations.length-1;c>=0;c--){let u=e.operations[c];if(A(u).invert(e.H,u),e.originalCardinality){if(u.kind===`hyperedgeMerger`){let[,t]=u.hyperedges,n=u.snapshot?.absorbedHE?.vertices?.length??0;e.originalCardinality.set(t,n)}else if(u.kind===`hyperedgeRemoval`){let t=u.hyperedges[0],n=e.H.getHyperedge(t);n&&e.originalCardinality.set(t,n.vertices.length)}}N(e.H,u,o,s);let f=new Set(u.footprintVertices),p=new Set(u.footprintHyperedges),m=x(e.H,n,r,e.originalCardinality);m.phase=`regularity`;let h=new Float64Array(2*(m.vCount+m.eCount)),_=2*m.vCount;for(let[e,t]of o){let n=m.vIndex.get(e);n!==void 0&&(h[2*n]=t.x,h[2*n+1]=t.y)}for(let[e,t]of s){let n=m.eIndex.get(e);n!==void 0&&(h[_+2*n]=t.x,h[_+2*n+1]=t.y)}S(m,h);let v=new Uint8Array(h.length);for(let e of f){let t=m.vIndex.get(e);t!==void 0&&(v[2*t]=1,v[2*t+1]=1)}for(let e of p){let t=m.eIndex.get(e);t!==void 0&&(v[_+2*t]=1,v[_+2*t+1]=1)}let y=e=>(S(m,e),l(m,e,t)),b=(e,t)=>{a?.({scale:c,phase:`reversal`,iter:e,energy:t})},C=i===`lbfgs`?d(y,h,{maxIter:80,mask:v,onIter:b}):g(y,h,{maxIter:200,mask:v,onIter:b});h.set(C.x),o=new Map,s=new Map;for(let t of e.H.vertices()){let e=m.vIndex.get(t.id);o.set(t.id,{x:h[2*e],y:h[2*e+1]})}for(let t of e.H.hyperedges()){let e=m.eIndex.get(t.id);s.set(t.id,{x:h[_+2*e],y:h[_+2*e+1]})}}return{vertexPositions:o,dualPositions:s}}function N(e,t,n,r){for(let i of t.vertices){if(n.has(i))continue;let t=e.incidentHyperedges(i);if(t.length===0){n.set(i,{x:0,y:0});continue}let a=0,o=0,s=0;for(let e of t){let t=r.get(e);t&&(a+=t.x,o+=t.y,s++)}s===0?n.set(i,{x:0,y:0}):n.set(i,{x:a/s,y:o/s})}for(let i of t.hyperedges){if(r.has(i))continue;let t=e.hyperedgeVertices(i);if(t.length===0){r.set(i,{x:0,y:0});continue}let a=0,o=0,s=0;for(let e of t){let t=n.get(e);t&&(a+=t.x,o+=t.y,s++)}s===0?r.set(i,{x:0,y:0}):r.set(i,{x:a/s,y:o/s})}}let P=null;function F(){return P||=import(`./nodus_wasm-C0vDfO5K.js`).then(e=>{s(e),r({graph:`wasm`,attr:`wasm`,layout:`wasm`,hyper:`wasm`,geometry:`wasm`,spatial:`wasm`})}).catch(()=>{P=null}),P}const I=new Set;self.addEventListener(`message`,e=>{let t=e.data;if(!(!t||typeof t!=`object`)){if(t.type===`cancel`){I.add(t.id);return}t.type===`run`&&F().then(()=>L(t))}});function L(e){let{id:t}=e,n=Math.max(1,e.progressEvery??25),r=0,i=e=>{r++,(e.iter===0||r%n===0)&&self.postMessage({type:`progress`,id:t,info:e})};try{let n=new c(e.hypergraph),r=new Map(e.originalCardinality),a=e.initialPositions?new Map(e.initialPositions):void 0,o=e.initialDualPositions?new Map(e.initialDualPositions):void 0,s=y({H:n,options:{...e.options,onProgress:i},initialPositions:a,initialDualPositions:o,originalCardinality:r});if(I.has(t)){I.delete(t),self.postMessage({type:`error`,id:t,error:`cancelled`});return}let l=s.vertexPositions,u=s.dualPositions;if(e.operations.length>0){let t=M({H:n,operations:e.operations,vertexPositions:l,dualPositions:u,originalCardinality:r,options:{...e.options,onProgress:i}});l=t.vertexPositions,u=t.dualPositions}if(I.has(t)){I.delete(t),self.postMessage({type:`error`,id:t,error:`cancelled`});return}self.postMessage({type:`done`,id:t,finalHypergraph:n.toData(),vertexPositions:Array.from(l.entries()),dualPositions:Array.from(u.entries()),energy:s.energy})}catch(e){self.postMessage({type:`error`,id:t,error:e?.message??String(e)})}}