@kortexya/nodus 0.1.6 → 0.2.1
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/assets/{hypergraphWorker-D-ulsXRM.js → hypergraphWorker-Dk7KGeFt.js} +1 -1
- package/assets/{layoutWorker-C9xWGcvY.js → layoutWorker-DT7s5Cw9.js} +1 -1
- package/assets/nodus_wasm-CLMeJcEx.js +1 -0
- package/nodus.src.bundle.js +2597 -2521
- package/nodus_render_wasm-RgdBR-U9.js +2829 -0
- package/nodus_wasm-CQOpiyVw.js +2982 -0
- package/package.json +1 -1
- package/types/index.d.ts +1 -0
- package/types/renderers/WasmGraphRenderer.d.ts +5 -0
- package/assets/nodus_wasm-DxYJZXfN.js +0 -1
- package/nodus_render_wasm-C4PGMrSp.js +0 -2617
- package/nodus_wasm-PO2Iq59v.js +0 -2883
|
@@ -1 +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)}}}let i=null;function a(){return i}function o(e){i=e}var s=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=a();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)}detectForbidden(){let e=this._hs().detect_forbidden(),t=new Map;for(let[e,n]of this._intern)t.set(n,e);let n=[`3a2`,`2a3`,`strangledV`,`strangledE`],r=[],i=0;for(;i<e.length;){let a=n[Number(e[i++])],o=Number(e[i++]),s=Number(e[i++]),c=[];for(let n=0;n<o;n++)c.push(t.get(e[i++]));let l=[];for(let n=0;n<s;n++)l.push(t.get(e[i++]));r.push({kind:a,vertices:c,hyperedges:l})}return r}};const c={regularity:1,area:1,separation:.5,intersection:2,coordination:1};function l(e){let{H:t,options:n}=e,r={...c,...n.weights??{}},i=n.targetAreaPerCardinality??(e=>80*Math.max(1,e)),a=n.bufferDistance??10,o=d(t,i,a,e.originalCardinality),s=new Float64Array(2*(o.vCount+o.eCount)),l=2*o.vCount,f=Array.from(t.vertexIds());for(let t=0;t<f.length;t++){let n=f[t],r=o.vIndex.get(n),i=e.initialPositions?.get(n);if(i)s[2*r]=i.x,s[2*r+1]=i.y;else{let e=t/f.length*2*Math.PI;s[2*r]=Math.cos(e)*200,s[2*r+1]=Math.sin(e)*200}}for(let n of t.hyperedges()){let t=o.eIndex.get(n.id),r=e.initialDualPositions?.get(n.id);if(r)s[l+2*t]=r.x,s[l+2*t+1]=r.y;else{let e=0,n=0,r=o.hyperedgeVerts[t];for(let t of r)e+=s[2*t],n+=s[2*t+1];let i=r.length||1;s[l+2*t]=e/i,s[l+2*t+1]=n/i}}let p=u(t,o,s,r,a,n,f,n.solver??`lbfgs`);if(!p)throw Error(`Hypergraph layout requires the wasm backend (HyperStruct missing).`);return p}function u(e,t,n,r,i,o,s,c){let l=a();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=o.separationIters??200,y=o.regularityIters??300,b=o.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 d(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 f(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 p=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 f(t,n,i,a,o)}},m=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 f(t,n,i,a,o)}},h=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 f(t,n,i,(a+o)/2,(s+c)/2)}},g=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 f(t,n,i,(a+o)/2,(s+c)/2)}};function _(e){switch(e.kind){case`vertexRemoval`:return new p(e.vertices[0]);case`hyperedgeRemoval`:return new m(e.hyperedges[0]);case`vertexMerger`:return new h(e.vertices[0],e.vertices[1]);case`hyperedgeMerger`:return new g(e.hyperedges[0],e.hyperedges[1])}}const v={regularity:1,area:1,separation:.5,intersection:2,coordination:1};function y(e){let t={...v,...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 l=e.operations[c];if(_(l).invert(e.H,l),e.originalCardinality){if(l.kind===`hyperedgeMerger`){let[,t]=l.hyperedges,n=l.snapshot?.absorbedHE?.vertices?.length??0;e.originalCardinality.set(t,n)}else if(l.kind===`hyperedgeRemoval`){let t=l.hyperedges[0],n=e.H.getHyperedge(t);n&&e.originalCardinality.set(t,n.vertices.length)}}x(e.H,l,o,s);let u=new Set(l.footprintVertices),f=new Set(l.footprintHyperedges),p=d(e.H,n,r,e.originalCardinality),m=new Float64Array(2*(p.vCount+p.eCount)),h=2*p.vCount;for(let[e,t]of o){let n=p.vIndex.get(e);n!==void 0&&(m[2*n]=t.x,m[2*n+1]=t.y)}for(let[e,t]of s){let n=p.eIndex.get(e);n!==void 0&&(m[h+2*n]=t.x,m[h+2*n+1]=t.y)}let g=new Uint8Array(m.length);for(let e of u){let t=p.vIndex.get(e);t!==void 0&&(g[2*t]=1,g[2*t+1]=1)}for(let e of f){let t=p.eIndex.get(e);t!==void 0&&(g[h+2*t]=1,g[h+2*t+1]=1)}b(p,m,g,t,i,c,a),o=new Map,s=new Map;for(let t of e.H.vertices()){let e=p.vIndex.get(t.id);o.set(t.id,{x:m[2*e],y:m[2*e+1]})}for(let t of e.H.hyperedges()){let e=p.eIndex.get(t.id);s.set(t.id,{x:m[h+2*e],y:m[h+2*e+1]})}}return{vertexPositions:o,dualPositions:s}}function b(e,t,n,r,i,o,s){let c=a();if(!c||typeof c.hyper_reverse_step!=`function`)throw Error(`Hypergraph reversal requires the wasm backend (hyper_reverse_step missing).`);let l=e.vCount,u=e.eCount,d=new Uint32Array(u+1),f=0;for(let t=0;t<u;t++)d[t]=f,f+=e.hyperedgeVerts[t].length;d[u]=f;let p=new Uint32Array(f);{let t=0;for(let n of e.hyperedgeVerts)for(let e of n)p[t++]=e}let m=new Uint32Array(l+1),h=0;for(let t=0;t<l;t++)m[t]=h,h+=e.vertexInHyperedges[t].length;m[l]=h;let g=new Uint32Array(h);{let t=0;for(let n of e.vertexInHyperedges)for(let e of n)g[t++]=e}let _=new Float64Array(u);for(let t=0;t<u;t++){let n=e.originalCardinality[t],r=e.targetArea[t];_[t]=Math.sqrt(n>=3?2*r/(n*Math.sin(2*Math.PI/n)):r/Math.PI)}let v=s?(e,t)=>s({scale:o,phase:`reversal`,iter:e,energy:t}):void 0,y=i===`lbfgs`?80:200,b=c.hyper_reverse_step(l,u,d,p,m,g,Float64Array.from(e.targetArea),_,e.bufferDistance,r.regularity,r.area,r.separation,r.intersection,r.coordination,t,n,y,+(i===`adam`),v);t.set(b.subarray(0,t.length))}function x(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 S=null;function C(){return S||=import(`./nodus_wasm-DxYJZXfN.js`).then(e=>{o(e),r({graph:`wasm`,attr:`wasm`,layout:`wasm`,hyper:`wasm`,geometry:`wasm`,spatial:`wasm`})}).catch(()=>{S=null}),S}const w=new Set;self.addEventListener(`message`,e=>{let t=e.data;if(!(!t||typeof t!=`object`)){if(t.type===`cancel`){w.add(t.id);return}t.type===`run`&&C().then(()=>T(t))}});function T(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 s(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,c=l({H:n,options:{...e.options,onProgress:i},initialPositions:a,initialDualPositions:o,originalCardinality:r});if(w.has(t)){w.delete(t),self.postMessage({type:`error`,id:t,error:`cancelled`});return}let u=c.vertexPositions,d=c.dualPositions;if(e.operations.length>0){let t=y({H:n,operations:e.operations,vertexPositions:u,dualPositions:d,originalCardinality:r,options:{...e.options,onProgress:i}});u=t.vertexPositions,d=t.dualPositions}if(w.has(t)){w.delete(t),self.postMessage({type:`error`,id:t,error:`cancelled`});return}self.postMessage({type:`done`,id:t,finalHypergraph:n.toData(),vertexPositions:Array.from(u.entries()),dualPositions:Array.from(d.entries()),energy:c.energy})}catch(e){self.postMessage({type:`error`,id:t,error:e?.message??String(e)})}}
|
|
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)}}}let i=null;function a(){return i}function o(e){i=e}var s=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=a();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)}detectForbidden(){let e=this._hs().detect_forbidden(),t=new Map;for(let[e,n]of this._intern)t.set(n,e);let n=[`3a2`,`2a3`,`strangledV`,`strangledE`],r=[],i=0;for(;i<e.length;){let a=n[Number(e[i++])],o=Number(e[i++]),s=Number(e[i++]),c=[];for(let n=0;n<o;n++)c.push(t.get(e[i++]));let l=[];for(let n=0;n<s;n++)l.push(t.get(e[i++]));r.push({kind:a,vertices:c,hyperedges:l})}return r}};const c={regularity:1,area:1,separation:.5,intersection:2,coordination:1};function l(e){let{H:t,options:n}=e,r={...c,...n.weights??{}},i=n.targetAreaPerCardinality??(e=>80*Math.max(1,e)),a=n.bufferDistance??10,o=d(t,i,a,e.originalCardinality),s=new Float64Array(2*(o.vCount+o.eCount)),l=2*o.vCount,f=Array.from(t.vertexIds());for(let t=0;t<f.length;t++){let n=f[t],r=o.vIndex.get(n),i=e.initialPositions?.get(n);if(i)s[2*r]=i.x,s[2*r+1]=i.y;else{let e=t/f.length*2*Math.PI;s[2*r]=Math.cos(e)*200,s[2*r+1]=Math.sin(e)*200}}for(let n of t.hyperedges()){let t=o.eIndex.get(n.id),r=e.initialDualPositions?.get(n.id);if(r)s[l+2*t]=r.x,s[l+2*t+1]=r.y;else{let e=0,n=0,r=o.hyperedgeVerts[t];for(let t of r)e+=s[2*t],n+=s[2*t+1];let i=r.length||1;s[l+2*t]=e/i,s[l+2*t+1]=n/i}}let p=u(t,o,s,r,a,n,f,n.solver??`lbfgs`);if(!p)throw Error(`Hypergraph layout requires the wasm backend (HyperStruct missing).`);return p}function u(e,t,n,r,i,o,s,c){let l=a();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=o.separationIters??200,y=o.regularityIters??300,b=o.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 d(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 f(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 p=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 f(t,n,i,a,o)}},m=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 f(t,n,i,a,o)}},h=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 f(t,n,i,(a+o)/2,(s+c)/2)}},g=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 f(t,n,i,(a+o)/2,(s+c)/2)}};function _(e){switch(e.kind){case`vertexRemoval`:return new p(e.vertices[0]);case`hyperedgeRemoval`:return new m(e.hyperedges[0]);case`vertexMerger`:return new h(e.vertices[0],e.vertices[1]);case`hyperedgeMerger`:return new g(e.hyperedges[0],e.hyperedges[1])}}const v={regularity:1,area:1,separation:.5,intersection:2,coordination:1};function y(e){let t={...v,...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 l=e.operations[c];if(_(l).invert(e.H,l),e.originalCardinality){if(l.kind===`hyperedgeMerger`){let[,t]=l.hyperedges,n=l.snapshot?.absorbedHE?.vertices?.length??0;e.originalCardinality.set(t,n)}else if(l.kind===`hyperedgeRemoval`){let t=l.hyperedges[0],n=e.H.getHyperedge(t);n&&e.originalCardinality.set(t,n.vertices.length)}}x(e.H,l,o,s);let u=new Set(l.footprintVertices),f=new Set(l.footprintHyperedges),p=d(e.H,n,r,e.originalCardinality),m=new Float64Array(2*(p.vCount+p.eCount)),h=2*p.vCount;for(let[e,t]of o){let n=p.vIndex.get(e);n!==void 0&&(m[2*n]=t.x,m[2*n+1]=t.y)}for(let[e,t]of s){let n=p.eIndex.get(e);n!==void 0&&(m[h+2*n]=t.x,m[h+2*n+1]=t.y)}let g=new Uint8Array(m.length);for(let e of u){let t=p.vIndex.get(e);t!==void 0&&(g[2*t]=1,g[2*t+1]=1)}for(let e of f){let t=p.eIndex.get(e);t!==void 0&&(g[h+2*t]=1,g[h+2*t+1]=1)}b(p,m,g,t,i,c,a),o=new Map,s=new Map;for(let t of e.H.vertices()){let e=p.vIndex.get(t.id);o.set(t.id,{x:m[2*e],y:m[2*e+1]})}for(let t of e.H.hyperedges()){let e=p.eIndex.get(t.id);s.set(t.id,{x:m[h+2*e],y:m[h+2*e+1]})}}return{vertexPositions:o,dualPositions:s}}function b(e,t,n,r,i,o,s){let c=a();if(!c||typeof c.hyper_reverse_step!=`function`)throw Error(`Hypergraph reversal requires the wasm backend (hyper_reverse_step missing).`);let l=e.vCount,u=e.eCount,d=new Uint32Array(u+1),f=0;for(let t=0;t<u;t++)d[t]=f,f+=e.hyperedgeVerts[t].length;d[u]=f;let p=new Uint32Array(f);{let t=0;for(let n of e.hyperedgeVerts)for(let e of n)p[t++]=e}let m=new Uint32Array(l+1),h=0;for(let t=0;t<l;t++)m[t]=h,h+=e.vertexInHyperedges[t].length;m[l]=h;let g=new Uint32Array(h);{let t=0;for(let n of e.vertexInHyperedges)for(let e of n)g[t++]=e}let _=new Float64Array(u);for(let t=0;t<u;t++){let n=e.originalCardinality[t],r=e.targetArea[t];_[t]=Math.sqrt(n>=3?2*r/(n*Math.sin(2*Math.PI/n)):r/Math.PI)}let v=s?(e,t)=>s({scale:o,phase:`reversal`,iter:e,energy:t}):void 0,y=i===`lbfgs`?80:200,b=c.hyper_reverse_step(l,u,d,p,m,g,Float64Array.from(e.targetArea),_,e.bufferDistance,r.regularity,r.area,r.separation,r.intersection,r.coordination,t,n,y,+(i===`adam`),v);t.set(b.subarray(0,t.length))}function x(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 S=null;function C(){return S||=import(`./nodus_wasm-CLMeJcEx.js`).then(e=>{o(e),r({graph:`wasm`,attr:`wasm`,layout:`wasm`,hyper:`wasm`,geometry:`wasm`,spatial:`wasm`})}).catch(()=>{S=null}),S}const w=new Set;self.addEventListener(`message`,e=>{let t=e.data;if(!(!t||typeof t!=`object`)){if(t.type===`cancel`){w.add(t.id);return}t.type===`run`&&C().then(()=>T(t))}});function T(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 s(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,c=l({H:n,options:{...e.options,onProgress:i},initialPositions:a,initialDualPositions:o,originalCardinality:r});if(w.has(t)){w.delete(t),self.postMessage({type:`error`,id:t,error:`cancelled`});return}let u=c.vertexPositions,d=c.dualPositions;if(e.operations.length>0){let t=y({H:n,operations:e.operations,vertexPositions:u,dualPositions:d,originalCardinality:r,options:{...e.options,onProgress:i}});u=t.vertexPositions,d=t.dualPositions}if(w.has(t)){w.delete(t),self.postMessage({type:`error`,id:t,error:`cancelled`});return}self.postMessage({type:`done`,id:t,finalHypergraph:n.toData(),vertexPositions:Array.from(u.entries()),dualPositions:Array.from(d.entries()),energy:c.energy})}catch(e){self.postMessage({type:`error`,id:t,error:e?.message??String(e)})}}
|
|
@@ -282,4 +282,4 @@ void main() {
|
|
|
282
282
|
vec2 posPx = (position + 1.f) * vec2(m_e.zw) * .5f + vec2(m_e.xy);
|
|
283
283
|
gl_Position = vec4(posPx / vec2(m_1e) * 2.f - 1.f, 0.f, 1.f);
|
|
284
284
|
}`,frag:`#version 300 es
|
|
285
|
-
precision highp float;precision highp int;vec2 s(vec2 s,vec2 e){return vec2(s.x*e.x-s.y*e.y,s.x*e.y+s.y*e.x);}vec2 s(vec2 s){return s.y=-s.y,s;}vec2 s(vec2 t[8],vec2 c,vec2 a){vec2 i,o=a-c,e=vec2(1,0);for(int c;c<8;++c)i+=s(t[c],e),e=s(e,o);return i;}vec2 s(vec2 e,vec4 s){return(e-s.xy)/s.zw;}uniform float m_14,m_15,m_16,m_17,m_18,m_19,m_11,m_12,m_13;uniform highp sampler2D m_6;uniform highp usampler2D m_1a,m_1b;uniform highp sampler2D m_1c,m_1d,m_8;uniform highp usampler2D m_0,m_9;uniform highp sampler2D m_1u,m_1v;flat in uvec4 m_25,m_2b,m_2c,m_2d,m_2e,m_21,m_1x,m_1w,m_27;flat in uint m_1y,m_22,m_26;out vec4 outColor;void main(){uvec2 c=uvec2(gl_FragCoord.xy)-m_25.xy;if(m_25.z*c.y+c.x>=m_1y)return;vec3 a=texelFetch(m_1c,ivec2(m_2b.xy+c),0).xyz;vec4 l=texelFetch(m_6,ivec2(m_25.xy+c),0);vec2 i=l.xy,e=l.zw;if(a.z>0.){outColor=vec4(i,e);return;}ivec4 t=ivec4(texelFetch(m_1a,ivec2(m_2d.xy+c),0));vec4 o=texelFetch(m_8,ivec2(m_21.xy),0);float r=float(1u<<m_22-1u);ivec2 u=ivec2(r*s(i,o));vec2 v=(vec2(u)+.5)/r;ivec2 p=u-ivec2(1);for(int s;s<9;++s){ivec2 t=p+ivec2(s%3,s/3);if(t>>m_22-1u!=ivec2(0))continue;uvec2 c=texelFetch(m_9,ivec2(m_1w.xy)+t,0).xy;for(uint s=c.x;s<c.y;s++){uint l=texelFetch(m_0,ivec2(m_1x.xy)+ivec2(s%m_1x.z,s/m_1x.z),0).x;ivec2 o=ivec2(l%m_25.z,l/m_25.z);vec2 t=texelFetch(m_6,ivec2(m_25.xy)+o,0).xy-i;float u=dot(t,t)+1e-4;if(m_18>0.&&m_11<.5){float i=texelFetch(m_1c,ivec2(m_2b.xy)+o,0).y,s=max(a.y+i+m_19,.01);if(u<s*s){float c=sqrt(u);e-=(s-c)*m_18*i/s*t/c;}}float r=texelFetch(m_1c,ivec2(m_2b.xy)+o,0).x;e-=m_11*m_14*r*t/u;}}if(m_22>2u){vec2 t[8];ivec2 c=ivec2(m_27.xy)+u;vec4 a=texelFetch(m_1u,c,0),l=texelFetch(m_1v,c,0);if(t[0]=a.xy,t[1]=a.zw,t[2]=l.xy,t[3]=l.zw,m_26>4u){vec4 s=texelFetch(m_1u,c,0);t[4]=s.xy,t[5]=s.zw;}if(m_26>6u){vec4 s=texelFetch(m_1v,c,0);t[6]=s.xy,t[7]=s.zw;}vec2 r=s(s(t,v,s(i,o))/o.z);e+=m_11*m_14*r;}ivec2 n;for(int c;c<t.z;c++){n=ivec2(texelFetch(m_1b,ivec2(m_2c.xy)+t.xy,0).xy);float o=texelFetch(m_1d,ivec2(m_2e.xy)+t.xy,0).x;vec2 s=texelFetch(m_6,ivec2(m_25.xy)+n,0).xy-i;if(s*=1.-m_17/(length(s)+1e-4),e+=m_11*m_16*o*s/a.x,t.x+=1,t.x>=int(m_2c.z))t.x=0,t.y+=1;}e=m_12*(e-m_11*m_15*i);float x=dot(e,e);if(x>m_13)e*=sqrt(m_13/x);outColor=vec4(i+e,e);}`,outputs:1};function J(e){return[e.x,e.y,e.w,e.h]}function Y(e,t){return new Uint32Array(e.map(t).map(J).flat())}function X(e,t,n,r,i,a=1){let o=e.getAttribLocation(t,n);o!==-1&&(e.enableVertexAttribArray(o),Ae(e,r),e.vertexAttribIPointer(o,i,e.UNSIGNED_INT,0,0),e.vertexAttribDivisor(o,a))}function Z(e,t){let n=e.getAttribLocation(t,`position`);e.enableVertexAttribArray(n),Ae(e,Ce),e.vertexAttribPointer(n,2,e.FLOAT,!1,0,0)}function nt(e,t){let n=R(e,Je.vert,Je.frag),r=t.texture.points(),i=z(e,{size:r.size,data:new Float32Array(r.data?r.data.buffer.slice(0):new ArrayBuffer(0)),type:e.FLOAT,format:e.RGBA,internalFormat:e.RGBA32F}),a=z(e,{size:r.size,data:new Float32Array(r.data?r.data.buffer.slice(0):new ArrayBuffer(0)),type:e.FLOAT,format:e.RGBA,internalFormat:e.RGBA32F}),o=V(i,a),s=B(e,a.handle),c=B(e,i.handle),l=V(s,c),u=W(e,n,{m_1j:r.size,m_8:i.handle,m_1k:0}),d=t.items.map(({N:e})=>Fe(e)),f=d.reduce((e,t)=>Math.max(e,t),0),p=e.createVertexArray();if(!p)throw Error(`Cannot create VAO`);e.bindVertexArray(p),Z(e,n),X(e,n,`m_1l`,Y(t.items,e=>e.pointsSlot),4),X(e,n,`m_4`,new Uint32Array(t.items.map(e=>e.N)),1),X(e,n,`m_1m`,new Uint32Array(d),1);let m=i;return{step:()=>{e.viewport(0,0,r.size[0],r.size[1]),e.useProgram(n),e.bindVertexArray(p);for(let n=0;n<f;n++){e.bindFramebuffer(e.FRAMEBUFFER,l()[0]);let[r,i]=o();m=i,G(e,u,{m_m:t.texture.points().handle,m_1j:t.texture.points().size,m_8:r.handle,m_1k:n}),e.drawArraysInstanced(e.TRIANGLES,0,6,t.items.length)}},outputs:{items:t.items.map(e=>({spatialBoundariesSlot:{x:e.pointsSlot.x,y:e.pointsSlot.y,w:1,h:1}})),texture:{spatialBoundaries:()=>m}},destroy:()=>{e.deleteFramebuffer(c),e.deleteFramebuffer(s),e.deleteTexture(i.handle),e.deleteTexture(a.handle),e.deleteVertexArray(p)}}}function rt(e,t){let n=R(e,Ye.vert,Ye.frag),r=t.items.map(({N:e})=>{let[t,n]=Re(Ie(e));return{x:0,y:0,w:t,h:n}}),i=H(r.slice()),a=new Uint32Array(2*i.w*i.h);r.forEach(e=>{for(let t=0;t<e.w*e.h;t++){let n=2*U(t,i.w,e);a[n]=t,a[n+1]=4294967295}});let o=z(e,{size:[i.w,i.h],data:a,type:e.UNSIGNED_INT,format:e.RG_INTEGER,internalFormat:e.RG32UI}),s=B(e,o.handle),c=W(e,n,{m_m:t.texture.points().handle,m_8:t.texture.spatialBoundaries().handle,m_n:o.size}),l=e.createVertexArray();if(!l)throw Error(`Cannot create VAO`);return e.bindVertexArray(l),Z(e,n),X(e,n,`m_o`,new Uint32Array(r.map(J).flat()),4),X(e,n,`m_p`,Y(t.items,e=>e.particlesPositionsSlot),4),X(e,n,`m_f`,Y(t.items,e=>e.spatialBoundariesSlot),4),X(e,n,`m_4`,new Uint32Array(t.items.map(e=>e.N)),1),X(e,n,`m_g`,new Uint32Array(t.items.map(e=>e.depth)),1),{step:()=>{e.viewport(0,0,o.size[0],o.size[1]),e.useProgram(n),e.bindVertexArray(l),e.bindFramebuffer(e.FRAMEBUFFER,s),G(e,c,{m_m:t.texture.points().handle,m_8:t.texture.spatialBoundaries().handle}),e.drawArraysInstanced(e.TRIANGLES,0,6,r.length)},outputs:{items:t.items.map((e,t)=>({N:e.N,spatialKeysSlot:r[t]})),texture:{spatialKeys:()=>o}},destroy:()=>{e.deleteFramebuffer(s),e.deleteTexture(o.handle),e.deleteVertexArray(l)}}}function it(e,t){let n=R(e,Xe.vert,Xe.frag),r=t.texture.spatialKeys(),i=Ge(e,r.size),a=V(i,r),o=B(e,r.handle),s=B(e,i.handle),c=V(o,s),l=W(e,n,{m_1n:0,m_1o:0,m_1p:r.handle,m_1q:r.size}),u=t.items.map(({N:e})=>Le(e)).reduce((e,t)=>Math.max(e,t),0),d=e.createVertexArray();if(!d)throw Error(`Cannot create VAO`);e.bindVertexArray(d),Z(e,n),X(e,n,`m_1r`,Y(t.items,e=>e.spatialKeysSlot),4),X(e,n,`m_4`,new Uint32Array(t.items.map(e=>e.N)),1);let f=0,p=0,m=r;return{step:(r=ze(u))=>{e.useProgram(n),e.bindVertexArray(d),e.viewport(0,0,i.size[0],i.size[1]);let o=t.texture.spatialKeys();m!==o&&(c(),a(),m=o);for(let n=0;n<r;n++){e.bindFramebuffer(e.FRAMEBUFFER,c()[0]);let[n,r]=a();m=r,G(e,l,{m_1n:f,m_1o:p,m_1p:n.handle}),e.drawArraysInstanced(e.TRIANGLES,0,6,t.items.length),p=(p+1)%(f+1),p===0&&(f=(f+1)%u)}},outputs:{items:t.items,texture:{spatialKeys:()=>m}},destroy:()=>{e.deleteFramebuffer(o),e.deleteFramebuffer(s),e.deleteTexture(i.handle),e.deleteVertexArray(d)}}}function at(e,t){let n=R(e,Ze.vert,Ze.frag),r=e.getUniformLocation(n,`m_1n`),i=e.getUniformLocation(n,`m_1o`),a=e.getUniformLocation(n,`m_1p`),o=e.getUniformLocation(n,`m_1s`),s=e.getUniformLocation(n,`m_1q`),c=t.texture.spatialKeys(),l=Ge(e,c.size),u=Ke(e,c.size),d=Ke(e,c.size),f=V(q(e,c,d),q(e,c,u)),p=V(q(e,l,d),q(e,l,u)),m=t.items.map(({N:e})=>Le(Ie(e))).reduce((e,t)=>Math.max(e,t),0),h=e.createVertexArray();if(!h)throw Error(`Cannot create VAO`);return e.bindVertexArray(h),Z(e,n),X(e,n,`m_1r`,Y(t.items,e=>e.spatialKeysSlot),4),X(e,n,`m_4`,new Uint32Array(t.items.map(e=>e.N)),1),{step:()=>{e.bindVertexArray(h),e.viewport(0,0,c.size[0],c.size[1]),e.useProgram(n),e.uniform2ui(s,c.size[0],c.size[1]),e.uniform1i(a,0),e.uniform1i(o,1);for(let n=0;n<m;n++){e.activeTexture(e.TEXTURE0);let a=n&1?l:c;e.bindTexture(e.TEXTURE_2D,a.handle),e.uniform1ui(r,n);for(let r=0;r<=n;r++){let[a,o]=n&1?f():p();e.bindFramebuffer(e.FRAMEBUFFER,a.handle),e.activeTexture(e.TEXTURE1),e.bindTexture(e.TEXTURE_2D,o.ca1.handle),e.uniform1ui(i,r),n===r?e.drawBuffers([e.COLOR_ATTACHMENT0,e.NONE]):r<2&&e.drawBuffers([e.NONE,e.COLOR_ATTACHMENT1]),e.drawArraysInstanced(e.TRIANGLES,0,6,t.items.length)}}},outputs:{items:t.items,texture:{spatialKeys:()=>m-1&1?c:l}},destroy:()=>{e.deleteTexture(l.handle),e.deleteTexture(u.handle),e.deleteTexture(d.handle)}}}function ot(e,t){let n=R(e,Qe.vert,Qe.frag),r=t.items.map(({depth:e})=>{let t=1<<e-1;return{x:0,y:0,w:t,h:t}}),i=H(r.slice()),a=z(e,{size:[i.w,i.h],data:new Uint32Array(2*i.w*i.h),type:e.UNSIGNED_INT,format:e.RG_INTEGER,internalFormat:e.RG32UI}),o=B(e,a.handle),s=W(e,n,{m_0:t.texture.spatialKeys().handle,m_1:a.size}),c=e.createVertexArray();if(!c)throw Error(`Cannot create VAO`);return e.bindVertexArray(c),Z(e,n),X(e,n,`m_2`,new Uint32Array(r.map(J).flat()),4),X(e,n,`m_3`,Y(t.items,e=>e.spatialKeysSlot),4),X(e,n,`m_4`,new Uint32Array(t.items.map(e=>e.N)),1),{step:()=>{e.viewport(0,0,a.size[0],a.size[1]),e.useProgram(n),e.bindVertexArray(c),e.bindFramebuffer(e.FRAMEBUFFER,o),G(e,s,{m_0:t.texture.spatialKeys().handle}),e.drawArraysInstanced(e.TRIANGLES,0,6,t.items.length)},outputs:{items:t.items.map((e,t)=>({...e,gridCellsSlot:r[t]})),texture:{spatialBoundaries:t.texture.spatialBoundaries,spatialKeys:t.texture.spatialKeys,gridCells:()=>a}},destroy:()=>{e.deleteFramebuffer(o),e.deleteTexture(a.handle),e.deleteVertexArray(c)}}}function st(e,t){let n=R(e,$e.vert,$e.frag),r=Math.max(...t.items.map(e=>e.depth)),i=[];t.items.forEach(({order:e,depth:t})=>{let n={};for(let e=r-1;e>=2;e--)n[e]=e>=t?K():{x:0,y:0,w:1<<e,h:1<<e};i.push({order:e,depth:t,multipolesSlot:n})});let a=[];for(let t=r;t>=2;t--){a[t]=[];let{w:n,h:r}=H(i.map(e=>e.multipolesSlot[t]||K()));for(let i=0;i<4;i++)a[t][i]=z(e,{size:[n,r],data:new Float32Array(4*n*r),type:e.FLOAT,format:e.RGBA,internalFormat:e.RGBA32F})}let o=[];a.forEach((t,n)=>{if(!t)return;let r=e.createFramebuffer();if(!r)throw Error(`Cannot create FBO`);e.bindFramebuffer(e.FRAMEBUFFER,r),t.forEach((t,n)=>{e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0+n,e.TEXTURE_2D,t.handle,0)}),e.drawBuffers([e.COLOR_ATTACHMENT0,e.COLOR_ATTACHMENT1,e.COLOR_ATTACHMENT2,e.COLOR_ATTACHMENT3]),e.checkFramebufferStatus(e.FRAMEBUFFER)!==e.FRAMEBUFFER_COMPLETE&&console.error(`FBO incomplete for level ${n}`),o[n]=r});let s=t.texture.particlesPositions?t.texture.particlesPositions():t.texture.points?.(),c=t.texture.particlesCharges?t.texture.particlesCharges():null,l=W(e,n,{m_5:r-1,m_6:s?.handle??null,m_7:c?.handle??null,m_8:t.texture.spatialBoundaries().handle,m_0:t.texture.spatialKeys().handle,m_9:t.texture.gridCells().handle,m_a:null,m_b:[0,0]}),u=[];for(let a=r-1;a>=2;a--){let r=e.createVertexArray();if(!r)throw Error(`Cannot create VAO`);u[a]=r,e.bindVertexArray(r),Z(e,n),X(e,n,`m_c`,new Uint32Array(i.map(e=>e.multipolesSlot[a]).map(J).flat()),4),X(e,n,`m_d`,new Uint32Array(i.map(e=>a>=e.depth-1?K():e.multipolesSlot[a+1]).map(J).flat()),4),X(e,n,`m_e`,Y(t.items,e=>e.particlesPositionsSlot),4),X(e,n,`m_f`,Y(t.items,e=>e.spatialBoundariesSlot),4),X(e,n,`m_3`,Y(t.items,e=>e.spatialKeysSlot),4),X(e,n,`m_2`,Y(t.items,e=>e.gridCellsSlot),4),X(e,n,`m_g`,new Uint32Array(t.items.map(e=>e.depth)),1),X(e,n,`m_h`,new Uint32Array(i.map(e=>e.order)),1)}return{step:()=>{e.useProgram(n);for(let n=r-1;n>=2;n--){e.bindVertexArray(u[n]);let r=a[n+1]||[],i=a[n][0].size;e.viewport(0,0,i[0],i[1]),e.bindFramebuffer(e.FRAMEBUFFER,o[n]);let s=t.texture.particlesPositions?t.texture.particlesPositions():t.texture.points?.(),c=t.texture.particlesCharges?t.texture.particlesCharges():null;G(e,l,{m_6:s?.handle??null,m_7:c?.handle??null,m_8:t.texture.spatialBoundaries().handle,m_0:t.texture.spatialKeys().handle,m_9:t.texture.gridCells().handle,m_5:n,m_i:r[0]?.handle,m_j:r[1]?.handle,m_k:r[2]?.handle,m_l:r[3]?.handle,m_b:i}),e.drawArraysInstanced(e.TRIANGLES,0,6,t.items.length)}},outputs:{items:i,texture:{multipoles:(e,t)=>a[e]&&a[e][t]}},destroy:()=>{o.forEach(t=>t&&e.deleteFramebuffer(t)),a.forEach(t=>t&&t.forEach(t=>e.deleteTexture(t.handle))),u.forEach(t=>t&&e.deleteVertexArray(t))}}}function ct(e,t){let n=R(e,et.vert,et.frag),r=Math.max(...t.items.map(e=>e.depth)),i=[];t.items.forEach(e=>{let t={};for(let n=r-1;n>=2;n--)t[n]=e.multipolesSlot[n];i.push({...e,localExpansionsSlot:t})});let a=[];for(let n=r-1;n>=1;n--){a[n]=[];let[r,i]=(n===1?{size:[1,1]}:t.texture.multipoles(n,0)||{size:[1,1]}).size;for(let t=0;t<4;t++)a[n][t]=z(e,{size:[r,i],data:new Float32Array(4*r*i),type:e.FLOAT,format:e.RGBA,internalFormat:e.RGBA32F})}let o=[];a.forEach((t,n)=>{if(!t)return;let r=e.createFramebuffer();if(!r)throw Error(`Cannot create FBO`);e.bindFramebuffer(e.FRAMEBUFFER,r),t.forEach((t,n)=>{e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0+n,e.TEXTURE_2D,t.handle,0)}),e.drawBuffers([e.COLOR_ATTACHMENT0,e.COLOR_ATTACHMENT1,e.COLOR_ATTACHMENT2,e.COLOR_ATTACHMENT3]),e.checkFramebufferStatus(e.FRAMEBUFFER)!==e.FRAMEBUFFER_COMPLETE&&console.error(`FBO incomplete for level ${n}`),o[n]=r});let s=W(e,n,{m_5:2,m_q:[0,0]}),c=[];for(let a=r-1;a>=2;a--){let r=e.createVertexArray();if(!r)throw Error(`Cannot create VAO`);c[a]=r,e.bindVertexArray(r),Z(e,n),X(e,n,`m_r`,new Uint32Array(i.map(e=>e.localExpansionsSlot[a]).map(J).flat()),4),X(e,n,`m_s`,new Uint32Array(i.map(e=>a>=3?e.localExpansionsSlot[a-1]:K()).map(J).flat()),4),X(e,n,`m_h`,new Uint32Array(t.items.map(e=>e.order)),1)}return{step:()=>{e.useProgram(n);for(let n=2;n<r;n++){e.bindVertexArray(c[n]);let r=a[n-1]||[],i=a[n];e.viewport(0,0,i[0].size[0],i[0].size[1]),e.bindFramebuffer(e.FRAMEBUFFER,o[n]),G(e,s,{m_5:n,m_t:t.texture.multipoles(n,0)?.handle,m_u:t.texture.multipoles(n,1)?.handle,m_v:t.texture.multipoles(n,2)?.handle,m_w:t.texture.multipoles(n,3)?.handle,m_x:r[0]?.handle,m_y:r[1]?.handle,m_z:r[2]?.handle,m_10:r[3]?.handle,m_q:i[0].size}),e.drawArraysInstanced(e.TRIANGLES,0,6,t.items.length)}},outputs:{items:i,texture:{localExpansions:(e,t)=>a[e]&&a[e][t]}},destroy:()=>{o.forEach(t=>t&&e.deleteFramebuffer(t)),a.forEach(t=>t&&t.forEach(t=>e.deleteTexture(t.handle))),c.forEach(t=>t&&e.deleteVertexArray(t))}}}function lt(e,t,n){let r=R(e,tt.vert,tt.frag),i=t.texture.particlesPositions(),a=z(e,{type:e.FLOAT,size:i.size,data:new Float32Array(i.data?i.data.buffer.slice(0):new ArrayBuffer(0)),format:e.RGBA,internalFormat:e.RGBA32F}),o=V(i,a),s=B(e,a.handle),c=B(e,i.handle),l=V(s,c),u=W(e,r,{m_11:1,m_12:n.inertia,m_13:n.maxDisplacement**2,m_14:n.charge,m_15:n.gravity,m_16:n.edgeStrength,m_17:n.edgeLength,m_18:n.elasticity,m_19:n.margin,m_6:i.handle,m_1a:t.texture.adjacencyOffsets().handle,m_1b:t.texture.adjacencyLists().handle,m_1c:t.texture.nodesExtraProperties().handle,m_1d:t.texture.stiffness().handle,m_5:2,m_8:t.texture.spatialBoundaries().handle,m_0:t.texture.spatialKeys().handle,m_9:t.texture.gridCells().handle,m_1t:null,m_1e:i.size}),d=i,f={},p=new Set;return t.items.forEach(e=>p.add(e.depth-1)),p.forEach(n=>{let i=e.createVertexArray();if(!i)throw Error(`Cannot create VAO`);f[n]=i,e.bindVertexArray(i),Z(e,r),X(e,r,`m_e`,Y(t.items,e=>e.particlesPositionsSlot),4),X(e,r,`m_1f`,Y(t.items,e=>e.nodesExtraPropertiesSlot),4),X(e,r,`m_1g`,Y(t.items,e=>e.adjacencyListsSlot),4),X(e,r,`m_1h`,Y(t.items,e=>e.adjacencyOffsetsSlot),4),X(e,r,`m_1i`,Y(t.items,e=>e.stiffnessSlot),4),X(e,r,`m_f`,Y(t.items,e=>e.spatialBoundariesSlot),4),X(e,r,`m_3`,Y(t.items,e=>e.spatialKeysSlot),4),X(e,r,`m_2`,Y(t.items,e=>e.gridCellsSlot),4),X(e,r,`m_r`,new Uint32Array(t.items.map(e=>e.localExpansionsSlot&&e.localExpansionsSlot[n]||K()).map(J).flat()),4),X(e,r,`m_4`,new Uint32Array(t.items.map(e=>e.N)),1),X(e,r,`m_g`,new Uint32Array(t.items.map(e=>e.depth)),1),X(e,r,`m_h`,new Uint32Array(t.items.map(e=>e.order)),1)}),{step:(n=1)=>{e.viewport(0,0,i.size[0],i.size[1]),e.useProgram(r),e.bindFramebuffer(e.FRAMEBUFFER,l()[0]);let[a,s]=o();d=s,p.forEach(r=>{e.bindVertexArray(f[r]),G(e,u,{m_11:n,m_6:a.handle,m_8:t.texture.spatialBoundaries().handle,m_0:t.texture.spatialKeys().handle,m_5:r,m_1u:t.texture.localExpansions(r,0)?.handle,m_1v:t.texture.localExpansions(r,1)?.handle,m_1a:t.texture.adjacencyOffsets().handle,m_1b:t.texture.adjacencyLists().handle,m_1c:t.texture.nodesExtraProperties().handle,m_1d:t.texture.stiffness().handle,m_9:t.texture.gridCells().handle}),e.drawArraysInstanced(e.TRIANGLES,0,6,t.items.length)})},outputs:{items:t.items.map(e=>({N:e.N,pointsSlot:e.particlesPositionsSlot})),texture:{points:()=>d}},destroy:()=>{e.deleteFramebuffer(s),e.deleteFramebuffer(c),e.deleteTexture(a.handle),Object.values(f).forEach(t=>e.deleteVertexArray(t))}}}function ut(e,t,n){let{steps:r,batch:i,sortingMethod:a}=n,o=n.order??4,s=t.texture.particlesPositions(),c={items:t.items.map(({N:e,particlesPositionsSlot:t})=>({N:e,pointsSlot:t})),texture:{points:()=>s}},l=nt(e,c),u=rt(e,{items:t.items.map((e,t)=>({...e,depth:Math.max(1,n.depth??Ve(e.N)),...c.items[t],...l.outputs.items[t]})),texture:{...c.texture,...l.outputs.texture}}),d=(a===`ibr`?at:it)(e,u.outputs),f=ot(e,{items:t.items.map((e,t)=>({...e,depth:Math.max(1,n.depth??Ve(e.N)),order:o,...l.outputs.items[t],...d.outputs.items[t]})),texture:{...l.outputs.texture,...d.outputs.texture}}),p=st(e,{items:t.items.map((e,t)=>({order:o,...e,...f.outputs.items[t]})),texture:{particlesPositions:()=>s,particlesCharges:t.texture.particlesCharges,...f.outputs.texture}}),m=ct(e,{items:p.outputs.items,texture:{...p.outputs.texture}}),h={charge:n.charge,gravity:n.gravity,inertia:n.inertia,edgeStrength:n.edgeStrength,edgeLength:n.edgeLength,elasticity:n.elasticity,margin:n.margin,maxDisplacement:n.maxDisplacement},g=lt(e,{items:t.items.map((e,t)=>({...e,...f.outputs.items[t],...p.outputs.items[t],...m.outputs.items[t]})),texture:{...t.texture,...f.outputs.texture,...m.outputs.texture}},h),_=t.items.reduce((e,{N:t})=>Math.max(e,t),0);return{...qe(i??He(_),e=>(s=g.outputs.texture.points(),l.step(),u.step(),d.step(),f.step(),p.step(),m.step(),g.step(Ue(e,r)),e<r)),destroy:()=>{l.destroy(),u.destroy(),d.destroy(),f.destroy(),p.destroy(),m.destroy(),g.destroy()}}}const dt=(e,t)=>.003*e**2+(t+1);function ft(e){let t=new Uint32Array(e.nodes.length);for(let n of e.edges)t[n.source]!==void 0&&t[n.source]++,t[n.target]!==void 0&&t[n.target]++;return t}function pt(e){let t=new Map,n={nodes:[],edges:[]};return e.nodes.forEach((e,r)=>{t.has(e.id)&&console.warn(`Duplicated ID ${e.id}@${r}`),n.nodes.push({...e,id:r}),t.set(e.id,r)}),e.edges.forEach(e=>{let r=t.get(e.source),i=t.get(e.target);if(r===void 0){console.warn(`Missing source ${e.source}`);return}if(i===void 0){console.warn(`Missing target ${e.target}`);return}n.edges.push({...e,source:Math.min(r,i),target:Math.max(r,i)})}),n.edges.sort((e,t)=>e.source-t.source||e.target-t.target),n}function mt(e,[t,n]=[0,0],r=.001){let i=Math.PI*(3-Math.sqrt(5)),a=e.nodes.map(e=>(e.x=(e.x||0)-t,e.y=(e.y||0)-n,e)).map(e=>({n:e,key:e.pinned?0:.5+Math.floor(e.x/r)+Math.floor(e.y/r)/r})).sort((e,t)=>e.key-t.key),o=0;return a.forEach(({n:e,key:t},n)=>{if(t*n===0||t!==a[n-1].key){o=n;return}let r=Math.sqrt(n-o);e.x=a[o].n.x+r*Math.cos(i*(n-o)),e.y=a[o].n.y+r*Math.sin(i*(n-o))}),e}function ht(e){let t=ft(e);return{nodes:e.nodes.map((e,n)=>{let r=(e.mass??1)*dt(e.r||1,t[n]);return r=Math.max(r,.001),{...e,mass:r}}),edges:e.edges.map(e=>{let n=e.weight||1,r=t[e.source]+1,i=t[e.target]+1,a=i*r*n/Math.min(r,i)/(r+i);return{...e,stiffness:a}})}}function gt(e,t){return ht(mt(pt(e),t))}function _t(e,t){let n={};return t.forEach((e,t)=>{(n[e]??(n[e]=new Set)).add(t)}),Object.values(n).map(t=>({nodes:[...t].map(t=>e.nodes[t]),edges:e.edges.filter(({source:e,target:n})=>t.has(e)&&t.has(n))}))}function vt(e,t,n={}){t.getExtension(`EXT_color_buffer_float`)||t.getExtension(`WEBGL_lose_context`)?.loseContext();let r=new xe({...Se,...n}),i=e.nodes.length,a=n.cx??e.nodes.reduce((e,t)=>e+(t.x||0),0)/Math.max(1,i),o=n.cy??e.nodes.reduce((e,t)=>e+(t.y||0),0)/Math.max(1,i),s=[a,o],c=Array.from({length:i},(e,t)=>t),l,u,d=e=>{if(!l)throw Error(`No graph has been set`);let[n,r]=l.texture.particlesPositions().size;if(n*r<=1)return{X:[0],Y:[0]};let i=[],s=[],u=0,d=new Float32Array(4*n*r);return t.readPixels(0,0,n,r,t.RGBA,t.FLOAT,d),l.items.forEach(({N:e,particlesPositionsSlot:t})=>{let{x:r,y:l,w:f}=t;for(let t=0;t<e;t++){let e=r+t%f,p=4*((l+Math.floor(t/f))*n+e);i[c[u+t]]=d[p]+a,s[c[u+t]]=d[p+1]+o}u+=e}),e&&(f(),p()),{X:i,Y:s}},f=()=>{u&&=(u.stop(),u.destroy(),void 0)},p=()=>{l&&=(Pe(t,l),void 0)},m=e=>{let r;if(n.groups){let t={};Object.entries(n.groups).forEach(([e,n])=>n.forEach(n=>{t[n]=Number(e)})),r=_t(pt(e),Object.values(t)),r.map(({nodes:e})=>e).flat().forEach((e,t)=>{c[t]=e.id}),r=r.map(e=>gt(e,s))}else r=[gt(e,s)];return Ne(t,r)},h={setOptions(e={}){return r=new xe({...Se,...e}),l&&(f(),u=ut(t,l,r)),h},setGraph(e={nodes:[],edges:[]}){return l&&=(Pe(t,l),void 0),l=m(e),r&&(f(),u=ut(t,l,r)),h},start(){if(!u)throw Error(`No graph has been set`);return u.start().finally(()=>n.onEnd?.(1)).catch(e=>{throw Error(`Something went wrong during GPU layout: `+e)}),h},stop(){return u&&u.stop(),h},step(){if(!u)throw Error(`No graph has been set`);return u.step(),h},data:e=>d(e),iterations:()=>1};return l=m(e),u=ut(t,l,r),h}function yt(e={}){let t=e.canvas??document.createElement(`canvas`),n=window.devicePixelRatio||1,r=e.width??window.innerWidth*n,i=e.height??window.innerHeight*n;t.width=Math.ceil(r),t.height=Math.ceil(i),t.style.width=Math.ceil(r/n)+`px`,t.style.height=Math.ceil(i/n)+`px`;let a=t.getContext(`webgl2`,{antialias:!0});if(!a)throw Error(`WebGL 2.0 not supported`);return a}function bt(e,t,n){try{let e=yt(),t=()=>n(Error(`WebGL2 context lost`));return e.canvas.addEventListener(`webglcontextlost`,t),{context:e,cleanUp:()=>{e.canvas.removeEventListener(`webglcontextlost`,t),e.getExtension(`WEBGL_lose_context`)?.loseContext()}}}catch(e){return n(e),null}}const xt=e=>{};function St(e){for(let t in e)typeof e[t]==`function`&&delete e[t];return e}const Ct={name:`force`,imports:{force:he},configure(e,{graph:t,events:n}){let r=e.nodes._indexes,i=e.xs??t.getNodeAttribute(`x`).getMultiple(r),a=e.ys??t.getNodeAttribute(`y`).getMultiple(r),o=e.rs??t.getNodeAttribute(`radius`).getMultiple(r),s=t.getNodeAttribute(`layoutable`).getMultiple(r),c=e.edges,l=[],u=[],d={},f=e.edgeWeight||xt,p=e.nodeMass?t=>e.nodeMass(e.nodes.get(t)):xt;e.edgeStrength===void 0&&(e.edgeStrength=.5),e.gpu&&(e.edgeStrength/=2),e.gravity??=.01,e.siblingsOffset??=0,e.theta??=.62,e.autoStop=!!e.autoStop,e.alignSiblings=!!e.alignSiblings;let m=e.radiusRatio||1.25;for(let e=0;e<r.length;e++){let t=r[e];d[t]=e,l.push({id:e,x:i[e],y:a[e],r:o[e]*m,mass:p(e),pinned:!s[e]})}c.forEach(e=>{let t=d[e.getSource()._index],n=d[e.getTarget()._index];t!==n&&t!==void 0&&n!==void 0&&u.push({source:t,target:n,weight:f(e)})});let h=St({...e});return delete h.nodes,delete h.edges,{graph:{nodes:l,edges:u},options:h,indexes:r,done:!1,x:i,y:a,chunkPeriod:250}},update(e,t){if(!t.simulation&&e){let n;t.done=!1,t.graph=e.graph,t.options=e.options,t.indexes=e.indexes;let r=!1;if(e.options.gpu){let i=bt(`webgl2`,{},n=>{console.warn(`GPU layout: WebGL context not available. Falling back on CPU. ${n||`unknown`}`),t.simulation=void 0,t.options.gpu=!1,t.cleanUp&&t.cleanUp(),Ct._update(e,t)});i&&(n=i.context,t.cleanUp=i.cleanUp),r=!!n}let i=Date.now();r||(e.options.nextTick=e=>Date.now()-i<=t.chunkPeriod?e():(i=Date.now(),setTimeout(e,0))),e.options.update=(e,n,r)=>{t.x=n,t.y=r},e.options.onEnd=()=>{if(r&&n){let{X:e,Y:n}=t.simulation.data(!0);t.x=e,t.y=n}t.done=!0,t.simulation=void 0,t.cleanUp&&t.cleanUp()},e.options.bucketSize=0;let a=r&&n?vt(e.graph,n,e.options).start():he(e.graph,e.options).start();t.simulation=a;let{X:o,Y:s}=r&&n?{X:new Float32Array(e.graph.nodes.length),Y:new Float32Array(e.graph.nodes.length)}:a.data();t.x=o,t.y=s}return{graph:t.graph,indexes:t.indexes,x:t.x,y:t.y}},context(){return{done:!1,graph:{nodes:[],edges:[]},x:null,y:null,indexes:null,chunkPeriod:250}},stop(e){e.done=!0,e.simulation&&(e.simulation.stop(),delete e.simulation)},isRunning(e){return!e.done||(e.done=!1,!1)},onSync({indexes:e,x:t,y:n}){return{indexes:e,x:t,y:n}}};function wt(e,t,n){let r=e.nodes,i=e.edges,a=e.maxSize,o=Object.keys(r),s=Object.keys(i),c=o.length*n.ppn,l=s.length*n.ppe,u={},d=10**(Math.log(Math.max(a,1))-6),f=d/2,p=Math.random,m=t.randomizeFactor||1,h;h=t.randomize===`locally`?e=>e+p()*m:t.randomize===`globally`?e=>p()*m:e=>e+p()*d-f;let g=new Float32Array(c),_=new Float32Array(l),v,y;for(v=0,y=0;v<o.length;v++){let e=o[v],t=r[e],i=t.x,a=t.y;t.pinned||(i=h(i),a=h(a)),u[e]=y,g[y+0]=i,g[y+1]=a,g[y+2]=0,g[y+3]=0,g[y+4]=0,g[y+5]=0,g[y+6]=t.mass,g[y+7]=1,g[y+8]=t.size,g[y+9]=t.pinned||0,y+=n.ppn}for(v=0,y=0;v<s.length;v++){let e=i[s[v]];_[y+0]=u[e.source],_[y+1]=u[e.target],_[y+2]=e.weight||0,y+=n.ppe}return{nodes:g,edges:_}}const Tt={name:`forceLink`,configure(e,{graph:t,camera:n,graphics:r}){let i=e.nodes._indexes,a=e.edges._indexes,o={},s={},c=i.length,l=a.length,u=t.getObjectList(!0),d=t.getObjectList(!1);(e.nodes||e.edges)&&(e={...e},delete e.nodes,delete e.edges);let f=t.getNodeAttribute(`innerStroke.width`).getMultiple(i),p=t.getNodeAttribute(`outerStroke.width`).getMultiple(i),m=t.degrees(i),h=e.xs??t.getNodeAttribute(`x`).getMultiple(i),g=e.ys??t.getNodeAttribute(`y`).getMultiple(i),_=e.rs??t.getNodeAttribute(`radius`).getMultiple(i),v=t.nodeList(i).getAttribute(`layoutable`),y=typeof e.nodeMass==`function`?e.nodeMass:(e,t,n)=>t+1;delete e.nodeMass;let b=typeof e.edgeWeight==`function`?e.edgeWeight:e=>1;delete e.edgeWeight,isFinite(e.scalingRatio)||delete e.scalingRatio;let x=i.reduce((e,t,n)=>(v[n]||(e[t]=!0),e),{}),S=0,C=0,w=0,T=n.getZoom();for(let e=0;e<i.length;e++){let t=i[e],n=h[e],r=g[e],a=_[e]+(f[e]+p[e])/T;o[t]={id:t,x:n,y:r,degree:m[e],size:a,pinned:!!x[t],mass:y(u.get(t),m[e],e)},w=Math.max(a,w)}if(c>1)for(let e=0;e<c;e++){let t=o[i[e]];S+=t.x,C+=t.y}S/=c,C/=c;let E={x:S,y:C},D=t.edgeList(a),O=D.getSource()._indexes,k=D.getTarget()._indexes;for(let e=0;e<l;e++){let t=a[e],n=O[e],r=k[e];o[n]&&o[r]&&(s[t]={source:n,target:r},s[t].weight=b(d.get(t)))}return{nodes:o,edges:s,maxSize:w,config:St(e),barycentre:E}},context(){return{chunkPeriod:250}},update(e,t){let n;if(!t.W&&e){n={ppn:10,ppe:3,ppr:9,MAX_SUBDIVISION_RETRIES:3,maxForce:10,iterations:0,converged:!1,settings:{linLogMode:!1,outboundAttractionDistribution:!1,adjustSizes:!1,edgeWeightInfluence:0,scalingRatio:100,strongGravityMode:!0,gravity:1,slowDown:1,barnesHutOptimize:!1,barnesHutTheta:.5,startingIterations:10,iterationsPerRender:10,maxIterations:1e3,avgDistanceThreshold:.01,autoStop:!0,alignNodeSiblings:!0,nodeSiblingsScale:5,nodeSiblingsAngleMin:0}},t.W=n;let r=wt(e,e.config,n);t.NodeMatrix=r.nodes,t.EdgeMatrix=r.edges,n.nodesLength=r.nodes.length,n.edgesLength=r.edges.length;for(let t in e.config)n.settings[t]=e.config[t];t.nodes=e.nodes,t.edges=e.edges,t.barycentre=e.barycentre}else n=t.W;let r=t.NodeMatrix,i=t.EdgeMatrix;function a(){Et(n,r,i)}function o(e){let t=Object.keys(e),i={};for(let e=0;e<r.length;e+=n.ppn){let a=t[e/n.ppn];i[a]={id:a,x:r[e+0],y:r[e+1],pinned:r[e+9]}}return i}if(n.settings.autoStop){let e=Date.now();for(;!n.converged&&Date.now()-e<t.chunkPeriod;)a()}else{let e=n.iterations===0?n.settings.startingIterations:n.iterations+n.settings.iterationsPerRender;for(;n.iterations!==e;)a()}return{nodes:o(t.nodes),barycentre:t.barycentre}},isRunning(e){return!e.W.settings.autoStop||!e.W.converged||(e.W=void 0,!1)},stop(e){e.W&&(e.W.converged=!0)},onSync({nodes:e,barycentre:t},{graph:n}){let r=Object.keys(e),i=r.length,a=Array(i),o=Array(i),s=Array(i),c=Array(i),l=0,u=0,[d,f]=n.getAttributes(!0,[`x`,`y`]);for(let t=0;t<i;t++){let n=r[t],i=e[n],p=parseInt(n);a[t]=p,c[t]=i.pinned;let m,h;i.pinned?(m=d.get(p),h=f.get(p)):(m=i.x,h=i.y),o[t]=m,s[t]=h,l+=m,u+=h}let p=l/i-t.x,m=u/i-t.y;for(let e=0;e<i;e++)c[e]||(o[e]-=p,s[e]-=m);return{indexes:a,x:o,y:s}}};function Et(e,t,n){let r=e.settings,i=o().force_fa2_pass(t,n,e.ppn,e.ppe,e.nodesLength,e.edgesLength,r.scalingRatio,r.gravity,r.strongGravityMode,r.linLogMode,r.edgeWeightInfluence,r.slowDown,r.barnesHutOptimize);e.iterations++,r.autoStop&&(e.converged=e.iterations>r.maxIterations||i/e.nodesLength<r.avgDistanceThreshold)}function Dt(e,t,n){let r=Array.from({length:e},()=>[]),i=Array.from({length:e},()=>[]);for(let a=0;a<t.length;a++){let o=t[a],s=n[a];o<e&&s<e&&(r[o].push(s),i[s].push(o))}return{out:r,inc:i}}function Ot(e,t,n){let r=new Map;for(let e=0;e<t.length;e++){let i=t[e],a=n[e];r.has(i)||r.set(i,[]),r.has(a)||r.set(a,[]),r.get(i).push(a),r.get(a).push(i)}let i=Array.from(r.keys()),a=[];for(;i.length>0;){let e=i[0],t=new Set([e]),n=[e],o=[e];for(;n.length>0;){let e=n.shift();for(let i of r.get(e))t.has(i)||(t.add(i),o.push(i),n.push(i))}a.push(o);let s=new Set(o);i=i.filter(e=>!s.has(e))}for(let t=0;t<e;t++)r.has(t)||a.push([t]);return a}function kt(e,t,n,r){let i=[];for(let t of e){let e=r(t);if(typeof e==`number`&&!isNaN(e)){if(e<0)throw Error(`Layer must be greater than or equal to 0`);i.push([t,e])}}if(i.length===0)return null;i.sort((e,t)=>e[1]-t[1]);let a=new Set;for(let[e,t]of i)t!==0&&a.add(e);let o=new Set(e),s=new Map;for(let t of e)s.set(t,[]);for(let e=0;e<t.length;e++)o.has(t[e])&&(s.get(t[e])?.push(n[e]),s.get(n[e])?.push(t[e]));if(!i.some(([,e])=>e===0)){i.sort((e,t)=>e[1]-t[1]);let e=new Set,t=[i[0]],n;for(;t.length>0;){let[r,i]=t.shift();if(i===0){n=r;break}e.add(r);for(let n of s.get(r)||[])!a.has(n)&&!e.has(n)&&t.push([n,i-1])}if(n!==void 0)i.push([n,0]);else{let e=i[0][1];for(let t=0;t<i.length;t++)i[t][1]-=e}}let c=i.filter(([,e])=>e===0).map(([e])=>e),l=new Map,u=new Map,d=new Map;for(let e of c)l.set(e,0),u.set(e,[]);{let e=c.slice();for(;e.length>0;){let t=e.shift(),n=l.get(t);for(let r of s.get(t)||[]){let i=l.get(r);i===void 0?(l.set(r,n+1),u.set(r,[t]),e.push(r)):i===n+1&&u.get(r)?.push(t)}}}for(let[e,t]of u.entries())for(let n of t)d.set(n,(d.get(n)||[]).concat(e));let f=()=>{let t=e.filter(e=>l.get(e)===0);l.clear();for(let e of t)l.set(e,0);let n=t.slice();for(;n.length>0;){let e=n.shift(),t=l.get(e);for(let r of d.get(e)||[])l.get(r)===void 0&&(l.set(r,t+1),n.push(r))}};for(let[t,n]of i)if(l.get(t)!==n)if(n===0){let e=u.get(t)||[];u.set(t,[]);for(let n of e)d.set(n,(d.get(n)||[]).filter(e=>e!==t));f()}else{let r=e.map(e=>({id:e,l:l.get(e)})).find(e=>e.l===n-1&&e.id!==t);if(!r)continue;let i=u.get(t)||[];u.set(t,[r.id]);for(let e of i)d.set(e,(d.get(e)||[]).filter(e=>e!==t));d.set(r.id,(d.get(r.id)||[]).concat(t)),f()}let p=[],m=[];for(let[e,t]of u.entries())if(t.length!==0)for(let n of t)p.push(n),m.push(e);return{src:p,tgt:m}}function At(e,t,n){let r=new Set(e),i=new Map,a=new Map;for(let t of e)i.set(t,[]),a.set(t,[]);for(let e=0;e<t.length;e++)r.has(t[e])&&i.get(n[e]).push(t[e]);let o=[];for(let t of e){for(let e of i.get(t))a.get(e).push(t);i.get(t).length===0&&o.push(t)}let s=[],c=new Set,l=o.slice();for(;l.length>0;){let e=l.pop();if(!c.has(e)){c.add(e),s.push(e);for(let t of a.get(e))l.push(t)}}return{order:s,childrenOf:a}}function jt(e,t,n,r){let i=o().hier_remove_cycles(e,Uint32Array.from(t),Uint32Array.from(n),r?Uint32Array.from(r):new Uint32Array,r!==void 0),a=[],s=[];for(let e=0;e<i.length;e+=2)a.push(i[e]),s.push(i[e+1]);return{sources:a,targets:s}}function Mt(e,t,n,r,i,a){let s=o();if(!s||typeof s.hier_reference_layering!=`function`)throw Error(`hierarchical layout requires the wasm backend (hier_reference_layering missing).`);let c=t=>{let n=new Uint32Array(e+1),r=0;for(let i=0;i<e;i++)n[i]=r,r+=t[i].length;n[e]=r;let i=new Uint32Array(r),a=0;for(let n=0;n<e;n++)for(let e=0;e<t[n].length;e++)i[a++]=t[n][e];return[n,i]},[l,u]=c(t),[d,f]=c(n),p=new Float64Array(e).fill(NaN);if(a)for(let t=0;t<e;t++){let e=a[t];typeof e==`number`&&!isNaN(e)&&(p[t]=e)}let m=new Uint8Array(e);for(let e of i)m[e]=1;let h=s.hier_reference_layering(e,l,u,d,f,m,p);return Array.from(h)}function Nt(e,t,n,r){let i=!1;for(let n=0;n<e&&!i;n++)for(let e of t[n])if(r[n]>r[e]){i=!0;break}if(!i)return;let a=Array(e);for(let n=0;n<e;n++)a[n]=t[n].filter(e=>r[n]<=r[e]);for(let n=0;n<e;n++)for(let e of t[n])r[n]>r[e]&&a[e].push(n);for(let r=0;r<e;r++)t[r]=a[r],n[r].length=0;for(let r=0;r<e;r++)for(let e of t[r])n[e].push(r)}function Pt(e,t){let n=0;for(let r=0;r<e;r++)t[r]>n&&(n=t[r]);let r=Array.from({length:n+1},()=>[]);for(let n=0;n<e;n++)r[t[n]].push(n);return r}function Ft(e,t,n,r,i){let a=o();if(!a||typeof a.hier_barycenter_sweep!=`function`)throw Error(`hierarchical layout requires the wasm backend (hier_barycenter_sweep missing).`);let s=r.length,c=new Uint32Array(e.length+1),l=0;for(let t=0;t<e.length;t++)c[t]=l,l+=e[t].length;c[e.length]=l;let u=new Uint32Array(l),d=0;for(let t=0;t<e.length;t++)for(let n=0;n<e[t].length;n++)u[d++]=e[t][n];let f=new Uint32Array(s+1),p=0;for(let e=0;e<s;e++)f[e]=p,p+=t[e].length;f[s]=p;let m=new Uint32Array(p),h=0;for(let e=0;e<s;e++)for(let n=0;n<t[e].length;n++)m[h++]=t[e][n];let g=a.hier_barycenter_sweep(s,u,c,f,m,Int32Array.from(r),i),_=0;for(let t=0;t<e.length;t++)for(let n=0;n<e[t].length;n++)e[t][n]=g[_++]}function It(e,t,n,r,i,a,s){let c=t.length,l=Array(c).fill(0),u=Array(c).fill(0),d=o();if(!d||typeof d.sugiyama_coordinates!=`function`)throw Error(`hierarchical layout requires the wasm backend (sugiyama_coordinates missing).`);let f=new Uint32Array(c+1),p=0,m=[];for(let e=0;e<c;e++)m.push(a[e].filter(t=>s[t]>=s[e]));for(let e=0;e<c;e++)f[e]=p,p+=m[e].length;f[c]=p;let h=new Uint32Array(p),g=0;for(let e=0;e<c;e++)for(let t of m[e])h[g++]=t;let _=new Float64Array(c);for(let e=0;e<c;e++)_[e]=t[e]||5;let v=d.sugiyama_coordinates(c,Int32Array.from(s),_,f,h,n,r);if(v.length===0&&c>1)throw Error(`sugiyama coordinate assignment failed (empty placement group).`);for(let e=0;e<c;e++){let t=v[2*e]??0,n=v[2*e+1]??0;if(i===`BT`)n=-n;else if(i===`LR`){let e=t;t=n,n=-e}else if(i===`RL`){let e=t;t=-n,n=e}l[e]=t,u[e]=n}return{x:l,y:u}}function Lt(e,t,n,r,i,a,s,c,l,u){let d=t.length,f=Array(d).fill(0),p=Array(d).fill(0),m=o();if(!m||typeof m.hier_assign_coordinates!=`function`)throw Error(`hierarchical layout requires the wasm backend (hier_assign_coordinates missing).`);let h=(e,t)=>{let n=new Uint32Array(t+1),r=0;for(let i=0;i<t;i++)n[i]=r,r+=e[i].length;n[t]=r;let i=new Uint32Array(r),a=0;for(let n=0;n<t;n++)for(let t=0;t<e[n].length;t++)i[a++]=e[n][t];return[n,i]},g=new Uint32Array(e.length+1),_=0;for(let t=0;t<e.length;t++)g[t]=_,_+=e[t].length;g[e.length]=_;let v=new Uint32Array(_),y=0;for(let t=0;t<e.length;t++)for(let n=0;n<e[t].length;n++)v[y++]=e[t][n];let b=new Float64Array(d);for(let e=0;e<d;e++)b[e]=t[e]||5;let[x,S]=h(c,d),[C,w]=h(l,d),T=i===`BT`?1:i===`LR`?2:i===`RL`?3:0,E=m.hier_assign_coordinates(d,v,g,b,n,r,T,a,s,x,S,C,w,Int32Array.from(u));for(let e=0;e<d;e++)f[e]=E[e*2],p[e]=E[e*2+1];return{x:f,y:p}}function Rt(e,t,n,r,i,a){let s=o();if(!s||typeof s.hier_pack_units!=`function`)throw Error(`hierarchical layout requires the wasm backend (hier_pack_units missing).`);let c=t.length,l=new Uint32Array(e.length+1),u=0;for(let t=0;t<e.length;t++)l[t]=u,u+=e[t].nodes.length;l[e.length]=u;let d=new Uint32Array(u),f=0;for(let t of e)for(let e of t.nodes)d[f++]=e;let p=new Uint8Array(e.length),m=new Float64Array(e.length),h=new Float64Array(e.length);e.forEach((e,t)=>{e.fake&&(p[t]=1,m[t]=e.fake.w,h[t]=e.fake.h)});let g=new Float64Array(c);for(let e=0;e<c;e++)g[e]=r[e]??5;let _=a===`singleLine`?2:0,v=s.hier_pack_units(d,l,p,m,h,Float64Array.from(t),Float64Array.from(n),g,i,_);for(let e=0;e<c;e++)t[e]=v[e*2],n[e]=v[e*2+1]}function zt(e,t={}){let{direction:n=`TB`,nodeDistance:r=5,levelDistance:i=50,componentDistance:a=25,roots:o=[],sinks:s=[],compactSiblings:c=!1,siblingsDistance:l=10,decross:u=!0,arrangeComponents:d=`fit`,gridDistance:f=50,layer:p}=t,{nodeCount:m,sources:h,targets:g,nodeRadii:_,nodeData:v}=e;if(m===0)return{x:[],y:[]};let y=[],b=[];for(let e=0;e<h.length;e++)h[e]!==g[e]&&(y.push(h[e]),b.push(g[e]));let{sources:x,targets:S}=jt(m,y,b),C=[],w=[];{let e=new Set;for(let t=0;t<x.length;t++){let n=x[t]+`->`+S[t];e.has(n)||(e.add(n),C.push(x[t]),w.push(S[t]))}}let T=Ot(m,C,w),E=Array(m).fill(0),D=Array(m).fill(0),O=t=>{if(e.nodeLayers){let n=e.nodeLayers[t];return typeof n==`number`&&!isNaN(n)?n:void 0}if(v&&p){let e=v[t],n=e?e[p]:void 0;return typeof n==`number`&&!isNaN(n)?n:void 0}};for(let e of T){let t=kt(e,C,w,O),n=t?(()=>{let n=jt(m,t.src,t.tgt,e);return{src:n.sources,tgt:n.targets}})():null,{order:a,childrenOf:d}=At(e,n?n.src:C,n?n.tgt:w),f=new Map;a.forEach((e,t)=>f.set(e,t));let p=a.length,h=[],g=[];for(let e=0;e<p;e++){let t=a[e];for(let n of d.get(t))h.push(e),g.push(f.get(n))}let y=a.map(e=>_[e]||5);v&&a.map(e=>v[e]);let b=o.filter(e=>f.has(e)).map(e=>f.get(e)),x=s.filter(e=>f.has(e)).map(e=>f.get(e)),{out:S,inc:T}=Dt(p,h,g),k=Mt(p,S,T,b,x,a.map(e=>O(e)));Nt(p,S,T,k);let A=Pt(p,k);if(u){let e=0;for(let t of A)t.length>e&&(e=t.length);Ft(A,S,T,k,e<50?100:e<100?10:+(e<1e3))}let j,M;try{let e=It(A,y,r,i,`TB`,S,k);j=e.x,M=e.y}catch{let e=Lt(A,y,r,i,`TB`,c,l,S,T,k);j=e.x,M=e.y}for(let e=0;e<p;e++)E[a[e]]=j[e],D[a[e]]=M[e]}let k=[];if(d===`grid`){let e=[];for(let t of T)t.length===1?e.push(t[0]):k.push({nodes:t,w:0,h:0,x:void 0,y:void 0});if(e.length>0){let t=e.slice().sort((e,t)=>(_[t]??5)-(_[e]??5)),n=Math.sqrt(t.length),r=Math.floor(n),i=Math.ceil(n);r*i<t.length&&(r<i?r++:i++);let a=0;for(let e of t)a=Math.max(a,2*(_[e]??5));let o=Math.max(1,a),s=Math.max(f||0,1),c=o*i+s*(i-1),l=o*r+s*Math.max(r-1,0);t.forEach((e,t)=>{let n=t%i,a=Math.floor(t/i);E[e]=c*n/i,D[e]=l*a/r}),k.push({nodes:t,fake:{w:c,h:l},w:c,h:l,x:void 0,y:void 0})}}else for(let e of T)k.push({nodes:e,w:0,h:0,x:void 0,y:void 0});if(Rt(k.slice(),E,D,_,a,d),n===`BT`)for(let e=0;e<m;e++)D[e]=-D[e];else if(n===`RL`)for(let e=0;e<m;e++){let t=E[e];E[e]=-D[e],D[e]=t}else if(n===`LR`)for(let e=0;e<m;e++){let t=E[e];E[e]=D[e],D[e]=-t}if(m>0){let t=e.initialX,n=e.initialY,r=0,i=0;for(let e=0;e<m;e++)r+=t&&t[e]||0,i+=n&&n[e]||0;r/=m,i/=m;let a=0,o=0,s=0;for(let e of k)for(let t of e.nodes)a+=E[t]||0,o+=D[t]||0,s++;a/=s,o/=s;let c=r-a,l=i-o;for(let e=0;e<m;e++)E[e]=E[e]+c,D[e]=D[e]+l}return{x:E,y:D}}const Bt={direction:`TB`,nodeDistance:5,levelDistance:50,componentDistance:50,siblingsDistance:10,compactSiblings:!1,gapWidth:1,arrangeComponents:`fit`,gridDistance:50,layer:`layer`,siblingIndex:``};function Vt(e){for(let t in e)typeof e[t]==`function`&&delete e[t];return e}function Ht(e,t,n){return t?t instanceof Object&&t._indexes?t:e.getNodes(t):n??e.nodeList()}function Ut(){return{}}const Wt={name:`hierarchical`,configure(e,{graph:t,data:n}){let r={...Bt,...e,nodeList:e.nodes};r.direction=e.direction||Bt.direction,r.layerSeparation=r.levelDistance,r.nodesSeparation=r.nodeDistance,r.componentsSeparation=r.componentDistance,r.gapDistance=r.gapWidth,r.packing=r.arrangeComponents;let i=e.decross!==!1,a={...r},o=r.edges,s=r.nodeList;if(![`TB`,`BT`,`LR`,`RL`].includes(r.direction))throw Error(`direction should be one of the "TB", "BT", "LR", "RL"`);if(![`fit`,`grid`,`singleLine`].includes(r.packing))throw Error(`arrangeComponents should be one of the "fit", "grid", "singleLine"`);r.nodesGridSeparation=e.gridDistance||Bt.gridDistance;let c=s.getId(),l=s.getAttribute(`layoutable`).reduce((e,t,n)=>(e[c[n]]=t,e),{}),u=s.getAttributes([`x`,`y`]).reduce((e,t,n)=>(e[c[n]]=t,e),{}),d=e.rs??s.getAttribute(`radius`);if(typeof a.layer!=`string`)throw Error(`'layer' should be the valid data field name`);if(a.siblingIndex===void 0&&(a.siblingIndex=``),typeof a.siblingIndex!=`string`)throw Error(`'siblingIndex' should be the valid data field name`);let f=Ht(t,r.roots,t.nodeList()),p=n.getProperty(r.nodeList,a.layer),m=a.siblingIndex.length?n.getProperty(r.nodeList,a.siblingIndex):[],h=f.map(e=>{let t=-1;return r.nodeList.forEach((n,r)=>{n===e&&(t=r)}),t});for(let e of h)p[e]=0;let g=Ht(t,r.sinks,t.nodeList()).toArray().reduce((e,t)=>(e[t.getId()]=!0,e),{}),_=c.map(e=>g[e]),v;return e.compactSiblings&&typeof e.compactSiblingsFunction==`function`&&(v=s.map(t=>e.compactSiblingsFunction(t))),{nodes:c,edges:o.map(e=>({id:e.getId(),source:e.getSource().getId(),target:e.getTarget().getId()})),decross:i,options:Vt(r),layoutable:l,packs:v,radiuses:d,siblingIndexes:m,layers:p,sinks:_,coords:u}},context:Ut,update({nodes:e,edges:t,options:n,layoutable:r,radiuses:i,layers:a,packs:o,siblingIndexes:s,decross:c,sinks:l,coords:u}){let d=t.filter(({source:e,target:t})=>e in r&&t in r),f={nodes:e.map((e,t)=>({id:e,radius:i[t],layer:a[t],siblingIndex:s[t],sink:l[t],layoutable:r[e],x:u[e].x,y:u[e].y})),edges:d};if(o){let e=new Map;o.forEach((t,n)=>{e.set(f.nodes[n].id,t)})}let p={TB:`down`,BT:`up`,RL:`left`,LR:`right`},m={fit:`fit`,singleLine:`singleline`,grid:`grid`},h=f.nodes.length,g=new Map;f.nodes.forEach((e,t)=>g.set(e.id,t));let _=[],v=[];for(let e of f.edges){let t=g.get(e.source),n=g.get(e.target);t!==void 0&&n!==void 0&&(_.push(t),v.push(n))}let y=f.nodes.map(e=>e.radius||5),b=[],x=[];f.nodes.forEach((e,t)=>{e.layer===0&&b.push(t),e.sink&&x.push(t)});let S={down:`TB`,up:`BT`,left:`RL`,right:`LR`},C={fit:`fit`,singleline:`singleLine`,grid:`grid`},w=p[n.direction]||`down`,T=m[n.arrangeComponents]||`fit`,E=zt({nodeCount:h,sources:_,targets:v,nodeRadii:y,initialX:f.nodes.map(e=>e.x),initialY:f.nodes.map(e=>e.y),nodeLayers:f.nodes.map(e=>typeof e.layer==`number`&&!isNaN(e.layer)?e.layer:void 0)},{direction:S[w]||`TB`,nodeDistance:n.nodesSeparation??5,levelDistance:n.layerSeparation??50,componentDistance:n.componentsSeparation??50,roots:b,sinks:x,compactSiblings:!!n.compactSiblings,siblingsDistance:n.siblingsDistance??10,decross:n.decross!==!1,arrangeComponents:C[T]||`fit`});return{positions:f.nodes.map((e,t)=>({...e,x:E.x[t],y:E.y[t]}))}},isRunning(){return!1},onSync({positions:e},{graph:t}){return{indexes:e.map(({id:e})=>(t.getNode(e)||{_index:-1})._index),x:e.map(({x:e})=>e),y:e.map(({y:e})=>e)}}},Gt={...Wt,name:`sequential`};function Kt(e){return e===void 0||typeof e==`number`&&isFinite(e)&&e>0}function qt(e,t,n,r,i){if(!Kt(t))throw TypeError(`"rows" should be a positive integer`);if(!Kt(n))throw TypeError(`"cols" should be a positive integer`);if(!Kt(r))throw TypeError(`"rowDistance" should be a positive number`);if(!Kt(i))throw TypeError(`"colDistance" should be a positive number`);if(t)return{rows:t,cols:Math.ceil(e/t),rowDistance:r,colDistance:i};if(n)return{cols:n,rows:Math.ceil(e/n),rowDistance:r,colDistance:i};let a=Math.ceil(Math.sqrt(e));return{cols:a,rows:Math.ceil(e/a),rowDistance:r,colDistance:i}}function Jt(e,t,n,r,i){return typeof e==`string`?e===`radius`?t.getAttribute(!0,`radius`).getMultiple(r):e===`degree`?n.getDegree():e===`random`?r.map(()=>Math.random()):n.getData(e).map(e=>e||i):r.map((e,t)=>t)}const Yt={name:`grid`,configure(e,{graph:t,camera:n}){let r=e.sortBy,i=e.nodes,a=Array.from(i._indexes),o=a.length,{rows:s,cols:c,rowDistance:l,colDistance:u}=qt(o,e.rows,e.cols,e.colDistance,e.rowDistance),d=Jt(r,t,i,a,e.sortFallbackValue),f=i.getAttribute(`layoutable`),p=a.reduce((e,t,n)=>(f[n]&&e.push({id:t,attr:d[n]}),e),[]),m=i.getAttribute(`x`),h=i.getAttribute(`y`),g=i.getAttribute(`radius`),_=1/0,v=1/0;for(let e=0;e<a.length;e++)_=Math.min(_,m[e]),v=Math.min(v,h[e]);return{sort:!!r,nodes:p,reverse:!!e.reverse,cols:c,rows:s,minX:_,minY:v,rs:g,rowDistance:l,colDistance:u}},update({sort:e,nodes:t,minX:n,rs:r,minY:i,reverse:a,cols:s,rowDistance:c,colDistance:l}){let u=t.map((e,t)=>t);e&&u.sort((e,n)=>t[e].attr-t[n].attr),a&&u.reverse();let d=o(),f=t.length,p=new Float64Array(f),m=new Float64Array(f);d.layout_grid_factory(Uint32Array.from(u),Float64Array.from(r,e=>Number(e)),n,i,s,c===void 0?0:c,c!==void 0,l===void 0?0:l,l!==void 0,p,m);for(let e=0;e<f;e++)t[e].x=p[e],t[e].y=m[e];return t},onSync(e){return{indexes:e.map(({id:e})=>e),x:e.map(({x:e})=>e),y:e.map(({y:e})=>e)}}};function Q(e,t){return e!=null&&isFinite(e)?e:t}function Xt(e,t){let n=0,r=e.length-1;for(;n<=r;){let i=n+r>>>1;if(e[i]===t)return i;e[i]<t?n=i+1:r=i-1}return-1}const Zt=(e,t)=>e-t;function Qt(e,t,n){let r=e.slice().sort(Zt),i=[];for(let e=0;e<t.length;e++){let a=[],o=t[e],s=!1;for(let e=0;e<o.length;e++){let t=o[e];Xt(r,t)!==-1&&(t===n&&(s=!0),a.push(t))}a.length>0&&i[s?`unshift`:`push`](a.sort(Zt))}return i}function $t(e){let t=e.x,n=e.y,r=e.indexes.length,i=t[e.centerIndexPos]-e.cx,a=n[e.centerIndexPos]-e.cy;for(let e=0;e<r;e++)t[e]-=i,n[e]-=a;return{indexes:e.indexes,x:t,y:n}}const en={name:`radial`,imports:{},configure(e,{graph:t}){let n=e.nodes,r=n.size;if(e.centralNode===void 0)throw Error(`radial layout: missing parameter "centralNode"`);let i=t.getNode(e.centralNode);if(i===void 0)throw Error(`radial layout: parameter "centralNode" is not valid`);e.radiusRatio=Q(e.radiusRatio,Math.SQRT2),e.radiusDelta=Q(e.radiusDelta,0),e.nodeGap=Q(e.nodeGap,10),e.repulsion=r*Q(e.repulsion,1);let a=i.getPosition(),o=Q(e.centerX,a.x),s=Q(e.centerY,a.y),c=i._index;n.includes(i)||(n=n.concat(i.toList()));let l=n._indexes,u=n.getAttribute(`layoutable`);l=l.filter((e,t)=>u[t]||e===c),l.sort(Zt);let d=l.length,f=Qt(l,t.getConnectedComponents(n,{internalIndexes:!0}),c),p=t.degrees(l),m=new Float32Array(e.xs??t.getNodeAttribute(`x`).getMultiple(l)),h=new Float32Array(e.ys??t.getNodeAttribute(`y`).getMultiple(l)),g=e.rs??t.getNodeAttribute(`radius`).getMultiple(l),_=t.getEdges()._indexes,v=t.getEdgeAttribute(`source`).getMultiple(_),y=t.getEdgeAttribute(`target`).getMultiple(_),b=t.getAdjacencyList({internalIndexes:!0,weight:1,indexes:l});return{centerIndex:c,centerIndexPos:0,cx:o,cy:s,D:null,indexes:l,components:f,normIndexes:null,radii:null,rings:null,x:m,y:h,degree:p,size:d,attributes:{size:g,adjacency:b,weights:y.map(()=>1),sources:v,targets:y},sortAttr:null,allowOverlap:!!e.allowOverlap,nodeGap:e.nodeGap,radiusRatio:e.radiusRatio,radiusDelta:e.radiusDelta,repulsion:e.repulsion,randomize:!(`randomize`in e)||!!e.randomize,renderSteps:!!e.renderSteps,epsilon:Q(e.epsilon,.001),maxSteps:Q(e.maxIterations,100),iterationsPerRender:Q(e.iterationsPerRender,20),step:-1,stress:1/0,prevStress:0,converged:!1,overlapRemoved:!1,done:!1}},context(){return{data:null,sim:null,out4:null}},update(e,t){let n=e||t.data;if(n.x=n.x||new Float32Array(n.size),n.y=n.y||new Float32Array(n.size),n.step===-1){t.data=n;for(let e=0;e<n.indexes.length;e++)n.indexes[e]===n.centerIndex&&(n.centerIndexPos=e);let e=[0],r=[];for(let t of n.components){for(let e of t)r.push(e);e.push(r.length)}let i=n.attributes.adjacency,a=[0],s=[],c=[];for(let e of i){for(let t=0;t<e.nodes.length;t++)s.push(e.nodes[t]),c.push(e.weights?Number(e.weights[t]):1);a.push(s.length)}let l=o();t.sim&&=(t.sim.free(),null),t.sim=new l.RadialStressSim(Uint32Array.from(n.indexes),n.centerIndex,Float64Array.from(n.degree),Uint32Array.from(e),Uint32Array.from(r),Uint32Array.from(a),Uint32Array.from(s),Float64Array.from(c),Uint32Array.from(n.attributes.sources),Uint32Array.from(n.attributes.targets),Float64Array.from(n.attributes.size,e=>Number(e)),n.x,n.y,!!n.randomize,n.nodeGap,n.radiusRatio,n.radiusDelta,n.repulsion,n.epsilon,n.maxSteps),t.out4=new Float64Array(4),n.step=0}let r=t.sim;if(!n.converged&&r&&(r.step_batch(n.iterationsPerRender,t.out4),n.step=t.out4[0],n.stress=t.out4[1],n.prevStress=t.out4[2],n.converged=t.out4[3]===1,r.read_positions(n.x,n.y)),n.converged)if(n.overlapRemoved||n.allowOverlap){if(n.done=!0,r){let e=r.rings_keys(),i=r.rings_offsets(),a=r.rings_members(),o={};for(let t=0;t<e.length;t++){let r=[];for(let e=i[t];e<i[t+1];e++)r.push(n.indexes[a[e]]);o[e[t]]=r}n.rings=o,r.free(),t.sim=null}}else r&&(r.remove_overlaps(),r.read_positions(n.x,n.y),n.overlapRemoved=!0);return n},isRunning({data:e}){return!(!e||e.converged&&(e.allowOverlap||e.done))||(e&&(e.step=-1),!1)},onSync(e){if(e.renderSteps||e.done)return $t(e)},onEnd:e=>$t(e)};function tn(e,t){return t&&typeof t==`object`&&t._index!==void 0?t:e.getNode(t)}function nn(e,t,n,r){if(t)return t===`random`?`random`:t===`radius`?r.slice():t===`degree`?n.getDegree():e.getProperty(n,t)}const rn={forceLink:Tt,force:Ct,hierarchical:Wt,sequential:Gt,grid:Yt,radial:en,concentric:{name:`concentric`,configure(e,{graph:t,data:n}){if(e.centralNode===void 0)throw Error(`concentric layout: missing parameter "centralNode"`);let r={...e,centralNode:tn(t,e.centralNode)},{centralNode:i,nodes:a}=r,o=t.getNode(i);if(o===void 0)throw Error(`concentric layout: "centralNode" parameter is not valid`);let s=o._index,{x:c,y:l}=o.getPosition(),u=a.getAttribute(`layoutable`),d=t.getNodes(a)._indexes,f=Array.from(d.filter((e,t)=>u[t]));f.indexOf(s)===-1&&f.push(s);let p=e.rs?e.rs:t.getNodeAttribute(`radius`).getMultiple(d),m=nn(n,r.sortBy,a,p),h=f.reduce((e,t,n)=>(e[t]=n,e),{}),g=f.map((e,t)=>t),_=new Set(e.edges.getExtremities()._indexes),v=f.map(e=>t.topology.getAdjacentElements(!0,new Uint32Array([e])).filter(e=>_.has(e)).map(e=>h[e]));return{sourceNodeIndex:f.indexOf(s),centerX:typeof r.centerX==`number`?r.centerX:c,centerY:typeof r.centerY==`number`?r.centerY:l,list:f,indexes:g,size:f.length,totalSize:f.length,attributes:{adjacentNodes:v,size:p},sortAttr:m,clockwise:r.clockwise===void 0?!0:r.clockwise,circleHopRatio:r.circleHopRatio||5,allowOverlap:!!r.allowOverlap}},context(){return{determinePropertyType(e,t,n){return t.some(t=>typeof e[t]!=`number`)?`string`:`number`}}},update(e,t){let{attributes:n,indexes:r,size:i,sourceNodeIndex:a,centerX:s,centerY:c,sortAttr:l}=e,u=n.adjacentNodes,d=n.size,f=o(),p=new Uint32Array(e.totalSize+1),m=0;for(let t=0;t<e.totalSize;t++)p[t]=m,m+=u[t]?u[t].length:0;p[e.totalSize]=m;let h=new Uint32Array(m),g=0;for(let t=0;t<e.totalSize;t++){let e=u[t];if(e)for(let t=0;t<e.length;t++)h[g++]=e[t]}let _=Uint32Array.from(r),v=f.layout_concentric_distances(p,h,_,i,e.totalSize,a),y={};for(let e=0;e<i;e++){let t=r[e],n=v[t],i=y[n];i||(i=[],y[n]=i),i.push(t)}function b(e,t,n){if(e===`random`)return()=>Math.random()-.5;if(e)return n.determinePropertyType(e,t,t.length)===`number`?(t,n)=>e[t]-e[n]:(t,n)=>e[t]<e[n]?-1:1}let x=b(l,r,t),S=l===`random`||l,C=Object.keys(y).sort((e,t)=>parseInt(e)-parseInt(t)),w=new Uint32Array(C.length+1),T=[],E=[];C.forEach((t,n)=>{let r=y[parseInt(t)];for(let e of r)E.push(e);S&&(r.sort(x),e.clockwise||r.reverse());for(let e of r)T.push(e);w[n+1]=T.length});let D=Array(e.totalSize),O=Array(e.totalSize),k=0;for(let e=0;e<i;e++){let t=d[r[e]];t>k&&(k=t)}let A=k*e.circleHopRatio,j=0,M=0,N=Math.PI/9;return C.forEach((t,n)=>{let r=y[parseInt(t)],i=r.length,a=0,o=M,l=2*Math.PI/i;if(n!==0&&!e.allowOverlap){let e=2*Math.PI*j,t=E.slice(w[n],w[n+1]);a+=t.reduce((e,t)=>e+d[t],0);let r=2*a*Math.SQRT2;r>e&&(j+=r/(2*Math.PI)-j)}for(let t=0;t<i;t++){let n=r[t];D[n]=Math.cos(o)*j+s,O[n]=Math.sin(o)*j+c;let u=d[n];o+=l*(e.allowOverlap?1:u/a*i)}j+=A,M+=N}),{x:D,y:O,indexes:e.list}},isRunning(){return!1},onSync({indexes:e,x:t,y:n}){return{indexes:e,x:t,y:n}}}};let an=null;function on(e){return an||=import(`./nodus_wasm-DxYJZXfN.js`).then(e=>{s(e)}).catch(()=>{an=null}),an.then(()=>{r(e)})}const sn=()=>{},cn=()=>!1,$=new Map;function ln(e,t,n){self.postMessage({type:n?`update`:`complete`,workerId:e.workerId,workerMessage:t,isRunning:n})}function un(e,t){if(e.stopped)return;let n,r=!1;try{n=e.update(t,e.context),r=!!e.isRunning(e.context,t)}catch(t){self.postMessage({type:`error`,workerId:e.workerId,error:t?.message??String(t)}),$.delete(e.workerId);return}if(ln(e,n,r),!r){$.delete(e.workerId);return}setTimeout(()=>un(e,void 0),0)}self.addEventListener(`error`,e=>{self.postMessage({type:`error`,workerId:-1,error:`worker uncaught: ${e?.message||String(e)}`})}),self.addEventListener(`message`,e=>{let t=e.data;if(!(!t||!t.type)){if(t.type===`init`){let e=rn[t.name];if(!e){self.postMessage({type:`error`,workerId:t.workerId,error:`unknown layout: ${t.name}`});return}let n={workerId:t.workerId,descriptor:e,context:e.context?e.context():{},stopped:!1,update:typeof e.update==`function`?e.update:sn,isRunning:typeof e.isRunning==`function`?e.isRunning:cn,stop:typeof e.stop==`function`?e.stop:sn};$.set(t.workerId,n),t.wasmFlags?on(t.wasmFlags).then(()=>{n.stopped||un(n,t.msg)}):un(n,t.msg)}else if(t.type===`stop`){let e=$.get(t.workerId);if(e){e.stopped=!0;try{e.stop(e.context)}catch{}self.postMessage({type:`complete`,workerId:e.workerId,workerMessage:void 0,isRunning:!1}),$.delete(e.workerId)}}}});
|
|
285
|
+
precision highp float;precision highp int;vec2 s(vec2 s,vec2 e){return vec2(s.x*e.x-s.y*e.y,s.x*e.y+s.y*e.x);}vec2 s(vec2 s){return s.y=-s.y,s;}vec2 s(vec2 t[8],vec2 c,vec2 a){vec2 i,o=a-c,e=vec2(1,0);for(int c;c<8;++c)i+=s(t[c],e),e=s(e,o);return i;}vec2 s(vec2 e,vec4 s){return(e-s.xy)/s.zw;}uniform float m_14,m_15,m_16,m_17,m_18,m_19,m_11,m_12,m_13;uniform highp sampler2D m_6;uniform highp usampler2D m_1a,m_1b;uniform highp sampler2D m_1c,m_1d,m_8;uniform highp usampler2D m_0,m_9;uniform highp sampler2D m_1u,m_1v;flat in uvec4 m_25,m_2b,m_2c,m_2d,m_2e,m_21,m_1x,m_1w,m_27;flat in uint m_1y,m_22,m_26;out vec4 outColor;void main(){uvec2 c=uvec2(gl_FragCoord.xy)-m_25.xy;if(m_25.z*c.y+c.x>=m_1y)return;vec3 a=texelFetch(m_1c,ivec2(m_2b.xy+c),0).xyz;vec4 l=texelFetch(m_6,ivec2(m_25.xy+c),0);vec2 i=l.xy,e=l.zw;if(a.z>0.){outColor=vec4(i,e);return;}ivec4 t=ivec4(texelFetch(m_1a,ivec2(m_2d.xy+c),0));vec4 o=texelFetch(m_8,ivec2(m_21.xy),0);float r=float(1u<<m_22-1u);ivec2 u=ivec2(r*s(i,o));vec2 v=(vec2(u)+.5)/r;ivec2 p=u-ivec2(1);for(int s;s<9;++s){ivec2 t=p+ivec2(s%3,s/3);if(t>>m_22-1u!=ivec2(0))continue;uvec2 c=texelFetch(m_9,ivec2(m_1w.xy)+t,0).xy;for(uint s=c.x;s<c.y;s++){uint l=texelFetch(m_0,ivec2(m_1x.xy)+ivec2(s%m_1x.z,s/m_1x.z),0).x;ivec2 o=ivec2(l%m_25.z,l/m_25.z);vec2 t=texelFetch(m_6,ivec2(m_25.xy)+o,0).xy-i;float u=dot(t,t)+1e-4;if(m_18>0.&&m_11<.5){float i=texelFetch(m_1c,ivec2(m_2b.xy)+o,0).y,s=max(a.y+i+m_19,.01);if(u<s*s){float c=sqrt(u);e-=(s-c)*m_18*i/s*t/c;}}float r=texelFetch(m_1c,ivec2(m_2b.xy)+o,0).x;e-=m_11*m_14*r*t/u;}}if(m_22>2u){vec2 t[8];ivec2 c=ivec2(m_27.xy)+u;vec4 a=texelFetch(m_1u,c,0),l=texelFetch(m_1v,c,0);if(t[0]=a.xy,t[1]=a.zw,t[2]=l.xy,t[3]=l.zw,m_26>4u){vec4 s=texelFetch(m_1u,c,0);t[4]=s.xy,t[5]=s.zw;}if(m_26>6u){vec4 s=texelFetch(m_1v,c,0);t[6]=s.xy,t[7]=s.zw;}vec2 r=s(s(t,v,s(i,o))/o.z);e+=m_11*m_14*r;}ivec2 n;for(int c;c<t.z;c++){n=ivec2(texelFetch(m_1b,ivec2(m_2c.xy)+t.xy,0).xy);float o=texelFetch(m_1d,ivec2(m_2e.xy)+t.xy,0).x;vec2 s=texelFetch(m_6,ivec2(m_25.xy)+n,0).xy-i;if(s*=1.-m_17/(length(s)+1e-4),e+=m_11*m_16*o*s/a.x,t.x+=1,t.x>=int(m_2c.z))t.x=0,t.y+=1;}e=m_12*(e-m_11*m_15*i);float x=dot(e,e);if(x>m_13)e*=sqrt(m_13/x);outColor=vec4(i+e,e);}`,outputs:1};function J(e){return[e.x,e.y,e.w,e.h]}function Y(e,t){return new Uint32Array(e.map(t).map(J).flat())}function X(e,t,n,r,i,a=1){let o=e.getAttribLocation(t,n);o!==-1&&(e.enableVertexAttribArray(o),Ae(e,r),e.vertexAttribIPointer(o,i,e.UNSIGNED_INT,0,0),e.vertexAttribDivisor(o,a))}function Z(e,t){let n=e.getAttribLocation(t,`position`);e.enableVertexAttribArray(n),Ae(e,Ce),e.vertexAttribPointer(n,2,e.FLOAT,!1,0,0)}function nt(e,t){let n=R(e,Je.vert,Je.frag),r=t.texture.points(),i=z(e,{size:r.size,data:new Float32Array(r.data?r.data.buffer.slice(0):new ArrayBuffer(0)),type:e.FLOAT,format:e.RGBA,internalFormat:e.RGBA32F}),a=z(e,{size:r.size,data:new Float32Array(r.data?r.data.buffer.slice(0):new ArrayBuffer(0)),type:e.FLOAT,format:e.RGBA,internalFormat:e.RGBA32F}),o=V(i,a),s=B(e,a.handle),c=B(e,i.handle),l=V(s,c),u=W(e,n,{m_1j:r.size,m_8:i.handle,m_1k:0}),d=t.items.map(({N:e})=>Fe(e)),f=d.reduce((e,t)=>Math.max(e,t),0),p=e.createVertexArray();if(!p)throw Error(`Cannot create VAO`);e.bindVertexArray(p),Z(e,n),X(e,n,`m_1l`,Y(t.items,e=>e.pointsSlot),4),X(e,n,`m_4`,new Uint32Array(t.items.map(e=>e.N)),1),X(e,n,`m_1m`,new Uint32Array(d),1);let m=i;return{step:()=>{e.viewport(0,0,r.size[0],r.size[1]),e.useProgram(n),e.bindVertexArray(p);for(let n=0;n<f;n++){e.bindFramebuffer(e.FRAMEBUFFER,l()[0]);let[r,i]=o();m=i,G(e,u,{m_m:t.texture.points().handle,m_1j:t.texture.points().size,m_8:r.handle,m_1k:n}),e.drawArraysInstanced(e.TRIANGLES,0,6,t.items.length)}},outputs:{items:t.items.map(e=>({spatialBoundariesSlot:{x:e.pointsSlot.x,y:e.pointsSlot.y,w:1,h:1}})),texture:{spatialBoundaries:()=>m}},destroy:()=>{e.deleteFramebuffer(c),e.deleteFramebuffer(s),e.deleteTexture(i.handle),e.deleteTexture(a.handle),e.deleteVertexArray(p)}}}function rt(e,t){let n=R(e,Ye.vert,Ye.frag),r=t.items.map(({N:e})=>{let[t,n]=Re(Ie(e));return{x:0,y:0,w:t,h:n}}),i=H(r.slice()),a=new Uint32Array(2*i.w*i.h);r.forEach(e=>{for(let t=0;t<e.w*e.h;t++){let n=2*U(t,i.w,e);a[n]=t,a[n+1]=4294967295}});let o=z(e,{size:[i.w,i.h],data:a,type:e.UNSIGNED_INT,format:e.RG_INTEGER,internalFormat:e.RG32UI}),s=B(e,o.handle),c=W(e,n,{m_m:t.texture.points().handle,m_8:t.texture.spatialBoundaries().handle,m_n:o.size}),l=e.createVertexArray();if(!l)throw Error(`Cannot create VAO`);return e.bindVertexArray(l),Z(e,n),X(e,n,`m_o`,new Uint32Array(r.map(J).flat()),4),X(e,n,`m_p`,Y(t.items,e=>e.particlesPositionsSlot),4),X(e,n,`m_f`,Y(t.items,e=>e.spatialBoundariesSlot),4),X(e,n,`m_4`,new Uint32Array(t.items.map(e=>e.N)),1),X(e,n,`m_g`,new Uint32Array(t.items.map(e=>e.depth)),1),{step:()=>{e.viewport(0,0,o.size[0],o.size[1]),e.useProgram(n),e.bindVertexArray(l),e.bindFramebuffer(e.FRAMEBUFFER,s),G(e,c,{m_m:t.texture.points().handle,m_8:t.texture.spatialBoundaries().handle}),e.drawArraysInstanced(e.TRIANGLES,0,6,r.length)},outputs:{items:t.items.map((e,t)=>({N:e.N,spatialKeysSlot:r[t]})),texture:{spatialKeys:()=>o}},destroy:()=>{e.deleteFramebuffer(s),e.deleteTexture(o.handle),e.deleteVertexArray(l)}}}function it(e,t){let n=R(e,Xe.vert,Xe.frag),r=t.texture.spatialKeys(),i=Ge(e,r.size),a=V(i,r),o=B(e,r.handle),s=B(e,i.handle),c=V(o,s),l=W(e,n,{m_1n:0,m_1o:0,m_1p:r.handle,m_1q:r.size}),u=t.items.map(({N:e})=>Le(e)).reduce((e,t)=>Math.max(e,t),0),d=e.createVertexArray();if(!d)throw Error(`Cannot create VAO`);e.bindVertexArray(d),Z(e,n),X(e,n,`m_1r`,Y(t.items,e=>e.spatialKeysSlot),4),X(e,n,`m_4`,new Uint32Array(t.items.map(e=>e.N)),1);let f=0,p=0,m=r;return{step:(r=ze(u))=>{e.useProgram(n),e.bindVertexArray(d),e.viewport(0,0,i.size[0],i.size[1]);let o=t.texture.spatialKeys();m!==o&&(c(),a(),m=o);for(let n=0;n<r;n++){e.bindFramebuffer(e.FRAMEBUFFER,c()[0]);let[n,r]=a();m=r,G(e,l,{m_1n:f,m_1o:p,m_1p:n.handle}),e.drawArraysInstanced(e.TRIANGLES,0,6,t.items.length),p=(p+1)%(f+1),p===0&&(f=(f+1)%u)}},outputs:{items:t.items,texture:{spatialKeys:()=>m}},destroy:()=>{e.deleteFramebuffer(o),e.deleteFramebuffer(s),e.deleteTexture(i.handle),e.deleteVertexArray(d)}}}function at(e,t){let n=R(e,Ze.vert,Ze.frag),r=e.getUniformLocation(n,`m_1n`),i=e.getUniformLocation(n,`m_1o`),a=e.getUniformLocation(n,`m_1p`),o=e.getUniformLocation(n,`m_1s`),s=e.getUniformLocation(n,`m_1q`),c=t.texture.spatialKeys(),l=Ge(e,c.size),u=Ke(e,c.size),d=Ke(e,c.size),f=V(q(e,c,d),q(e,c,u)),p=V(q(e,l,d),q(e,l,u)),m=t.items.map(({N:e})=>Le(Ie(e))).reduce((e,t)=>Math.max(e,t),0),h=e.createVertexArray();if(!h)throw Error(`Cannot create VAO`);return e.bindVertexArray(h),Z(e,n),X(e,n,`m_1r`,Y(t.items,e=>e.spatialKeysSlot),4),X(e,n,`m_4`,new Uint32Array(t.items.map(e=>e.N)),1),{step:()=>{e.bindVertexArray(h),e.viewport(0,0,c.size[0],c.size[1]),e.useProgram(n),e.uniform2ui(s,c.size[0],c.size[1]),e.uniform1i(a,0),e.uniform1i(o,1);for(let n=0;n<m;n++){e.activeTexture(e.TEXTURE0);let a=n&1?l:c;e.bindTexture(e.TEXTURE_2D,a.handle),e.uniform1ui(r,n);for(let r=0;r<=n;r++){let[a,o]=n&1?f():p();e.bindFramebuffer(e.FRAMEBUFFER,a.handle),e.activeTexture(e.TEXTURE1),e.bindTexture(e.TEXTURE_2D,o.ca1.handle),e.uniform1ui(i,r),n===r?e.drawBuffers([e.COLOR_ATTACHMENT0,e.NONE]):r<2&&e.drawBuffers([e.NONE,e.COLOR_ATTACHMENT1]),e.drawArraysInstanced(e.TRIANGLES,0,6,t.items.length)}}},outputs:{items:t.items,texture:{spatialKeys:()=>m-1&1?c:l}},destroy:()=>{e.deleteTexture(l.handle),e.deleteTexture(u.handle),e.deleteTexture(d.handle)}}}function ot(e,t){let n=R(e,Qe.vert,Qe.frag),r=t.items.map(({depth:e})=>{let t=1<<e-1;return{x:0,y:0,w:t,h:t}}),i=H(r.slice()),a=z(e,{size:[i.w,i.h],data:new Uint32Array(2*i.w*i.h),type:e.UNSIGNED_INT,format:e.RG_INTEGER,internalFormat:e.RG32UI}),o=B(e,a.handle),s=W(e,n,{m_0:t.texture.spatialKeys().handle,m_1:a.size}),c=e.createVertexArray();if(!c)throw Error(`Cannot create VAO`);return e.bindVertexArray(c),Z(e,n),X(e,n,`m_2`,new Uint32Array(r.map(J).flat()),4),X(e,n,`m_3`,Y(t.items,e=>e.spatialKeysSlot),4),X(e,n,`m_4`,new Uint32Array(t.items.map(e=>e.N)),1),{step:()=>{e.viewport(0,0,a.size[0],a.size[1]),e.useProgram(n),e.bindVertexArray(c),e.bindFramebuffer(e.FRAMEBUFFER,o),G(e,s,{m_0:t.texture.spatialKeys().handle}),e.drawArraysInstanced(e.TRIANGLES,0,6,t.items.length)},outputs:{items:t.items.map((e,t)=>({...e,gridCellsSlot:r[t]})),texture:{spatialBoundaries:t.texture.spatialBoundaries,spatialKeys:t.texture.spatialKeys,gridCells:()=>a}},destroy:()=>{e.deleteFramebuffer(o),e.deleteTexture(a.handle),e.deleteVertexArray(c)}}}function st(e,t){let n=R(e,$e.vert,$e.frag),r=Math.max(...t.items.map(e=>e.depth)),i=[];t.items.forEach(({order:e,depth:t})=>{let n={};for(let e=r-1;e>=2;e--)n[e]=e>=t?K():{x:0,y:0,w:1<<e,h:1<<e};i.push({order:e,depth:t,multipolesSlot:n})});let a=[];for(let t=r;t>=2;t--){a[t]=[];let{w:n,h:r}=H(i.map(e=>e.multipolesSlot[t]||K()));for(let i=0;i<4;i++)a[t][i]=z(e,{size:[n,r],data:new Float32Array(4*n*r),type:e.FLOAT,format:e.RGBA,internalFormat:e.RGBA32F})}let o=[];a.forEach((t,n)=>{if(!t)return;let r=e.createFramebuffer();if(!r)throw Error(`Cannot create FBO`);e.bindFramebuffer(e.FRAMEBUFFER,r),t.forEach((t,n)=>{e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0+n,e.TEXTURE_2D,t.handle,0)}),e.drawBuffers([e.COLOR_ATTACHMENT0,e.COLOR_ATTACHMENT1,e.COLOR_ATTACHMENT2,e.COLOR_ATTACHMENT3]),e.checkFramebufferStatus(e.FRAMEBUFFER)!==e.FRAMEBUFFER_COMPLETE&&console.error(`FBO incomplete for level ${n}`),o[n]=r});let s=t.texture.particlesPositions?t.texture.particlesPositions():t.texture.points?.(),c=t.texture.particlesCharges?t.texture.particlesCharges():null,l=W(e,n,{m_5:r-1,m_6:s?.handle??null,m_7:c?.handle??null,m_8:t.texture.spatialBoundaries().handle,m_0:t.texture.spatialKeys().handle,m_9:t.texture.gridCells().handle,m_a:null,m_b:[0,0]}),u=[];for(let a=r-1;a>=2;a--){let r=e.createVertexArray();if(!r)throw Error(`Cannot create VAO`);u[a]=r,e.bindVertexArray(r),Z(e,n),X(e,n,`m_c`,new Uint32Array(i.map(e=>e.multipolesSlot[a]).map(J).flat()),4),X(e,n,`m_d`,new Uint32Array(i.map(e=>a>=e.depth-1?K():e.multipolesSlot[a+1]).map(J).flat()),4),X(e,n,`m_e`,Y(t.items,e=>e.particlesPositionsSlot),4),X(e,n,`m_f`,Y(t.items,e=>e.spatialBoundariesSlot),4),X(e,n,`m_3`,Y(t.items,e=>e.spatialKeysSlot),4),X(e,n,`m_2`,Y(t.items,e=>e.gridCellsSlot),4),X(e,n,`m_g`,new Uint32Array(t.items.map(e=>e.depth)),1),X(e,n,`m_h`,new Uint32Array(i.map(e=>e.order)),1)}return{step:()=>{e.useProgram(n);for(let n=r-1;n>=2;n--){e.bindVertexArray(u[n]);let r=a[n+1]||[],i=a[n][0].size;e.viewport(0,0,i[0],i[1]),e.bindFramebuffer(e.FRAMEBUFFER,o[n]);let s=t.texture.particlesPositions?t.texture.particlesPositions():t.texture.points?.(),c=t.texture.particlesCharges?t.texture.particlesCharges():null;G(e,l,{m_6:s?.handle??null,m_7:c?.handle??null,m_8:t.texture.spatialBoundaries().handle,m_0:t.texture.spatialKeys().handle,m_9:t.texture.gridCells().handle,m_5:n,m_i:r[0]?.handle,m_j:r[1]?.handle,m_k:r[2]?.handle,m_l:r[3]?.handle,m_b:i}),e.drawArraysInstanced(e.TRIANGLES,0,6,t.items.length)}},outputs:{items:i,texture:{multipoles:(e,t)=>a[e]&&a[e][t]}},destroy:()=>{o.forEach(t=>t&&e.deleteFramebuffer(t)),a.forEach(t=>t&&t.forEach(t=>e.deleteTexture(t.handle))),u.forEach(t=>t&&e.deleteVertexArray(t))}}}function ct(e,t){let n=R(e,et.vert,et.frag),r=Math.max(...t.items.map(e=>e.depth)),i=[];t.items.forEach(e=>{let t={};for(let n=r-1;n>=2;n--)t[n]=e.multipolesSlot[n];i.push({...e,localExpansionsSlot:t})});let a=[];for(let n=r-1;n>=1;n--){a[n]=[];let[r,i]=(n===1?{size:[1,1]}:t.texture.multipoles(n,0)||{size:[1,1]}).size;for(let t=0;t<4;t++)a[n][t]=z(e,{size:[r,i],data:new Float32Array(4*r*i),type:e.FLOAT,format:e.RGBA,internalFormat:e.RGBA32F})}let o=[];a.forEach((t,n)=>{if(!t)return;let r=e.createFramebuffer();if(!r)throw Error(`Cannot create FBO`);e.bindFramebuffer(e.FRAMEBUFFER,r),t.forEach((t,n)=>{e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0+n,e.TEXTURE_2D,t.handle,0)}),e.drawBuffers([e.COLOR_ATTACHMENT0,e.COLOR_ATTACHMENT1,e.COLOR_ATTACHMENT2,e.COLOR_ATTACHMENT3]),e.checkFramebufferStatus(e.FRAMEBUFFER)!==e.FRAMEBUFFER_COMPLETE&&console.error(`FBO incomplete for level ${n}`),o[n]=r});let s=W(e,n,{m_5:2,m_q:[0,0]}),c=[];for(let a=r-1;a>=2;a--){let r=e.createVertexArray();if(!r)throw Error(`Cannot create VAO`);c[a]=r,e.bindVertexArray(r),Z(e,n),X(e,n,`m_r`,new Uint32Array(i.map(e=>e.localExpansionsSlot[a]).map(J).flat()),4),X(e,n,`m_s`,new Uint32Array(i.map(e=>a>=3?e.localExpansionsSlot[a-1]:K()).map(J).flat()),4),X(e,n,`m_h`,new Uint32Array(t.items.map(e=>e.order)),1)}return{step:()=>{e.useProgram(n);for(let n=2;n<r;n++){e.bindVertexArray(c[n]);let r=a[n-1]||[],i=a[n];e.viewport(0,0,i[0].size[0],i[0].size[1]),e.bindFramebuffer(e.FRAMEBUFFER,o[n]),G(e,s,{m_5:n,m_t:t.texture.multipoles(n,0)?.handle,m_u:t.texture.multipoles(n,1)?.handle,m_v:t.texture.multipoles(n,2)?.handle,m_w:t.texture.multipoles(n,3)?.handle,m_x:r[0]?.handle,m_y:r[1]?.handle,m_z:r[2]?.handle,m_10:r[3]?.handle,m_q:i[0].size}),e.drawArraysInstanced(e.TRIANGLES,0,6,t.items.length)}},outputs:{items:i,texture:{localExpansions:(e,t)=>a[e]&&a[e][t]}},destroy:()=>{o.forEach(t=>t&&e.deleteFramebuffer(t)),a.forEach(t=>t&&t.forEach(t=>e.deleteTexture(t.handle))),c.forEach(t=>t&&e.deleteVertexArray(t))}}}function lt(e,t,n){let r=R(e,tt.vert,tt.frag),i=t.texture.particlesPositions(),a=z(e,{type:e.FLOAT,size:i.size,data:new Float32Array(i.data?i.data.buffer.slice(0):new ArrayBuffer(0)),format:e.RGBA,internalFormat:e.RGBA32F}),o=V(i,a),s=B(e,a.handle),c=B(e,i.handle),l=V(s,c),u=W(e,r,{m_11:1,m_12:n.inertia,m_13:n.maxDisplacement**2,m_14:n.charge,m_15:n.gravity,m_16:n.edgeStrength,m_17:n.edgeLength,m_18:n.elasticity,m_19:n.margin,m_6:i.handle,m_1a:t.texture.adjacencyOffsets().handle,m_1b:t.texture.adjacencyLists().handle,m_1c:t.texture.nodesExtraProperties().handle,m_1d:t.texture.stiffness().handle,m_5:2,m_8:t.texture.spatialBoundaries().handle,m_0:t.texture.spatialKeys().handle,m_9:t.texture.gridCells().handle,m_1t:null,m_1e:i.size}),d=i,f={},p=new Set;return t.items.forEach(e=>p.add(e.depth-1)),p.forEach(n=>{let i=e.createVertexArray();if(!i)throw Error(`Cannot create VAO`);f[n]=i,e.bindVertexArray(i),Z(e,r),X(e,r,`m_e`,Y(t.items,e=>e.particlesPositionsSlot),4),X(e,r,`m_1f`,Y(t.items,e=>e.nodesExtraPropertiesSlot),4),X(e,r,`m_1g`,Y(t.items,e=>e.adjacencyListsSlot),4),X(e,r,`m_1h`,Y(t.items,e=>e.adjacencyOffsetsSlot),4),X(e,r,`m_1i`,Y(t.items,e=>e.stiffnessSlot),4),X(e,r,`m_f`,Y(t.items,e=>e.spatialBoundariesSlot),4),X(e,r,`m_3`,Y(t.items,e=>e.spatialKeysSlot),4),X(e,r,`m_2`,Y(t.items,e=>e.gridCellsSlot),4),X(e,r,`m_r`,new Uint32Array(t.items.map(e=>e.localExpansionsSlot&&e.localExpansionsSlot[n]||K()).map(J).flat()),4),X(e,r,`m_4`,new Uint32Array(t.items.map(e=>e.N)),1),X(e,r,`m_g`,new Uint32Array(t.items.map(e=>e.depth)),1),X(e,r,`m_h`,new Uint32Array(t.items.map(e=>e.order)),1)}),{step:(n=1)=>{e.viewport(0,0,i.size[0],i.size[1]),e.useProgram(r),e.bindFramebuffer(e.FRAMEBUFFER,l()[0]);let[a,s]=o();d=s,p.forEach(r=>{e.bindVertexArray(f[r]),G(e,u,{m_11:n,m_6:a.handle,m_8:t.texture.spatialBoundaries().handle,m_0:t.texture.spatialKeys().handle,m_5:r,m_1u:t.texture.localExpansions(r,0)?.handle,m_1v:t.texture.localExpansions(r,1)?.handle,m_1a:t.texture.adjacencyOffsets().handle,m_1b:t.texture.adjacencyLists().handle,m_1c:t.texture.nodesExtraProperties().handle,m_1d:t.texture.stiffness().handle,m_9:t.texture.gridCells().handle}),e.drawArraysInstanced(e.TRIANGLES,0,6,t.items.length)})},outputs:{items:t.items.map(e=>({N:e.N,pointsSlot:e.particlesPositionsSlot})),texture:{points:()=>d}},destroy:()=>{e.deleteFramebuffer(s),e.deleteFramebuffer(c),e.deleteTexture(a.handle),Object.values(f).forEach(t=>e.deleteVertexArray(t))}}}function ut(e,t,n){let{steps:r,batch:i,sortingMethod:a}=n,o=n.order??4,s=t.texture.particlesPositions(),c={items:t.items.map(({N:e,particlesPositionsSlot:t})=>({N:e,pointsSlot:t})),texture:{points:()=>s}},l=nt(e,c),u=rt(e,{items:t.items.map((e,t)=>({...e,depth:Math.max(1,n.depth??Ve(e.N)),...c.items[t],...l.outputs.items[t]})),texture:{...c.texture,...l.outputs.texture}}),d=(a===`ibr`?at:it)(e,u.outputs),f=ot(e,{items:t.items.map((e,t)=>({...e,depth:Math.max(1,n.depth??Ve(e.N)),order:o,...l.outputs.items[t],...d.outputs.items[t]})),texture:{...l.outputs.texture,...d.outputs.texture}}),p=st(e,{items:t.items.map((e,t)=>({order:o,...e,...f.outputs.items[t]})),texture:{particlesPositions:()=>s,particlesCharges:t.texture.particlesCharges,...f.outputs.texture}}),m=ct(e,{items:p.outputs.items,texture:{...p.outputs.texture}}),h={charge:n.charge,gravity:n.gravity,inertia:n.inertia,edgeStrength:n.edgeStrength,edgeLength:n.edgeLength,elasticity:n.elasticity,margin:n.margin,maxDisplacement:n.maxDisplacement},g=lt(e,{items:t.items.map((e,t)=>({...e,...f.outputs.items[t],...p.outputs.items[t],...m.outputs.items[t]})),texture:{...t.texture,...f.outputs.texture,...m.outputs.texture}},h),_=t.items.reduce((e,{N:t})=>Math.max(e,t),0);return{...qe(i??He(_),e=>(s=g.outputs.texture.points(),l.step(),u.step(),d.step(),f.step(),p.step(),m.step(),g.step(Ue(e,r)),e<r)),destroy:()=>{l.destroy(),u.destroy(),d.destroy(),f.destroy(),p.destroy(),m.destroy(),g.destroy()}}}const dt=(e,t)=>.003*e**2+(t+1);function ft(e){let t=new Uint32Array(e.nodes.length);for(let n of e.edges)t[n.source]!==void 0&&t[n.source]++,t[n.target]!==void 0&&t[n.target]++;return t}function pt(e){let t=new Map,n={nodes:[],edges:[]};return e.nodes.forEach((e,r)=>{t.has(e.id)&&console.warn(`Duplicated ID ${e.id}@${r}`),n.nodes.push({...e,id:r}),t.set(e.id,r)}),e.edges.forEach(e=>{let r=t.get(e.source),i=t.get(e.target);if(r===void 0){console.warn(`Missing source ${e.source}`);return}if(i===void 0){console.warn(`Missing target ${e.target}`);return}n.edges.push({...e,source:Math.min(r,i),target:Math.max(r,i)})}),n.edges.sort((e,t)=>e.source-t.source||e.target-t.target),n}function mt(e,[t,n]=[0,0],r=.001){let i=Math.PI*(3-Math.sqrt(5)),a=e.nodes.map(e=>(e.x=(e.x||0)-t,e.y=(e.y||0)-n,e)).map(e=>({n:e,key:e.pinned?0:.5+Math.floor(e.x/r)+Math.floor(e.y/r)/r})).sort((e,t)=>e.key-t.key),o=0;return a.forEach(({n:e,key:t},n)=>{if(t*n===0||t!==a[n-1].key){o=n;return}let r=Math.sqrt(n-o);e.x=a[o].n.x+r*Math.cos(i*(n-o)),e.y=a[o].n.y+r*Math.sin(i*(n-o))}),e}function ht(e){let t=ft(e);return{nodes:e.nodes.map((e,n)=>{let r=(e.mass??1)*dt(e.r||1,t[n]);return r=Math.max(r,.001),{...e,mass:r}}),edges:e.edges.map(e=>{let n=e.weight||1,r=t[e.source]+1,i=t[e.target]+1,a=i*r*n/Math.min(r,i)/(r+i);return{...e,stiffness:a}})}}function gt(e,t){return ht(mt(pt(e),t))}function _t(e,t){let n={};return t.forEach((e,t)=>{(n[e]??(n[e]=new Set)).add(t)}),Object.values(n).map(t=>({nodes:[...t].map(t=>e.nodes[t]),edges:e.edges.filter(({source:e,target:n})=>t.has(e)&&t.has(n))}))}function vt(e,t,n={}){t.getExtension(`EXT_color_buffer_float`)||t.getExtension(`WEBGL_lose_context`)?.loseContext();let r=new xe({...Se,...n}),i=e.nodes.length,a=n.cx??e.nodes.reduce((e,t)=>e+(t.x||0),0)/Math.max(1,i),o=n.cy??e.nodes.reduce((e,t)=>e+(t.y||0),0)/Math.max(1,i),s=[a,o],c=Array.from({length:i},(e,t)=>t),l,u,d=e=>{if(!l)throw Error(`No graph has been set`);let[n,r]=l.texture.particlesPositions().size;if(n*r<=1)return{X:[0],Y:[0]};let i=[],s=[],u=0,d=new Float32Array(4*n*r);return t.readPixels(0,0,n,r,t.RGBA,t.FLOAT,d),l.items.forEach(({N:e,particlesPositionsSlot:t})=>{let{x:r,y:l,w:f}=t;for(let t=0;t<e;t++){let e=r+t%f,p=4*((l+Math.floor(t/f))*n+e);i[c[u+t]]=d[p]+a,s[c[u+t]]=d[p+1]+o}u+=e}),e&&(f(),p()),{X:i,Y:s}},f=()=>{u&&=(u.stop(),u.destroy(),void 0)},p=()=>{l&&=(Pe(t,l),void 0)},m=e=>{let r;if(n.groups){let t={};Object.entries(n.groups).forEach(([e,n])=>n.forEach(n=>{t[n]=Number(e)})),r=_t(pt(e),Object.values(t)),r.map(({nodes:e})=>e).flat().forEach((e,t)=>{c[t]=e.id}),r=r.map(e=>gt(e,s))}else r=[gt(e,s)];return Ne(t,r)},h={setOptions(e={}){return r=new xe({...Se,...e}),l&&(f(),u=ut(t,l,r)),h},setGraph(e={nodes:[],edges:[]}){return l&&=(Pe(t,l),void 0),l=m(e),r&&(f(),u=ut(t,l,r)),h},start(){if(!u)throw Error(`No graph has been set`);return u.start().finally(()=>n.onEnd?.(1)).catch(e=>{throw Error(`Something went wrong during GPU layout: `+e)}),h},stop(){return u&&u.stop(),h},step(){if(!u)throw Error(`No graph has been set`);return u.step(),h},data:e=>d(e),iterations:()=>1};return l=m(e),u=ut(t,l,r),h}function yt(e={}){let t=e.canvas??document.createElement(`canvas`),n=window.devicePixelRatio||1,r=e.width??window.innerWidth*n,i=e.height??window.innerHeight*n;t.width=Math.ceil(r),t.height=Math.ceil(i),t.style.width=Math.ceil(r/n)+`px`,t.style.height=Math.ceil(i/n)+`px`;let a=t.getContext(`webgl2`,{antialias:!0});if(!a)throw Error(`WebGL 2.0 not supported`);return a}function bt(e,t,n){try{let e=yt(),t=()=>n(Error(`WebGL2 context lost`));return e.canvas.addEventListener(`webglcontextlost`,t),{context:e,cleanUp:()=>{e.canvas.removeEventListener(`webglcontextlost`,t),e.getExtension(`WEBGL_lose_context`)?.loseContext()}}}catch(e){return n(e),null}}const xt=e=>{};function St(e){for(let t in e)typeof e[t]==`function`&&delete e[t];return e}const Ct={name:`force`,imports:{force:he},configure(e,{graph:t,events:n}){let r=e.nodes._indexes,i=e.xs??t.getNodeAttribute(`x`).getMultiple(r),a=e.ys??t.getNodeAttribute(`y`).getMultiple(r),o=e.rs??t.getNodeAttribute(`radius`).getMultiple(r),s=t.getNodeAttribute(`layoutable`).getMultiple(r),c=e.edges,l=[],u=[],d={},f=e.edgeWeight||xt,p=e.nodeMass?t=>e.nodeMass(e.nodes.get(t)):xt;e.edgeStrength===void 0&&(e.edgeStrength=.5),e.gpu&&(e.edgeStrength/=2),e.gravity??=.01,e.siblingsOffset??=0,e.theta??=.62,e.autoStop=!!e.autoStop,e.alignSiblings=!!e.alignSiblings;let m=e.radiusRatio||1.25;for(let e=0;e<r.length;e++){let t=r[e];d[t]=e,l.push({id:e,x:i[e],y:a[e],r:o[e]*m,mass:p(e),pinned:!s[e]})}c.forEach(e=>{let t=d[e.getSource()._index],n=d[e.getTarget()._index];t!==n&&t!==void 0&&n!==void 0&&u.push({source:t,target:n,weight:f(e)})});let h=St({...e});return delete h.nodes,delete h.edges,{graph:{nodes:l,edges:u},options:h,indexes:r,done:!1,x:i,y:a,chunkPeriod:250}},update(e,t){if(!t.simulation&&e){let n;t.done=!1,t.graph=e.graph,t.options=e.options,t.indexes=e.indexes;let r=!1;if(e.options.gpu){let i=bt(`webgl2`,{},n=>{console.warn(`GPU layout: WebGL context not available. Falling back on CPU. ${n||`unknown`}`),t.simulation=void 0,t.options.gpu=!1,t.cleanUp&&t.cleanUp(),Ct._update(e,t)});i&&(n=i.context,t.cleanUp=i.cleanUp),r=!!n}let i=Date.now();r||(e.options.nextTick=e=>Date.now()-i<=t.chunkPeriod?e():(i=Date.now(),setTimeout(e,0))),e.options.update=(e,n,r)=>{t.x=n,t.y=r},e.options.onEnd=()=>{if(r&&n){let{X:e,Y:n}=t.simulation.data(!0);t.x=e,t.y=n}t.done=!0,t.simulation=void 0,t.cleanUp&&t.cleanUp()},e.options.bucketSize=0;let a=r&&n?vt(e.graph,n,e.options).start():he(e.graph,e.options).start();t.simulation=a;let{X:o,Y:s}=r&&n?{X:new Float32Array(e.graph.nodes.length),Y:new Float32Array(e.graph.nodes.length)}:a.data();t.x=o,t.y=s}return{graph:t.graph,indexes:t.indexes,x:t.x,y:t.y}},context(){return{done:!1,graph:{nodes:[],edges:[]},x:null,y:null,indexes:null,chunkPeriod:250}},stop(e){e.done=!0,e.simulation&&(e.simulation.stop(),delete e.simulation)},isRunning(e){return!e.done||(e.done=!1,!1)},onSync({indexes:e,x:t,y:n}){return{indexes:e,x:t,y:n}}};function wt(e,t,n){let r=e.nodes,i=e.edges,a=e.maxSize,o=Object.keys(r),s=Object.keys(i),c=o.length*n.ppn,l=s.length*n.ppe,u={},d=10**(Math.log(Math.max(a,1))-6),f=d/2,p=Math.random,m=t.randomizeFactor||1,h;h=t.randomize===`locally`?e=>e+p()*m:t.randomize===`globally`?e=>p()*m:e=>e+p()*d-f;let g=new Float32Array(c),_=new Float32Array(l),v,y;for(v=0,y=0;v<o.length;v++){let e=o[v],t=r[e],i=t.x,a=t.y;t.pinned||(i=h(i),a=h(a)),u[e]=y,g[y+0]=i,g[y+1]=a,g[y+2]=0,g[y+3]=0,g[y+4]=0,g[y+5]=0,g[y+6]=t.mass,g[y+7]=1,g[y+8]=t.size,g[y+9]=t.pinned||0,y+=n.ppn}for(v=0,y=0;v<s.length;v++){let e=i[s[v]];_[y+0]=u[e.source],_[y+1]=u[e.target],_[y+2]=e.weight||0,y+=n.ppe}return{nodes:g,edges:_}}const Tt={name:`forceLink`,configure(e,{graph:t,camera:n,graphics:r}){let i=e.nodes._indexes,a=e.edges._indexes,o={},s={},c=i.length,l=a.length,u=t.getObjectList(!0),d=t.getObjectList(!1);(e.nodes||e.edges)&&(e={...e},delete e.nodes,delete e.edges);let f=t.getNodeAttribute(`innerStroke.width`).getMultiple(i),p=t.getNodeAttribute(`outerStroke.width`).getMultiple(i),m=t.degrees(i),h=e.xs??t.getNodeAttribute(`x`).getMultiple(i),g=e.ys??t.getNodeAttribute(`y`).getMultiple(i),_=e.rs??t.getNodeAttribute(`radius`).getMultiple(i),v=t.nodeList(i).getAttribute(`layoutable`),y=typeof e.nodeMass==`function`?e.nodeMass:(e,t,n)=>t+1;delete e.nodeMass;let b=typeof e.edgeWeight==`function`?e.edgeWeight:e=>1;delete e.edgeWeight,isFinite(e.scalingRatio)||delete e.scalingRatio;let x=i.reduce((e,t,n)=>(v[n]||(e[t]=!0),e),{}),S=0,C=0,w=0,T=n.getZoom();for(let e=0;e<i.length;e++){let t=i[e],n=h[e],r=g[e],a=_[e]+(f[e]+p[e])/T;o[t]={id:t,x:n,y:r,degree:m[e],size:a,pinned:!!x[t],mass:y(u.get(t),m[e],e)},w=Math.max(a,w)}if(c>1)for(let e=0;e<c;e++){let t=o[i[e]];S+=t.x,C+=t.y}S/=c,C/=c;let E={x:S,y:C},D=t.edgeList(a),O=D.getSource()._indexes,k=D.getTarget()._indexes;for(let e=0;e<l;e++){let t=a[e],n=O[e],r=k[e];o[n]&&o[r]&&(s[t]={source:n,target:r},s[t].weight=b(d.get(t)))}return{nodes:o,edges:s,maxSize:w,config:St(e),barycentre:E}},context(){return{chunkPeriod:250}},update(e,t){let n;if(!t.W&&e){n={ppn:10,ppe:3,ppr:9,MAX_SUBDIVISION_RETRIES:3,maxForce:10,iterations:0,converged:!1,settings:{linLogMode:!1,outboundAttractionDistribution:!1,adjustSizes:!1,edgeWeightInfluence:0,scalingRatio:100,strongGravityMode:!0,gravity:1,slowDown:1,barnesHutOptimize:!1,barnesHutTheta:.5,startingIterations:10,iterationsPerRender:10,maxIterations:1e3,avgDistanceThreshold:.01,autoStop:!0,alignNodeSiblings:!0,nodeSiblingsScale:5,nodeSiblingsAngleMin:0}},t.W=n;let r=wt(e,e.config,n);t.NodeMatrix=r.nodes,t.EdgeMatrix=r.edges,n.nodesLength=r.nodes.length,n.edgesLength=r.edges.length;for(let t in e.config)n.settings[t]=e.config[t];t.nodes=e.nodes,t.edges=e.edges,t.barycentre=e.barycentre}else n=t.W;let r=t.NodeMatrix,i=t.EdgeMatrix;function a(){Et(n,r,i)}function o(e){let t=Object.keys(e),i={};for(let e=0;e<r.length;e+=n.ppn){let a=t[e/n.ppn];i[a]={id:a,x:r[e+0],y:r[e+1],pinned:r[e+9]}}return i}if(n.settings.autoStop){let e=Date.now();for(;!n.converged&&Date.now()-e<t.chunkPeriod;)a()}else{let e=n.iterations===0?n.settings.startingIterations:n.iterations+n.settings.iterationsPerRender;for(;n.iterations!==e;)a()}return{nodes:o(t.nodes),barycentre:t.barycentre}},isRunning(e){return!e.W.settings.autoStop||!e.W.converged||(e.W=void 0,!1)},stop(e){e.W&&(e.W.converged=!0)},onSync({nodes:e,barycentre:t},{graph:n}){let r=Object.keys(e),i=r.length,a=Array(i),o=Array(i),s=Array(i),c=Array(i),l=0,u=0,[d,f]=n.getAttributes(!0,[`x`,`y`]);for(let t=0;t<i;t++){let n=r[t],i=e[n],p=parseInt(n);a[t]=p,c[t]=i.pinned;let m,h;i.pinned?(m=d.get(p),h=f.get(p)):(m=i.x,h=i.y),o[t]=m,s[t]=h,l+=m,u+=h}let p=l/i-t.x,m=u/i-t.y;for(let e=0;e<i;e++)c[e]||(o[e]-=p,s[e]-=m);return{indexes:a,x:o,y:s}}};function Et(e,t,n){let r=e.settings,i=o().force_fa2_pass(t,n,e.ppn,e.ppe,e.nodesLength,e.edgesLength,r.scalingRatio,r.gravity,r.strongGravityMode,r.linLogMode,r.edgeWeightInfluence,r.slowDown,r.barnesHutOptimize);e.iterations++,r.autoStop&&(e.converged=e.iterations>r.maxIterations||i/e.nodesLength<r.avgDistanceThreshold)}function Dt(e,t,n){let r=Array.from({length:e},()=>[]),i=Array.from({length:e},()=>[]);for(let a=0;a<t.length;a++){let o=t[a],s=n[a];o<e&&s<e&&(r[o].push(s),i[s].push(o))}return{out:r,inc:i}}function Ot(e,t,n){let r=new Map;for(let e=0;e<t.length;e++){let i=t[e],a=n[e];r.has(i)||r.set(i,[]),r.has(a)||r.set(a,[]),r.get(i).push(a),r.get(a).push(i)}let i=Array.from(r.keys()),a=[];for(;i.length>0;){let e=i[0],t=new Set([e]),n=[e],o=[e];for(;n.length>0;){let e=n.shift();for(let i of r.get(e))t.has(i)||(t.add(i),o.push(i),n.push(i))}a.push(o);let s=new Set(o);i=i.filter(e=>!s.has(e))}for(let t=0;t<e;t++)r.has(t)||a.push([t]);return a}function kt(e,t,n,r){let i=[];for(let t of e){let e=r(t);if(typeof e==`number`&&!isNaN(e)){if(e<0)throw Error(`Layer must be greater than or equal to 0`);i.push([t,e])}}if(i.length===0)return null;i.sort((e,t)=>e[1]-t[1]);let a=new Set;for(let[e,t]of i)t!==0&&a.add(e);let o=new Set(e),s=new Map;for(let t of e)s.set(t,[]);for(let e=0;e<t.length;e++)o.has(t[e])&&(s.get(t[e])?.push(n[e]),s.get(n[e])?.push(t[e]));if(!i.some(([,e])=>e===0)){i.sort((e,t)=>e[1]-t[1]);let e=new Set,t=[i[0]],n;for(;t.length>0;){let[r,i]=t.shift();if(i===0){n=r;break}e.add(r);for(let n of s.get(r)||[])!a.has(n)&&!e.has(n)&&t.push([n,i-1])}if(n!==void 0)i.push([n,0]);else{let e=i[0][1];for(let t=0;t<i.length;t++)i[t][1]-=e}}let c=i.filter(([,e])=>e===0).map(([e])=>e),l=new Map,u=new Map,d=new Map;for(let e of c)l.set(e,0),u.set(e,[]);{let e=c.slice();for(;e.length>0;){let t=e.shift(),n=l.get(t);for(let r of s.get(t)||[]){let i=l.get(r);i===void 0?(l.set(r,n+1),u.set(r,[t]),e.push(r)):i===n+1&&u.get(r)?.push(t)}}}for(let[e,t]of u.entries())for(let n of t)d.set(n,(d.get(n)||[]).concat(e));let f=()=>{let t=e.filter(e=>l.get(e)===0);l.clear();for(let e of t)l.set(e,0);let n=t.slice();for(;n.length>0;){let e=n.shift(),t=l.get(e);for(let r of d.get(e)||[])l.get(r)===void 0&&(l.set(r,t+1),n.push(r))}};for(let[t,n]of i)if(l.get(t)!==n)if(n===0){let e=u.get(t)||[];u.set(t,[]);for(let n of e)d.set(n,(d.get(n)||[]).filter(e=>e!==t));f()}else{let r=e.map(e=>({id:e,l:l.get(e)})).find(e=>e.l===n-1&&e.id!==t);if(!r)continue;let i=u.get(t)||[];u.set(t,[r.id]);for(let e of i)d.set(e,(d.get(e)||[]).filter(e=>e!==t));d.set(r.id,(d.get(r.id)||[]).concat(t)),f()}let p=[],m=[];for(let[e,t]of u.entries())if(t.length!==0)for(let n of t)p.push(n),m.push(e);return{src:p,tgt:m}}function At(e,t,n){let r=new Set(e),i=new Map,a=new Map;for(let t of e)i.set(t,[]),a.set(t,[]);for(let e=0;e<t.length;e++)r.has(t[e])&&i.get(n[e]).push(t[e]);let o=[];for(let t of e){for(let e of i.get(t))a.get(e).push(t);i.get(t).length===0&&o.push(t)}let s=[],c=new Set,l=o.slice();for(;l.length>0;){let e=l.pop();if(!c.has(e)){c.add(e),s.push(e);for(let t of a.get(e))l.push(t)}}return{order:s,childrenOf:a}}function jt(e,t,n,r){let i=o().hier_remove_cycles(e,Uint32Array.from(t),Uint32Array.from(n),r?Uint32Array.from(r):new Uint32Array,r!==void 0),a=[],s=[];for(let e=0;e<i.length;e+=2)a.push(i[e]),s.push(i[e+1]);return{sources:a,targets:s}}function Mt(e,t,n,r,i,a){let s=o();if(!s||typeof s.hier_reference_layering!=`function`)throw Error(`hierarchical layout requires the wasm backend (hier_reference_layering missing).`);let c=t=>{let n=new Uint32Array(e+1),r=0;for(let i=0;i<e;i++)n[i]=r,r+=t[i].length;n[e]=r;let i=new Uint32Array(r),a=0;for(let n=0;n<e;n++)for(let e=0;e<t[n].length;e++)i[a++]=t[n][e];return[n,i]},[l,u]=c(t),[d,f]=c(n),p=new Float64Array(e).fill(NaN);if(a)for(let t=0;t<e;t++){let e=a[t];typeof e==`number`&&!isNaN(e)&&(p[t]=e)}let m=new Uint8Array(e);for(let e of i)m[e]=1;let h=s.hier_reference_layering(e,l,u,d,f,m,p);return Array.from(h)}function Nt(e,t,n,r){let i=!1;for(let n=0;n<e&&!i;n++)for(let e of t[n])if(r[n]>r[e]){i=!0;break}if(!i)return;let a=Array(e);for(let n=0;n<e;n++)a[n]=t[n].filter(e=>r[n]<=r[e]);for(let n=0;n<e;n++)for(let e of t[n])r[n]>r[e]&&a[e].push(n);for(let r=0;r<e;r++)t[r]=a[r],n[r].length=0;for(let r=0;r<e;r++)for(let e of t[r])n[e].push(r)}function Pt(e,t){let n=0;for(let r=0;r<e;r++)t[r]>n&&(n=t[r]);let r=Array.from({length:n+1},()=>[]);for(let n=0;n<e;n++)r[t[n]].push(n);return r}function Ft(e,t,n,r,i){let a=o();if(!a||typeof a.hier_barycenter_sweep!=`function`)throw Error(`hierarchical layout requires the wasm backend (hier_barycenter_sweep missing).`);let s=r.length,c=new Uint32Array(e.length+1),l=0;for(let t=0;t<e.length;t++)c[t]=l,l+=e[t].length;c[e.length]=l;let u=new Uint32Array(l),d=0;for(let t=0;t<e.length;t++)for(let n=0;n<e[t].length;n++)u[d++]=e[t][n];let f=new Uint32Array(s+1),p=0;for(let e=0;e<s;e++)f[e]=p,p+=t[e].length;f[s]=p;let m=new Uint32Array(p),h=0;for(let e=0;e<s;e++)for(let n=0;n<t[e].length;n++)m[h++]=t[e][n];let g=a.hier_barycenter_sweep(s,u,c,f,m,Int32Array.from(r),i),_=0;for(let t=0;t<e.length;t++)for(let n=0;n<e[t].length;n++)e[t][n]=g[_++]}function It(e,t,n,r,i,a,s){let c=t.length,l=Array(c).fill(0),u=Array(c).fill(0),d=o();if(!d||typeof d.sugiyama_coordinates!=`function`)throw Error(`hierarchical layout requires the wasm backend (sugiyama_coordinates missing).`);let f=new Uint32Array(c+1),p=0,m=[];for(let e=0;e<c;e++)m.push(a[e].filter(t=>s[t]>=s[e]));for(let e=0;e<c;e++)f[e]=p,p+=m[e].length;f[c]=p;let h=new Uint32Array(p),g=0;for(let e=0;e<c;e++)for(let t of m[e])h[g++]=t;let _=new Float64Array(c);for(let e=0;e<c;e++)_[e]=t[e]||5;let v=d.sugiyama_coordinates(c,Int32Array.from(s),_,f,h,n,r);if(v.length===0&&c>1)throw Error(`sugiyama coordinate assignment failed (empty placement group).`);for(let e=0;e<c;e++){let t=v[2*e]??0,n=v[2*e+1]??0;if(i===`BT`)n=-n;else if(i===`LR`){let e=t;t=n,n=-e}else if(i===`RL`){let e=t;t=-n,n=e}l[e]=t,u[e]=n}return{x:l,y:u}}function Lt(e,t,n,r,i,a,s,c,l,u){let d=t.length,f=Array(d).fill(0),p=Array(d).fill(0),m=o();if(!m||typeof m.hier_assign_coordinates!=`function`)throw Error(`hierarchical layout requires the wasm backend (hier_assign_coordinates missing).`);let h=(e,t)=>{let n=new Uint32Array(t+1),r=0;for(let i=0;i<t;i++)n[i]=r,r+=e[i].length;n[t]=r;let i=new Uint32Array(r),a=0;for(let n=0;n<t;n++)for(let t=0;t<e[n].length;t++)i[a++]=e[n][t];return[n,i]},g=new Uint32Array(e.length+1),_=0;for(let t=0;t<e.length;t++)g[t]=_,_+=e[t].length;g[e.length]=_;let v=new Uint32Array(_),y=0;for(let t=0;t<e.length;t++)for(let n=0;n<e[t].length;n++)v[y++]=e[t][n];let b=new Float64Array(d);for(let e=0;e<d;e++)b[e]=t[e]||5;let[x,S]=h(c,d),[C,w]=h(l,d),T=i===`BT`?1:i===`LR`?2:i===`RL`?3:0,E=m.hier_assign_coordinates(d,v,g,b,n,r,T,a,s,x,S,C,w,Int32Array.from(u));for(let e=0;e<d;e++)f[e]=E[e*2],p[e]=E[e*2+1];return{x:f,y:p}}function Rt(e,t,n,r,i,a){let s=o();if(!s||typeof s.hier_pack_units!=`function`)throw Error(`hierarchical layout requires the wasm backend (hier_pack_units missing).`);let c=t.length,l=new Uint32Array(e.length+1),u=0;for(let t=0;t<e.length;t++)l[t]=u,u+=e[t].nodes.length;l[e.length]=u;let d=new Uint32Array(u),f=0;for(let t of e)for(let e of t.nodes)d[f++]=e;let p=new Uint8Array(e.length),m=new Float64Array(e.length),h=new Float64Array(e.length);e.forEach((e,t)=>{e.fake&&(p[t]=1,m[t]=e.fake.w,h[t]=e.fake.h)});let g=new Float64Array(c);for(let e=0;e<c;e++)g[e]=r[e]??5;let _=a===`singleLine`?2:0,v=s.hier_pack_units(d,l,p,m,h,Float64Array.from(t),Float64Array.from(n),g,i,_);for(let e=0;e<c;e++)t[e]=v[e*2],n[e]=v[e*2+1]}function zt(e,t={}){let{direction:n=`TB`,nodeDistance:r=5,levelDistance:i=50,componentDistance:a=25,roots:o=[],sinks:s=[],compactSiblings:c=!1,siblingsDistance:l=10,decross:u=!0,arrangeComponents:d=`fit`,gridDistance:f=50,layer:p}=t,{nodeCount:m,sources:h,targets:g,nodeRadii:_,nodeData:v}=e;if(m===0)return{x:[],y:[]};let y=[],b=[];for(let e=0;e<h.length;e++)h[e]!==g[e]&&(y.push(h[e]),b.push(g[e]));let{sources:x,targets:S}=jt(m,y,b),C=[],w=[];{let e=new Set;for(let t=0;t<x.length;t++){let n=x[t]+`->`+S[t];e.has(n)||(e.add(n),C.push(x[t]),w.push(S[t]))}}let T=Ot(m,C,w),E=Array(m).fill(0),D=Array(m).fill(0),O=t=>{if(e.nodeLayers){let n=e.nodeLayers[t];return typeof n==`number`&&!isNaN(n)?n:void 0}if(v&&p){let e=v[t],n=e?e[p]:void 0;return typeof n==`number`&&!isNaN(n)?n:void 0}};for(let e of T){let t=kt(e,C,w,O),n=t?(()=>{let n=jt(m,t.src,t.tgt,e);return{src:n.sources,tgt:n.targets}})():null,{order:a,childrenOf:d}=At(e,n?n.src:C,n?n.tgt:w),f=new Map;a.forEach((e,t)=>f.set(e,t));let p=a.length,h=[],g=[];for(let e=0;e<p;e++){let t=a[e];for(let n of d.get(t))h.push(e),g.push(f.get(n))}let y=a.map(e=>_[e]||5);v&&a.map(e=>v[e]);let b=o.filter(e=>f.has(e)).map(e=>f.get(e)),x=s.filter(e=>f.has(e)).map(e=>f.get(e)),{out:S,inc:T}=Dt(p,h,g),k=Mt(p,S,T,b,x,a.map(e=>O(e)));Nt(p,S,T,k);let A=Pt(p,k);if(u){let e=0;for(let t of A)t.length>e&&(e=t.length);Ft(A,S,T,k,e<50?100:e<100?10:+(e<1e3))}let j,M;try{let e=It(A,y,r,i,`TB`,S,k);j=e.x,M=e.y}catch{let e=Lt(A,y,r,i,`TB`,c,l,S,T,k);j=e.x,M=e.y}for(let e=0;e<p;e++)E[a[e]]=j[e],D[a[e]]=M[e]}let k=[];if(d===`grid`){let e=[];for(let t of T)t.length===1?e.push(t[0]):k.push({nodes:t,w:0,h:0,x:void 0,y:void 0});if(e.length>0){let t=e.slice().sort((e,t)=>(_[t]??5)-(_[e]??5)),n=Math.sqrt(t.length),r=Math.floor(n),i=Math.ceil(n);r*i<t.length&&(r<i?r++:i++);let a=0;for(let e of t)a=Math.max(a,2*(_[e]??5));let o=Math.max(1,a),s=Math.max(f||0,1),c=o*i+s*(i-1),l=o*r+s*Math.max(r-1,0);t.forEach((e,t)=>{let n=t%i,a=Math.floor(t/i);E[e]=c*n/i,D[e]=l*a/r}),k.push({nodes:t,fake:{w:c,h:l},w:c,h:l,x:void 0,y:void 0})}}else for(let e of T)k.push({nodes:e,w:0,h:0,x:void 0,y:void 0});if(Rt(k.slice(),E,D,_,a,d),n===`BT`)for(let e=0;e<m;e++)D[e]=-D[e];else if(n===`RL`)for(let e=0;e<m;e++){let t=E[e];E[e]=-D[e],D[e]=t}else if(n===`LR`)for(let e=0;e<m;e++){let t=E[e];E[e]=D[e],D[e]=-t}if(m>0){let t=e.initialX,n=e.initialY,r=0,i=0;for(let e=0;e<m;e++)r+=t&&t[e]||0,i+=n&&n[e]||0;r/=m,i/=m;let a=0,o=0,s=0;for(let e of k)for(let t of e.nodes)a+=E[t]||0,o+=D[t]||0,s++;a/=s,o/=s;let c=r-a,l=i-o;for(let e=0;e<m;e++)E[e]=E[e]+c,D[e]=D[e]+l}return{x:E,y:D}}const Bt={direction:`TB`,nodeDistance:5,levelDistance:50,componentDistance:50,siblingsDistance:10,compactSiblings:!1,gapWidth:1,arrangeComponents:`fit`,gridDistance:50,layer:`layer`,siblingIndex:``};function Vt(e){for(let t in e)typeof e[t]==`function`&&delete e[t];return e}function Ht(e,t,n){return t?t instanceof Object&&t._indexes?t:e.getNodes(t):n??e.nodeList()}function Ut(){return{}}const Wt={name:`hierarchical`,configure(e,{graph:t,data:n}){let r={...Bt,...e,nodeList:e.nodes};r.direction=e.direction||Bt.direction,r.layerSeparation=r.levelDistance,r.nodesSeparation=r.nodeDistance,r.componentsSeparation=r.componentDistance,r.gapDistance=r.gapWidth,r.packing=r.arrangeComponents;let i=e.decross!==!1,a={...r},o=r.edges,s=r.nodeList;if(![`TB`,`BT`,`LR`,`RL`].includes(r.direction))throw Error(`direction should be one of the "TB", "BT", "LR", "RL"`);if(![`fit`,`grid`,`singleLine`].includes(r.packing))throw Error(`arrangeComponents should be one of the "fit", "grid", "singleLine"`);r.nodesGridSeparation=e.gridDistance||Bt.gridDistance;let c=s.getId(),l=s.getAttribute(`layoutable`).reduce((e,t,n)=>(e[c[n]]=t,e),{}),u=s.getAttributes([`x`,`y`]).reduce((e,t,n)=>(e[c[n]]=t,e),{}),d=e.rs??s.getAttribute(`radius`);if(typeof a.layer!=`string`)throw Error(`'layer' should be the valid data field name`);if(a.siblingIndex===void 0&&(a.siblingIndex=``),typeof a.siblingIndex!=`string`)throw Error(`'siblingIndex' should be the valid data field name`);let f=Ht(t,r.roots,t.nodeList()),p=n.getProperty(r.nodeList,a.layer),m=a.siblingIndex.length?n.getProperty(r.nodeList,a.siblingIndex):[],h=f.map(e=>{let t=-1;return r.nodeList.forEach((n,r)=>{n===e&&(t=r)}),t});for(let e of h)p[e]=0;let g=Ht(t,r.sinks,t.nodeList()).toArray().reduce((e,t)=>(e[t.getId()]=!0,e),{}),_=c.map(e=>g[e]),v;return e.compactSiblings&&typeof e.compactSiblingsFunction==`function`&&(v=s.map(t=>e.compactSiblingsFunction(t))),{nodes:c,edges:o.map(e=>({id:e.getId(),source:e.getSource().getId(),target:e.getTarget().getId()})),decross:i,options:Vt(r),layoutable:l,packs:v,radiuses:d,siblingIndexes:m,layers:p,sinks:_,coords:u}},context:Ut,update({nodes:e,edges:t,options:n,layoutable:r,radiuses:i,layers:a,packs:o,siblingIndexes:s,decross:c,sinks:l,coords:u}){let d=t.filter(({source:e,target:t})=>e in r&&t in r),f={nodes:e.map((e,t)=>({id:e,radius:i[t],layer:a[t],siblingIndex:s[t],sink:l[t],layoutable:r[e],x:u[e].x,y:u[e].y})),edges:d};if(o){let e=new Map;o.forEach((t,n)=>{e.set(f.nodes[n].id,t)})}let p={TB:`down`,BT:`up`,RL:`left`,LR:`right`},m={fit:`fit`,singleLine:`singleline`,grid:`grid`},h=f.nodes.length,g=new Map;f.nodes.forEach((e,t)=>g.set(e.id,t));let _=[],v=[];for(let e of f.edges){let t=g.get(e.source),n=g.get(e.target);t!==void 0&&n!==void 0&&(_.push(t),v.push(n))}let y=f.nodes.map(e=>e.radius||5),b=[],x=[];f.nodes.forEach((e,t)=>{e.layer===0&&b.push(t),e.sink&&x.push(t)});let S={down:`TB`,up:`BT`,left:`RL`,right:`LR`},C={fit:`fit`,singleline:`singleLine`,grid:`grid`},w=p[n.direction]||`down`,T=m[n.arrangeComponents]||`fit`,E=zt({nodeCount:h,sources:_,targets:v,nodeRadii:y,initialX:f.nodes.map(e=>e.x),initialY:f.nodes.map(e=>e.y),nodeLayers:f.nodes.map(e=>typeof e.layer==`number`&&!isNaN(e.layer)?e.layer:void 0)},{direction:S[w]||`TB`,nodeDistance:n.nodesSeparation??5,levelDistance:n.layerSeparation??50,componentDistance:n.componentsSeparation??50,roots:b,sinks:x,compactSiblings:!!n.compactSiblings,siblingsDistance:n.siblingsDistance??10,decross:n.decross!==!1,arrangeComponents:C[T]||`fit`});return{positions:f.nodes.map((e,t)=>({...e,x:E.x[t],y:E.y[t]}))}},isRunning(){return!1},onSync({positions:e},{graph:t}){return{indexes:e.map(({id:e})=>(t.getNode(e)||{_index:-1})._index),x:e.map(({x:e})=>e),y:e.map(({y:e})=>e)}}},Gt={...Wt,name:`sequential`};function Kt(e){return e===void 0||typeof e==`number`&&isFinite(e)&&e>0}function qt(e,t,n,r,i){if(!Kt(t))throw TypeError(`"rows" should be a positive integer`);if(!Kt(n))throw TypeError(`"cols" should be a positive integer`);if(!Kt(r))throw TypeError(`"rowDistance" should be a positive number`);if(!Kt(i))throw TypeError(`"colDistance" should be a positive number`);if(t)return{rows:t,cols:Math.ceil(e/t),rowDistance:r,colDistance:i};if(n)return{cols:n,rows:Math.ceil(e/n),rowDistance:r,colDistance:i};let a=Math.ceil(Math.sqrt(e));return{cols:a,rows:Math.ceil(e/a),rowDistance:r,colDistance:i}}function Jt(e,t,n,r,i){return typeof e==`string`?e===`radius`?t.getAttribute(!0,`radius`).getMultiple(r):e===`degree`?n.getDegree():e===`random`?r.map(()=>Math.random()):n.getData(e).map(e=>e||i):r.map((e,t)=>t)}const Yt={name:`grid`,configure(e,{graph:t,camera:n}){let r=e.sortBy,i=e.nodes,a=Array.from(i._indexes),o=a.length,{rows:s,cols:c,rowDistance:l,colDistance:u}=qt(o,e.rows,e.cols,e.colDistance,e.rowDistance),d=Jt(r,t,i,a,e.sortFallbackValue),f=i.getAttribute(`layoutable`),p=a.reduce((e,t,n)=>(f[n]&&e.push({id:t,attr:d[n]}),e),[]),m=i.getAttribute(`x`),h=i.getAttribute(`y`),g=i.getAttribute(`radius`),_=1/0,v=1/0;for(let e=0;e<a.length;e++)_=Math.min(_,m[e]),v=Math.min(v,h[e]);return{sort:!!r,nodes:p,reverse:!!e.reverse,cols:c,rows:s,minX:_,minY:v,rs:g,rowDistance:l,colDistance:u}},update({sort:e,nodes:t,minX:n,rs:r,minY:i,reverse:a,cols:s,rowDistance:c,colDistance:l}){let u=t.map((e,t)=>t);e&&u.sort((e,n)=>t[e].attr-t[n].attr),a&&u.reverse();let d=o(),f=t.length,p=new Float64Array(f),m=new Float64Array(f);d.layout_grid_factory(Uint32Array.from(u),Float64Array.from(r,e=>Number(e)),n,i,s,c===void 0?0:c,c!==void 0,l===void 0?0:l,l!==void 0,p,m);for(let e=0;e<f;e++)t[e].x=p[e],t[e].y=m[e];return t},onSync(e){return{indexes:e.map(({id:e})=>e),x:e.map(({x:e})=>e),y:e.map(({y:e})=>e)}}};function Q(e,t){return e!=null&&isFinite(e)?e:t}function Xt(e,t){let n=0,r=e.length-1;for(;n<=r;){let i=n+r>>>1;if(e[i]===t)return i;e[i]<t?n=i+1:r=i-1}return-1}const Zt=(e,t)=>e-t;function Qt(e,t,n){let r=e.slice().sort(Zt),i=[];for(let e=0;e<t.length;e++){let a=[],o=t[e],s=!1;for(let e=0;e<o.length;e++){let t=o[e];Xt(r,t)!==-1&&(t===n&&(s=!0),a.push(t))}a.length>0&&i[s?`unshift`:`push`](a.sort(Zt))}return i}function $t(e){let t=e.x,n=e.y,r=e.indexes.length,i=t[e.centerIndexPos]-e.cx,a=n[e.centerIndexPos]-e.cy;for(let e=0;e<r;e++)t[e]-=i,n[e]-=a;return{indexes:e.indexes,x:t,y:n}}const en={name:`radial`,imports:{},configure(e,{graph:t}){let n=e.nodes,r=n.size;if(e.centralNode===void 0)throw Error(`radial layout: missing parameter "centralNode"`);let i=t.getNode(e.centralNode);if(i===void 0)throw Error(`radial layout: parameter "centralNode" is not valid`);e.radiusRatio=Q(e.radiusRatio,Math.SQRT2),e.radiusDelta=Q(e.radiusDelta,0),e.nodeGap=Q(e.nodeGap,10),e.repulsion=r*Q(e.repulsion,1);let a=i.getPosition(),o=Q(e.centerX,a.x),s=Q(e.centerY,a.y),c=i._index;n.includes(i)||(n=n.concat(i.toList()));let l=n._indexes,u=n.getAttribute(`layoutable`);l=l.filter((e,t)=>u[t]||e===c),l.sort(Zt);let d=l.length,f=Qt(l,t.getConnectedComponents(n,{internalIndexes:!0}),c),p=t.degrees(l),m=new Float32Array(e.xs??t.getNodeAttribute(`x`).getMultiple(l)),h=new Float32Array(e.ys??t.getNodeAttribute(`y`).getMultiple(l)),g=e.rs??t.getNodeAttribute(`radius`).getMultiple(l),_=t.getEdges()._indexes,v=t.getEdgeAttribute(`source`).getMultiple(_),y=t.getEdgeAttribute(`target`).getMultiple(_),b=t.getAdjacencyList({internalIndexes:!0,weight:1,indexes:l});return{centerIndex:c,centerIndexPos:0,cx:o,cy:s,D:null,indexes:l,components:f,normIndexes:null,radii:null,rings:null,x:m,y:h,degree:p,size:d,attributes:{size:g,adjacency:b,weights:y.map(()=>1),sources:v,targets:y},sortAttr:null,allowOverlap:!!e.allowOverlap,nodeGap:e.nodeGap,radiusRatio:e.radiusRatio,radiusDelta:e.radiusDelta,repulsion:e.repulsion,randomize:!(`randomize`in e)||!!e.randomize,renderSteps:!!e.renderSteps,epsilon:Q(e.epsilon,.001),maxSteps:Q(e.maxIterations,100),iterationsPerRender:Q(e.iterationsPerRender,20),step:-1,stress:1/0,prevStress:0,converged:!1,overlapRemoved:!1,done:!1}},context(){return{data:null,sim:null,out4:null}},update(e,t){let n=e||t.data;if(n.x=n.x||new Float32Array(n.size),n.y=n.y||new Float32Array(n.size),n.step===-1){t.data=n;for(let e=0;e<n.indexes.length;e++)n.indexes[e]===n.centerIndex&&(n.centerIndexPos=e);let e=[0],r=[];for(let t of n.components){for(let e of t)r.push(e);e.push(r.length)}let i=n.attributes.adjacency,a=[0],s=[],c=[];for(let e of i){for(let t=0;t<e.nodes.length;t++)s.push(e.nodes[t]),c.push(e.weights?Number(e.weights[t]):1);a.push(s.length)}let l=o();t.sim&&=(t.sim.free(),null),t.sim=new l.RadialStressSim(Uint32Array.from(n.indexes),n.centerIndex,Float64Array.from(n.degree),Uint32Array.from(e),Uint32Array.from(r),Uint32Array.from(a),Uint32Array.from(s),Float64Array.from(c),Uint32Array.from(n.attributes.sources),Uint32Array.from(n.attributes.targets),Float64Array.from(n.attributes.size,e=>Number(e)),n.x,n.y,!!n.randomize,n.nodeGap,n.radiusRatio,n.radiusDelta,n.repulsion,n.epsilon,n.maxSteps),t.out4=new Float64Array(4),n.step=0}let r=t.sim;if(!n.converged&&r&&(r.step_batch(n.iterationsPerRender,t.out4),n.step=t.out4[0],n.stress=t.out4[1],n.prevStress=t.out4[2],n.converged=t.out4[3]===1,r.read_positions(n.x,n.y)),n.converged)if(n.overlapRemoved||n.allowOverlap){if(n.done=!0,r){let e=r.rings_keys(),i=r.rings_offsets(),a=r.rings_members(),o={};for(let t=0;t<e.length;t++){let r=[];for(let e=i[t];e<i[t+1];e++)r.push(n.indexes[a[e]]);o[e[t]]=r}n.rings=o,r.free(),t.sim=null}}else r&&(r.remove_overlaps(),r.read_positions(n.x,n.y),n.overlapRemoved=!0);return n},isRunning({data:e}){return!(!e||e.converged&&(e.allowOverlap||e.done))||(e&&(e.step=-1),!1)},onSync(e){if(e.renderSteps||e.done)return $t(e)},onEnd:e=>$t(e)};function tn(e,t){return t&&typeof t==`object`&&t._index!==void 0?t:e.getNode(t)}function nn(e,t,n,r){if(t)return t===`random`?`random`:t===`radius`?r.slice():t===`degree`?n.getDegree():e.getProperty(n,t)}const rn={forceLink:Tt,force:Ct,hierarchical:Wt,sequential:Gt,grid:Yt,radial:en,concentric:{name:`concentric`,configure(e,{graph:t,data:n}){if(e.centralNode===void 0)throw Error(`concentric layout: missing parameter "centralNode"`);let r={...e,centralNode:tn(t,e.centralNode)},{centralNode:i,nodes:a}=r,o=t.getNode(i);if(o===void 0)throw Error(`concentric layout: "centralNode" parameter is not valid`);let s=o._index,{x:c,y:l}=o.getPosition(),u=a.getAttribute(`layoutable`),d=t.getNodes(a)._indexes,f=Array.from(d.filter((e,t)=>u[t]));f.indexOf(s)===-1&&f.push(s);let p=e.rs?e.rs:t.getNodeAttribute(`radius`).getMultiple(d),m=nn(n,r.sortBy,a,p),h=f.reduce((e,t,n)=>(e[t]=n,e),{}),g=f.map((e,t)=>t),_=new Set(e.edges.getExtremities()._indexes),v=f.map(e=>t.topology.getAdjacentElements(!0,new Uint32Array([e])).filter(e=>_.has(e)).map(e=>h[e]));return{sourceNodeIndex:f.indexOf(s),centerX:typeof r.centerX==`number`?r.centerX:c,centerY:typeof r.centerY==`number`?r.centerY:l,list:f,indexes:g,size:f.length,totalSize:f.length,attributes:{adjacentNodes:v,size:p},sortAttr:m,clockwise:r.clockwise===void 0?!0:r.clockwise,circleHopRatio:r.circleHopRatio||5,allowOverlap:!!r.allowOverlap}},context(){return{determinePropertyType(e,t,n){return t.some(t=>typeof e[t]!=`number`)?`string`:`number`}}},update(e,t){let{attributes:n,indexes:r,size:i,sourceNodeIndex:a,centerX:s,centerY:c,sortAttr:l}=e,u=n.adjacentNodes,d=n.size,f=o(),p=new Uint32Array(e.totalSize+1),m=0;for(let t=0;t<e.totalSize;t++)p[t]=m,m+=u[t]?u[t].length:0;p[e.totalSize]=m;let h=new Uint32Array(m),g=0;for(let t=0;t<e.totalSize;t++){let e=u[t];if(e)for(let t=0;t<e.length;t++)h[g++]=e[t]}let _=Uint32Array.from(r),v=f.layout_concentric_distances(p,h,_,i,e.totalSize,a),y={};for(let e=0;e<i;e++){let t=r[e],n=v[t],i=y[n];i||(i=[],y[n]=i),i.push(t)}function b(e,t,n){if(e===`random`)return()=>Math.random()-.5;if(e)return n.determinePropertyType(e,t,t.length)===`number`?(t,n)=>e[t]-e[n]:(t,n)=>e[t]<e[n]?-1:1}let x=b(l,r,t),S=l===`random`||l,C=Object.keys(y).sort((e,t)=>parseInt(e)-parseInt(t)),w=new Uint32Array(C.length+1),T=[],E=[];C.forEach((t,n)=>{let r=y[parseInt(t)];for(let e of r)E.push(e);S&&(r.sort(x),e.clockwise||r.reverse());for(let e of r)T.push(e);w[n+1]=T.length});let D=Array(e.totalSize),O=Array(e.totalSize),k=0;for(let e=0;e<i;e++){let t=d[r[e]];t>k&&(k=t)}let A=k*e.circleHopRatio,j=0,M=0,N=Math.PI/9;return C.forEach((t,n)=>{let r=y[parseInt(t)],i=r.length,a=0,o=M,l=2*Math.PI/i;if(n!==0&&!e.allowOverlap){let e=2*Math.PI*j,t=E.slice(w[n],w[n+1]);a+=t.reduce((e,t)=>e+d[t],0);let r=2*a*Math.SQRT2;r>e&&(j+=r/(2*Math.PI)-j)}for(let t=0;t<i;t++){let n=r[t];D[n]=Math.cos(o)*j+s,O[n]=Math.sin(o)*j+c;let u=d[n];o+=l*(e.allowOverlap?1:u/a*i)}j+=A,M+=N}),{x:D,y:O,indexes:e.list}},isRunning(){return!1},onSync({indexes:e,x:t,y:n}){return{indexes:e,x:t,y:n}}}};let an=null;function on(e){return an||=import(`./nodus_wasm-CLMeJcEx.js`).then(e=>{s(e)}).catch(()=>{an=null}),an.then(()=>{r(e)})}const sn=()=>{},cn=()=>!1,$=new Map;function ln(e,t,n){self.postMessage({type:n?`update`:`complete`,workerId:e.workerId,workerMessage:t,isRunning:n})}function un(e,t){if(e.stopped)return;let n,r=!1;try{n=e.update(t,e.context),r=!!e.isRunning(e.context,t)}catch(t){self.postMessage({type:`error`,workerId:e.workerId,error:t?.message??String(t)}),$.delete(e.workerId);return}if(ln(e,n,r),!r){$.delete(e.workerId);return}setTimeout(()=>un(e,void 0),0)}self.addEventListener(`error`,e=>{self.postMessage({type:`error`,workerId:-1,error:`worker uncaught: ${e?.message||String(e)}`})}),self.addEventListener(`message`,e=>{let t=e.data;if(!(!t||!t.type)){if(t.type===`init`){let e=rn[t.name];if(!e){self.postMessage({type:`error`,workerId:t.workerId,error:`unknown layout: ${t.name}`});return}let n={workerId:t.workerId,descriptor:e,context:e.context?e.context():{},stopped:!1,update:typeof e.update==`function`?e.update:sn,isRunning:typeof e.isRunning==`function`?e.isRunning:cn,stop:typeof e.stop==`function`?e.stop:sn};$.set(t.workerId,n),t.wasmFlags?on(t.wasmFlags).then(()=>{n.stopped||un(n,t.msg)}):un(n,t.msg)}else if(t.type===`stop`){let e=$.get(t.workerId);if(e){e.stopped=!0;try{e.stop(e.context)}catch{}self.postMessage({type:`complete`,workerId:e.workerId,workerMessage:void 0,isRunning:!1}),$.delete(e.workerId)}}}});
|