00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include <metis.h>
00014
00015
00016
00017
00018
00019 GraphType *MCCoarsen2Way(CtrlType *ctrl, GraphType *graph)
00020 {
00021 int i, clevel;
00022 GraphType *cgraph;
00023
00024 IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->CoarsenTmr));
00025
00026 cgraph = graph;
00027
00028 clevel = 0;
00029 do {
00030 if (ctrl->dbglvl&DBG_COARSEN) {
00031 printf("%6d %7d %10d [%d] [%6.4f", cgraph->nvtxs, cgraph->nedges,
00032 idxsum(cgraph->nvtxs, cgraph->adjwgtsum), ctrl->CoarsenTo, ctrl->nmaxvwgt);
00033 for (i=0; i<graph->ncon; i++)
00034 printf(" %5.3f", ssum_strd(cgraph->nvtxs, cgraph->nvwgt+i, cgraph->ncon));
00035 printf("]\n");
00036 }
00037
00038 switch (ctrl->CType) {
00039 case MATCH_RM:
00040 MCMatch_RM(ctrl, cgraph);
00041 break;
00042 case MATCH_HEM:
00043 if (clevel < 1 || cgraph->nedges == 0)
00044 MCMatch_RM(ctrl, cgraph);
00045 else
00046 MCMatch_HEM(ctrl, cgraph);
00047 break;
00048 case MATCH_SHEM:
00049 if (clevel < 1 || cgraph->nedges == 0)
00050 MCMatch_RM(ctrl, cgraph);
00051 else
00052 MCMatch_SHEM(ctrl, cgraph);
00053 break;
00054 case MATCH_SHEMKWAY:
00055 if (clevel < 1 || cgraph->nedges == 0)
00056 MCMatch_RM(ctrl, cgraph);
00057 else
00058 MCMatch_SHEM(ctrl, cgraph);
00059 break;
00060 case MATCH_SHEBM_ONENORM:
00061 if (clevel < 1 || cgraph->nedges == 0)
00062 MCMatch_RM(ctrl, cgraph);
00063 else
00064 MCMatch_SHEBM(ctrl, cgraph, 1);
00065 break;
00066 case MATCH_SHEBM_INFNORM:
00067 if (clevel < 1 || cgraph->nedges == 0)
00068 MCMatch_RM(ctrl, cgraph);
00069 else
00070 MCMatch_SHEBM(ctrl, cgraph, -1);
00071 break;
00072 case MATCH_SBHEM_ONENORM:
00073 if (clevel < 1 || cgraph->nedges == 0)
00074 MCMatch_RM(ctrl, cgraph);
00075 else
00076 MCMatch_SBHEM(ctrl, cgraph, 1);
00077 break;
00078 case MATCH_SBHEM_INFNORM:
00079 if (clevel < 1 || cgraph->nedges == 0)
00080 MCMatch_RM(ctrl, cgraph);
00081 else
00082 MCMatch_SBHEM(ctrl, cgraph, -1);
00083 break;
00084 default:
00085 errexit("Unknown CType: %d\n", ctrl->CType);
00086 }
00087
00088 cgraph = cgraph->coarser;
00089 clevel++;
00090
00091 } while (cgraph->nvtxs > ctrl->CoarsenTo && cgraph->nvtxs < COARSEN_FRACTION2*cgraph->finer->nvtxs && cgraph->nedges > cgraph->nvtxs/2);
00092
00093 if (ctrl->dbglvl&DBG_COARSEN) {
00094 printf("%6d %7d %10d [%d] [%6.4f", cgraph->nvtxs, cgraph->nedges,
00095 idxsum(cgraph->nvtxs, cgraph->adjwgtsum), ctrl->CoarsenTo, ctrl->nmaxvwgt);
00096 for (i=0; i<graph->ncon; i++)
00097 printf(" %5.3f", ssum_strd(cgraph->nvtxs, cgraph->nvwgt+i, cgraph->ncon));
00098 printf("]\n");
00099 }
00100
00101
00102 IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->CoarsenTmr));
00103
00104 return cgraph;
00105 }
00106