00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <metis.h>
00016
00017
00018
00019
00020
00021
00022 int CheckGraph(GraphType *graph)
00023 {
00024 int i, j, k, l;
00025 int nvtxs, ncon, err=0;
00026 int minedge, maxedge, minewgt, maxewgt;
00027 floattype minvwgt[MAXNCON], maxvwgt[MAXNCON];
00028 idxtype *xadj, *adjncy, *adjwgt, *htable;
00029 floattype *nvwgt, ntvwgts[MAXNCON];
00030
00031 nvtxs = graph->nvtxs;
00032 ncon = graph->ncon;
00033 xadj = graph->xadj;
00034 nvwgt = graph->nvwgt;
00035 adjncy = graph->adjncy;
00036 adjwgt = graph->adjwgt;
00037
00038 htable = idxsmalloc(nvtxs, 0, "htable");
00039
00040 if (ncon > 1) {
00041 for (j=0; j<ncon; j++) {
00042 minvwgt[j] = maxvwgt[j] = nvwgt[j];
00043 ntvwgts[j] = 0.0;
00044 }
00045 }
00046
00047 minedge = maxedge = adjncy[0];
00048 minewgt = maxewgt = adjwgt[0];
00049
00050 for (i=0; i<nvtxs; i++) {
00051 if (ncon > 1) {
00052 for (j=0; j<ncon; j++) {
00053 ntvwgts[j] += nvwgt[i*ncon+j];
00054 minvwgt[j] = (nvwgt[i*ncon+j] < minvwgt[j]) ? nvwgt[i*ncon+j] : minvwgt[j];
00055 maxvwgt[j] = (nvwgt[i*ncon+j] > maxvwgt[j]) ? nvwgt[i*ncon+j] : maxvwgt[j];
00056 }
00057 }
00058
00059 for (j=xadj[i]; j<xadj[i+1]; j++) {
00060 k = adjncy[j];
00061
00062 minedge = (k < minedge) ? k : minedge;
00063 maxedge = (k > maxedge) ? k : maxedge;
00064 minewgt = (adjwgt[j] < minewgt) ? adjwgt[j] : minewgt;
00065 maxewgt = (adjwgt[j] > maxewgt) ? adjwgt[j] : maxewgt;
00066
00067 if (i == k) {
00068 printf("Vertex %d contains a self-loop (i.e., diagonal entry in the matrix)!\n", i);
00069 err++;
00070 }
00071 else {
00072 for (l=xadj[k]; l<xadj[k+1]; l++) {
00073 if (adjncy[l] == i) {
00074 if (adjwgt != NULL && adjwgt[l] != adjwgt[j]) {
00075 printf("Edges (%d %d) and (%d %d) do not have the same weight! %d %d\n", i,k,k,i, adjwgt[l], adjwgt[j]);
00076 err++;
00077 }
00078 break;
00079 }
00080 }
00081 if (l == xadj[k+1]) {
00082 printf("Missing edge: (%d %d)!\n", k, i);
00083 err++;
00084 }
00085 }
00086
00087 if (htable[k] == 0) {
00088 htable[k]++;
00089 }
00090 else {
00091 printf("Edge %d from vertex %d is repeated %d times\n", k, i, htable[k]++);
00092 err++;
00093 }
00094 }
00095
00096 for (j=xadj[i]; j<xadj[i+1]; j++) {
00097 htable[adjncy[j]] = 0;
00098 }
00099 }
00100
00101 if (ncon > 1) {
00102 for (j=0; j<ncon; j++) {
00103 if (fabs(ntvwgts[j] - 1.0) > 0.0001) {
00104 printf("Normalized vwgts don't sum to one. Weight %d = %.8f.\n", j, ntvwgts[j]);
00105 err++;
00106 }
00107 }
00108 }
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120 if (err > 0) {
00121 printf("A total of %d errors exist in the input file. Correct them, and run again!\n", err);
00122 }
00123
00124 GKfree(&htable, LTERM);
00125 return (err == 0 ? 1 : 0);
00126 }
00127