0001 function cutsize = validate4 (A, clusters, Verif, verbose)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025 if nargin < 3
0026 Verif = [];
0027 end;
0028 if nargin < 4
0029 verbose = 1;
0030 end;
0031 if verbose > 0
0032 fprintf('\n** Validating output from SSCA#2 kernel 4 ** \n');
0033 end;
0034 if isstruct(A)
0035 if isfield(A,'graph')
0036 A = A.graph;
0037 else
0038 A = undirect(A.edgeWeights{1});
0039 end;
0040 end;
0041 cutsize = Inf;
0042 [nv, m] = size(A);
0043 if nv ~= m || nnz(A|A') ~= nnz(A)
0044 error('Input matrix is not square or not symmetric in structure.');
0045 end;
0046 if ~ isempty(Verif) && Verif.totVertices ~= nv
0047 fprintf('Warning: verification struct disagrees with number of vertices:\n');
0048 fprintf(' Verif.totVertices = %d, nv = %d\n\n', Verif.totVertices, nv);
0049 end;
0050 if min(size(clusters)) ~= 1 || max(size(clusters)) ~= nv
0051 if verbose > 0
0052 fprintf('Bad output: cluster vector is wrong size.\n');
0053 end;
0054 return;
0055 end;
0056 if min(clusters) < 1 || any(round(clusters) ~= clusters)
0057 if verbose > 0
0058 fprintf('Bad output: cluster vector is not all positive integers.\n');
0059 end;
0060 return;
0061 end;
0062 maxsize = Inf;
0063 clusters = fixuplabels (clusters);
0064 nclusters = max(clusters);
0065 csizes = histc(clusters,1:nclusters);
0066 maxcluster = max(csizes);
0067 ncbysize = histc(csizes,1:maxcluster);
0068 A = A - diag(diag (A));
0069 nedges = nnz(A)/2;
0070 [i,j] = find(A);
0071 condensation = sparse(clusters(i),clusters(j),1,nclusters,nclusters);
0072 edgesinside = sum(full(diag(condensation)))/2;
0073 edgesoutside = nedges - edgesinside;
0074 densityinside = 2*edgesinside / sum(csizes .* (csizes-1));
0075 if ~ isempty(Verif)
0076 maxclique = Verif.maxCliqueSize;
0077 ncliques = max(Verif.cliqueID);
0078 maxsize = maxclique;
0079 if isfield(Verif,'numInterCliqueLinks')
0080 intercliqueedges = Verif.numInterCliqueLinks;
0081 else
0082 intercliqueedges = NaN;
0083 end;
0084 M = edgesoutside / intercliqueedges;
0085 else
0086 maxsize = Inf;
0087 maxclique = NaN;
0088 ncliques = NaN;
0089 intercliqueedges = NaN;
0090 M = NaN;
0091 end;
0092 if verbose > 0
0093 fprintf('\n');
0094
0095 fprintf('Scale : %d\n', fix(log2(nv)));
0096 fprintf('Number of graph vertices : %d\n', nv);
0097 fprintf('Number of graph edges : %d\n', nedges);
0098 fprintf('Intercluster/Interclique edges : %f\n', M);
0099
0100 fprintf('\n\t\t\t\tINPUT OUTPUT CONFORM\n');
0101
0102 if (maxcluster <= maxclique)
0103 conform = 'YES';
0104 else
0105 conform = sprintf ('NO: %d extra vertices', maxcluster - maxclique);
0106 end
0107 fprintf('Max Cluster Size : %10d %10d %s\n', ...
0108 maxclique, maxcluster, conform);
0109
0110 fprintf('Number of clusters : %10d %10d\n', ...
0111 ncliques, nclusters);
0112
0113 fprintf('Density inside clusters : %10.2f %10.2f\n', ...
0114 1, densityinside);
0115
0116 if edgesoutside < floor(1.05 * intercliqueedges)
0117 conform = 'YES';
0118 else
0119 conform = sprintf ('NO: %d%% extra edges', ...
0120 ceil ((M - 1.05) * 100));
0121 end
0122 fprintf('Edges between clusters : %10d %10d %s\n', ...
0123 intercliqueedges, edgesoutside, conform);
0124
0125 fprintf('\n');
0126 end;
0127 if verbose >= 2
0128
0129
0130
0131
0132
0133 Vnclusters = max(Verif.cliqueID);
0134 Vcsizes = histc(Verif.cliqueID,1:Vnclusters);
0135 Vmaxcluster = max(Vcsizes);
0136 Vncbysize = histc(Vcsizes,1:Vmaxcluster);
0137
0138
0139
0140
0141 figure;
0142 Vmaxcluster = max (maxcluster, Vmaxcluster);
0143 l1 = length(ncbysize);
0144 l2 = length(Vncbysize);
0145 if l1 > l2
0146 Vncbysize = [Vncbysize zeros(l1-l2,1)'];
0147 Vmaxcluster = length (Vncbysize);
0148 else
0149 ncbysize = [ncbysize zeros(l2-l1,1)'];
0150 Vmaxcluster = length (ncbysize);
0151 end
0152 if size(ncbysize, 2) == 1
0153 ncbysize = ncbysize';
0154 end
0155 bar (1:Vmaxcluster, [Vncbysize; ncbysize]', 'grouped');
0156 colormap cool
0157 legend ('Input', 'Output', 'Location', 'BestOutside');
0158 title('Histogram of cluster sizes'); xlabel('size'); ylabel('clusters');
0159 end;
0160 if verbose >= 3
0161 figure;
0162 spy(A); title('Input graph in original order');
0163 [ignore,p] = sort(clusters);
0164 figure;
0165 spy(A(p,p)|speye(nv)); title('Input graph in cluster order');
0166 figure;
0167 spy(condensation);
0168 title('Graph of intercluster connections');
0169 end;
0170 cutsize = edgesoutside;
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181