Guest User

error_setting_debugpoint

a guest
Mar 19th, 2016
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 4.95 KB | None | 0 0
  1.   % Newman fast community finding algorithm
  2.   % Source: "Fast algorithm for detecting community structure in networks", Mark Newman
  3.   % Input: adjacency matrix
  4.   % Output: group (cluster) formation over time, modularity metric for each cluster breakdown
  5.   % Other functions used: numedges.m
  6.   % Originally: June 6, 2007, GB, last modified May 4, 2011
  7.  
  8.   function [groups_hist,Q]=newman_comm_fast(adj)
  9.  
  10.       profile on
  11.       n = size(adj,1);   % number of vertices    
  12.       isSymmetricGraph = issymmetric(adj);
  13.  
  14.       groups_hist = cell(1, n);
  15.       Q = zeros(1,n);
  16.       groups_hist_entry = cell(1, n);
  17.       groups = cell(1, n);
  18.    
  19.       edgeSum = adj;
  20.  
  21.       for i = 1:n
  22.           groups{i} = i; % each node starts out as one community
  23.           groups_hist_entry = i;
  24.       end
  25.       groups_hist{1}{i} = groups_hist_entry;
  26.    
  27.       nedges = numedges(adj); % compute the total number of edges
  28.  
  29.       Q(1) = QfnOptimized(groups,adj, nedges);
  30.  
  31.       for s = 1:n-1 % all possible iterations
  32.           dQ=zeros(length(groups));
  33.  
  34.           for i = 1:length(groups)
  35.               group_i=groups{i};
  36.               for j = i+1:length(groups)
  37.                   group_j=groups{j};
  38.  
  39.                   dQ(i,j)=0; % default
  40.                   % check if connected
  41.                  
  42.                   connected=0;
  43.                   if edgeSum(i, j) + edgeSum(j, i) > 0
  44.                       connected = 1;
  45.                   end
  46.                  
  47.                   if connected && ~(isempty(group_i)) && ~(isempty(group_j))
  48.                       dQ(i,j) = deltaQOptimized( edgeSum, i, j, nedges, isSymmetricGraph);
  49.                   end
  50.               end
  51.           end
  52.  
  53.           % pick max nonzero dQ
  54.           dQ(dQ==0)=-Inf;
  55.           [~,minij]=max(dQ(:));
  56.  
  57.           [mini,minj] = ind2sub([size(dQ,1),size(dQ,1)],minij);   % i and j corresponding to min dQ
  58.           %update the edge sums for the group merge.
  59.        
  60.           if isSymmetricGraph
  61.               edgeSum(mini, mini) = edgeSum(mini, mini) + edgeSum(minj, minj) + edgeSum(minj, mini);
  62.               for l=1:length(groups)
  63.                   if l ~= mini && l ~= minj
  64.                       edgeSum(mini, l) = edgeSum(mini, l) + edgeSum(minj, l);
  65.                       edgeSum(l, mini) = edgeSum(mini, l);
  66.                   end
  67.               end
  68.           else
  69.               edgeSum(mini, mini) = edgeSum(mini, mini) + edgeSum(minj, minj) + edgeSum(mini, minj) + edgeSum(minj, mini);
  70.               for l=1:length(groups)
  71.                   if l ~= mini && l ~= minj
  72.                       edgeSum(mini, l) = edgeSum(mini, l) + edgeSum(minj, l);
  73.                       edgeSum(l, mini) = edgeSum(l, mini) + edgeSum(l, minj);
  74.                   end
  75.               end
  76.           end
  77.           edgeSum(length(groups), mini) = edgeSum(length(groups), mini) + edgeSum(length(groups), minj);
  78.           edgeSum(mini, length(groups)) = edgeSum(mini, length(groups)) + edgeSum(minj, length(groups));
  79.  
  80.           edgeSum(minj,:) = edgeSum(length(groups),:);
  81.           edgeSum(:,minj) = edgeSum(:, length(groups));
  82.           edgeSum(minj, minj) = edgeSum(length(groups), length(groups));
  83.  
  84.           %reduce the size of array matrix
  85.           edgeSum = edgeSum(1:length(groups)-1, 1:length(groups)-1);
  86.  
  87.           %merge the groups.
  88.           groups{mini} = sort([groups{mini} groups{minj}]);       % merge i and j into ith location.
  89.           groups{minj} = groups{length(groups)};                  % swap minj with last group
  90.           groups = groups(1:length(groups)-1);
  91.  
  92.           groups_hist{s+1} = groups; % save current snapshot
  93.           Q(s+1) = Qfn(groups,adj);
  94.  
  95.       end % end of all iterations
  96.  
  97.       num_modules = zeros(1, length(groups_hist));
  98.       for g=1:length(groups_hist)
  99.           num_modules(g) = length(groups_hist{g});
  100.       end
  101.  
  102.       profile viewer
  103.  
  104.       set(gcf,'Color',[1 1 1],'Colormap',jet);
  105.       plot(num_modules,Q,'ko-')
  106.       xlabel('number of modules / communities')
  107.       ylabel('modularity metric, Q')
  108.   end
  109.  
  110.   function dQ=deltaQOptimized(edgeSum, i, j, nedges, isSymmetricGraph)
  111.   % Optimized version of deltaQ. For details see deltaQ.
  112.  
  113.       e_ii = edgeSum(i, i)/nedges;
  114.  
  115.       e_jj = edgeSum(j, j)/nedges;
  116.       if isSymmetricGraph
  117.           crossCommunityEdge = edgeSum(j, j) + edgeSum(j, j) + edgeSum(i, j);
  118.       else
  119.           crossCommunityEdge = edgeSum(j, j) + edgeSum(j, j) + edgeSum(i, j) + edgeSum(j, i);
  120.       end
  121.       e_ij = crossCommunityEdge / nedges - e_ii - e_jj;
  122.    
  123.       a_i = sum(edgeSum(i, :))/nedges-e_ii;
  124.       a_j = sum(edgeSum(j, :)) / nedges - e_jj;
  125.       dQ = 2*(e_ij-a_i*a_j);
  126.   end
  127.  
  128.   function Q = QfnOptimized(modules,adj, nedges)
  129.   % Optimized verison of Qfn. For details see Qfn
  130.  
  131.       Q = 0;
  132.       for m=1:length(modules)
  133.           e_mm=numedges(adj(modules{m},modules{m}))/nedges;
  134.           a_m=sum(sum(adj(modules{m},:)))/nedges - e_mm; % counting e_mm only once
  135.  
  136.           Q = Q + (e_mm - a_m^2);
  137.       end
  138.   end
Advertisement
Add Comment
Please, Sign In to add comment