Mercurial > hg > camir-aes2014
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/FullBNT-1.0.7/GraphViz/make_layout.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,170 @@ +function [x, y] = layout_dag(adj) +% MAKE_LAYOUT Creates a layout from an adjacency matrix +% +% [X, Y] = MAKE_LAYOUT(ADJ) +% +% Inputs : +% ADJ = adjacency matrix (source, sink) +% +% Outputs : +% X, Y : Positions of nodes +% +% Usage Example : [X, Y] = make_layout(adj); +% +% +% Note : Uses some very simple heuristics, so any other +% algorithm would create a nicer layout +% +% See also + +% Uses : + +% Change History : +% Date Time Prog Note +% 13-Apr-2000 8:25 PM ATC Created under MATLAB 5.3.1.29215a (R11.1) + +% ATC = Ali Taylan Cemgil, +% SNN - University of Nijmegen, Department of Medical Physics and Biophysics +% e-mail : cemgil@mbfys.kun.nl + +N = size(adj,1); +tps = toposort(adj); + +if ~isempty(tps), % is directed ? + level = zeros(1,N); + for i=tps, + idx = find(adj(:,i)); + if ~isempty(idx), + l = max(level(idx)); + level(i)=l+1; + end; + end; +else + level = poset(adj,1)'-1; +end; + +y = (level+1)./(max(level)+2); +y = 1-y; +x = zeros(size(y)); +for i=0:max(level), + idx = find(level==i); + offset = (rem(i,2)-0.5)/10; + x(idx) = (1:length(idx))./(length(idx)+1)+offset; +end; + +%%%%%%% + +function [depth] = poset(adj, root) +% POSET Identify a partial ordering among the nodes of a graph +% +% [DEPTH] = POSET(ADJ,ROOT) +% +% Inputs : +% ADJ : Adjacency Matrix +% ROOT : Node to start with +% +% Outputs : +% DEPTH : Depth of the Node +% +% Usage Example : [depth] = poset(adj,12); +% +% +% Note : All Nodes must be connected +% See also + +% Uses : + +% Change History : +% Date Time Prog Note +% 17-Jun-1998 12:01 PM ATC Created under MATLAB 5.1.0.421 + +% ATC = Ali Taylan Cemgil, +% SNN - University of Nijmegen, Department of Medical Physics and Biophysics +% e-mail : cemgil@mbfys.kun.nl + +adj = adj+adj'; + +N = size(adj,1); +depth = zeros(N,1); +depth(root) = 1; +queue = root; + +while 1, + if isempty(queue), + if all(depth), break; + else + root = find(depth==0); + root = root(1); + depth(root) = 1; + queue = root; + end; + end; + r = queue(1); queue(1) = []; + idx = find(adj(r,:)); + idx2 = find(~depth(idx)); + idx = idx(idx2); + queue = [queue idx]; + depth(idx) = depth(r)+1; +end; + +%%%%%%%%% + +function [seq] = toposort(adj) +% TOPOSORT A Topological ordering of nodes in a directed graph +% +% [SEQ] = TOPOSORT(ADJ) +% +% Inputs : +% ADJ : Adjacency Matrix. +% ADJ(i,j)==1 ==> there exists a directed edge +% from i to j +% +% Outputs : +% SEQ : A topological ordered sequence of nodes. +% empty matrix if graph contains cycles. +% +% Usage Example : +% N=5; +% [l,u] = lu(rand(N)); +% adj = ~diag(ones(1,N)) & u>0.5; +% seq = toposort(adj); +% +% +% Note : +% See also + +% Uses : + +% Change History : +% Date Time Prog Note +% 18-May-1998 4:44 PM ATC Created under MATLAB 5.1.0.421 + +% ATC = Ali Taylan Cemgil, +% SNN - University of Nijmegen, Department of Medical Physics and Biophysics +% e-mail : cemgil@mbfys.kun.nl + +N = size(adj); +indeg = sum(adj,1); +outdeg = sum(adj,2); +seq = []; + +for i=1:N, + % Find nodes with indegree 0 + idx = find(indeg==0); + % If can't find than graph contains a cycle + if isempty(idx), + seq = []; + break; + end; + % Remove the node with the max number of connections + [dummy idx2] = max(outdeg(idx)); + indx = idx(idx2); + seq = [seq, indx]; + indeg(indx)=-1; + idx = find(adj(indx,:)); + indeg(idx) = indeg(idx)-1; +end; + + + +