AIManage/public/onnx/onnx_view/dagre.js

1 line
40 KiB
JavaScript
Raw Normal View History

2024-06-06 22:17:58 +08:00
var dagre=dagre||{};dagre.layout=(graph,layout)=>{const time=(name,callback)=>{const result=callback();return result};const buildLayoutGraph=graph=>{const g=new dagre.Graph({compound:true});g.layout=Object.assign({},{ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},layout);g.state=Object.assign({},graph.state);for(const node of graph.nodes.values()){const v=node.v;const label=node.label;g.setNode(v,{width:label.width||0,height:label.height||0});g.setParent(v,graph.parent(v))}for(const e of graph.edges.values()){const edge=e.label;g.setEdge(e.v,e.w,{minlen:edge.minlen||1,weight:edge.weight||1,width:edge.width||0,height:edge.height||0,labeloffset:edge.labeloffset||10,labelpos:edge.labelpos||"r"})}return g};const runLayout=(g,time)=>{let uniqueIdCounter=0;const uniqueId=prefix=>{const id=++uniqueIdCounter;return prefix+id};const flat=list=>{if(Array.isArray(list)&&list.every(item=>!Array.isArray(item))){return list}const target=[];for(const item of list){if(!Array.isArray(item)){target.push(item);continue}for(const entry of item){target.push(entry)}}return target};const addDummyNode=(g,type,label,name)=>{let v;do{v=uniqueId(name)}while(g.hasNode(v));label.dummy=type;g.setNode(v,label);return v};const asNonCompoundGraph=g=>{const graph=new dagre.Graph({});graph.layout=g.layout;graph.state=g.state;for(const node of g.nodes.values()){const v=node.v;if(g.children(v).length===0){graph.setNode(v,node.label)}}for(const e of g.edges.values()){graph.setEdge(e.v,e.w,e.label)}return graph};const maxRank=g=>{let rank=Number.NEGATIVE_INFINITY;for(const node of g.nodes.values()){const x=node.label.rank;if(x!==undefined&&x>rank){rank=x}}return rank===Number.NEGATIVE_INFINITY?undefined:rank};const buildLayerMatrix=g=>{const rank=maxRank(g);const length=rank===undefined?0:rank+1;const layering=Array.from(new Array(length),()=>[]);for(const node of g.nodes.values()){const label=node.label;const rank=label.rank;if(rank!==undefined){layering[rank][label.order]=node.v}}return layering};const makeSpaceForEdgeLabels=g=>{g.layout.ranksep/=2;const rankdir=g.layout.rankdir;for(const e of g.edges.values()){const edge=e.label;edge.minlen*=2;if(edge.labelpos.toLowerCase()!=="c"){if(rankdir==="TB"||rankdir==="BT"){edge.width+=edge.labeloffset}else{edge.height+=edge.labeloffset}}}};const removeSelfEdges=g=>{for(const e of g.edges.values()){if(e.v===e.w){const label=e.vNode.label;if(!label.selfEdges){label.selfEdges=[]}label.selfEdges.push({e:e,label:e.label});g.removeEdge(e)}}};const acyclic_run=g=>{const edges=[];const visited=new Set;const path=new Set;const stack=Array.from(g.nodes.keys()).reverse();while(stack.length>0){const v=stack.pop();if(!Array.isArray(v)){if(!visited.has(v)){visited.add(v);path.add(v);stack.push([v]);const out=g.node(v).out;for(let i=out.length-1;i>=0;i--){const e=out[i];if(path.has(e.w)){edges.push(e)}stack.push(e.w)}}}else{path.delete(v[0])}}for(const e of edges){const label=e.label;g.removeEdge(e);label.forwardName=e.name;label.reversed=true;g.setEdge(e.w,e.v,label,uniqueId("rev"))}};const acyclic_undo=g=>{for(const e of g.edges.values()){const edge=e.label;if(edge.reversed){edge.points.reverse();g.removeEdge(e);const forwardName=edge.forwardName;delete edge.reversed;delete edge.forwardName;g.setEdge(e.w,e.v,edge,forwardName)}}};const slack=(g,e)=>{return e.wNode.label.rank-e.vNode.label.rank-e.label.minlen};const rank=g=>{const feasibleTree=g=>{const t=new dagre.Graph({directed:false});const start=g.nodes.keys().next().value;const size=g.nodes.size;t.setNode(start,{});const tightTree=(t,g)=>{const stack=Array.from(t.nodes.keys()).reverse();while(stack.length>0){const v=stack.pop();const node=g.node(v);for(const e of node.in.concat(node.out)){const edgeV=e.v;const w=v===edgeV?e.w:edgeV;if(!t.hasNode(w)&&!slack(g,e)){t.setNode(w,{});t.setEdge(v,w,{});stack.push(w)}}}return t.nodes.size};while(tightTree(t,g)<size){let minKey=Number.MAX_SAFE_INTEGER;let edge=undefined;for(const e of g.edges.values()){if(t.hasNode(e.v)!==t.hasNode(e.w)){const key=slack(g,e);if(key<minKey){minKey=key;edge=e}}}const delta=t.hasNode(edge.v)?slack(g,