Mercurial > hg > camir-aes2014
comparison toolboxes/FullBNT-1.0.7/GraphViz/make_layout.m @ 0:e9a9cd732c1e tip
first hg version after svn
| author | wolffd |
|---|---|
| date | Tue, 10 Feb 2015 15:05:51 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:e9a9cd732c1e |
|---|---|
| 1 function [x, y] = layout_dag(adj) | |
| 2 % MAKE_LAYOUT Creates a layout from an adjacency matrix | |
| 3 % | |
| 4 % [X, Y] = MAKE_LAYOUT(ADJ) | |
| 5 % | |
| 6 % Inputs : | |
| 7 % ADJ = adjacency matrix (source, sink) | |
| 8 % | |
| 9 % Outputs : | |
| 10 % X, Y : Positions of nodes | |
| 11 % | |
| 12 % Usage Example : [X, Y] = make_layout(adj); | |
| 13 % | |
| 14 % | |
| 15 % Note : Uses some very simple heuristics, so any other | |
| 16 % algorithm would create a nicer layout | |
| 17 % | |
| 18 % See also | |
| 19 | |
| 20 % Uses : | |
| 21 | |
| 22 % Change History : | |
| 23 % Date Time Prog Note | |
| 24 % 13-Apr-2000 8:25 PM ATC Created under MATLAB 5.3.1.29215a (R11.1) | |
| 25 | |
| 26 % ATC = Ali Taylan Cemgil, | |
| 27 % SNN - University of Nijmegen, Department of Medical Physics and Biophysics | |
| 28 % e-mail : cemgil@mbfys.kun.nl | |
| 29 | |
| 30 N = size(adj,1); | |
| 31 tps = toposort(adj); | |
| 32 | |
| 33 if ~isempty(tps), % is directed ? | |
| 34 level = zeros(1,N); | |
| 35 for i=tps, | |
| 36 idx = find(adj(:,i)); | |
| 37 if ~isempty(idx), | |
| 38 l = max(level(idx)); | |
| 39 level(i)=l+1; | |
| 40 end; | |
| 41 end; | |
| 42 else | |
| 43 level = poset(adj,1)'-1; | |
| 44 end; | |
| 45 | |
| 46 y = (level+1)./(max(level)+2); | |
| 47 y = 1-y; | |
| 48 x = zeros(size(y)); | |
| 49 for i=0:max(level), | |
| 50 idx = find(level==i); | |
| 51 offset = (rem(i,2)-0.5)/10; | |
| 52 x(idx) = (1:length(idx))./(length(idx)+1)+offset; | |
| 53 end; | |
| 54 | |
| 55 %%%%%%% | |
| 56 | |
| 57 function [depth] = poset(adj, root) | |
| 58 % POSET Identify a partial ordering among the nodes of a graph | |
| 59 % | |
| 60 % [DEPTH] = POSET(ADJ,ROOT) | |
| 61 % | |
| 62 % Inputs : | |
| 63 % ADJ : Adjacency Matrix | |
| 64 % ROOT : Node to start with | |
| 65 % | |
| 66 % Outputs : | |
| 67 % DEPTH : Depth of the Node | |
| 68 % | |
| 69 % Usage Example : [depth] = poset(adj,12); | |
| 70 % | |
| 71 % | |
| 72 % Note : All Nodes must be connected | |
| 73 % See also | |
| 74 | |
| 75 % Uses : | |
| 76 | |
| 77 % Change History : | |
| 78 % Date Time Prog Note | |
| 79 % 17-Jun-1998 12:01 PM ATC Created under MATLAB 5.1.0.421 | |
| 80 | |
| 81 % ATC = Ali Taylan Cemgil, | |
| 82 % SNN - University of Nijmegen, Department of Medical Physics and Biophysics | |
| 83 % e-mail : cemgil@mbfys.kun.nl | |
| 84 | |
| 85 adj = adj+adj'; | |
| 86 | |
| 87 N = size(adj,1); | |
| 88 depth = zeros(N,1); | |
| 89 depth(root) = 1; | |
| 90 queue = root; | |
| 91 | |
| 92 while 1, | |
| 93 if isempty(queue), | |
| 94 if all(depth), break; | |
| 95 else | |
| 96 root = find(depth==0); | |
| 97 root = root(1); | |
| 98 depth(root) = 1; | |
| 99 queue = root; | |
| 100 end; | |
| 101 end; | |
| 102 r = queue(1); queue(1) = []; | |
| 103 idx = find(adj(r,:)); | |
| 104 idx2 = find(~depth(idx)); | |
| 105 idx = idx(idx2); | |
| 106 queue = [queue idx]; | |
| 107 depth(idx) = depth(r)+1; | |
| 108 end; | |
| 109 | |
| 110 %%%%%%%%% | |
| 111 | |
| 112 function [seq] = toposort(adj) | |
| 113 % TOPOSORT A Topological ordering of nodes in a directed graph | |
| 114 % | |
| 115 % [SEQ] = TOPOSORT(ADJ) | |
| 116 % | |
| 117 % Inputs : | |
| 118 % ADJ : Adjacency Matrix. | |
| 119 % ADJ(i,j)==1 ==> there exists a directed edge | |
| 120 % from i to j | |
| 121 % | |
| 122 % Outputs : | |
| 123 % SEQ : A topological ordered sequence of nodes. | |
| 124 % empty matrix if graph contains cycles. | |
| 125 % | |
| 126 % Usage Example : | |
| 127 % N=5; | |
| 128 % [l,u] = lu(rand(N)); | |
| 129 % adj = ~diag(ones(1,N)) & u>0.5; | |
| 130 % seq = toposort(adj); | |
| 131 % | |
| 132 % | |
| 133 % Note : | |
| 134 % See also | |
| 135 | |
| 136 % Uses : | |
| 137 | |
| 138 % Change History : | |
| 139 % Date Time Prog Note | |
| 140 % 18-May-1998 4:44 PM ATC Created under MATLAB 5.1.0.421 | |
| 141 | |
| 142 % ATC = Ali Taylan Cemgil, | |
| 143 % SNN - University of Nijmegen, Department of Medical Physics and Biophysics | |
| 144 % e-mail : cemgil@mbfys.kun.nl | |
| 145 | |
| 146 N = size(adj); | |
| 147 indeg = sum(adj,1); | |
| 148 outdeg = sum(adj,2); | |
| 149 seq = []; | |
| 150 | |
| 151 for i=1:N, | |
| 152 % Find nodes with indegree 0 | |
| 153 idx = find(indeg==0); | |
| 154 % If can't find than graph contains a cycle | |
| 155 if isempty(idx), | |
| 156 seq = []; | |
| 157 break; | |
| 158 end; | |
| 159 % Remove the node with the max number of connections | |
| 160 [dummy idx2] = max(outdeg(idx)); | |
| 161 indx = idx(idx2); | |
| 162 seq = [seq, indx]; | |
| 163 indeg(indx)=-1; | |
| 164 idx = find(adj(indx,:)); | |
| 165 indeg(idx) = indeg(idx)-1; | |
| 166 end; | |
| 167 | |
| 168 | |
| 169 | |
| 170 |
