diff --git a/.gitignore b/.gitignore index bf123be..11b86a3 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,6 @@ graphs/*.npart.* GKlib .svn/ +# VSCode things +.vscode/ + diff --git a/CMakeLists.txt b/CMakeLists.txt index a15d19a..869daf6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,20 +19,20 @@ endif(SHARED) include(./conf/gkbuild.cmake) # METIS' custom options -#option(IDX64 "enable 64 bit ints" OFF) -#option(REAL64 "enable 64 bit floats (i.e., double)" OFF) -#if(IDX64) -# set(METIS_COPTIONS "${METIS_COPTIONS} -DIDXTYPEWIDTH=64") -#else() -# set(METIS_COPTIONS "${METIS_COPTIONS} -DIDXTYPEWIDTH=32") -#endif(IDX64) -#if(REAL64) -# set(METIS_COPTIONS "${METIS_COPTIONS} -DREALTYPEWIDTH=64") -#else() -# set(METIS_COPTIONS "${METIS_COPTIONS} -DREALTYPEWIDTH=32") -#endif(REAL64) -# -#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${METIS_COPTIONS}") +option(IDX64 "enable 64 bit ints" OFF) +option(REAL64 "enable 64 bit floats (i.e., double)" OFF) +if(IDX64) + set(METIS_COPTIONS "${METIS_COPTIONS} -DIDXTYPEWIDTH=64") +else() + set(METIS_COPTIONS "${METIS_COPTIONS} -DIDXTYPEWIDTH=32") +endif(IDX64) +if(REAL64) + set(METIS_COPTIONS "${METIS_COPTIONS} -DREALTYPEWIDTH=64") +else() + set(METIS_COPTIONS "${METIS_COPTIONS} -DREALTYPEWIDTH=32") +endif(REAL64) + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${METIS_COPTIONS}") # Add include directories. diff --git a/libmetis/defs.h b/libmetis/defs.h index c18350f..4f274d9 100644 --- a/libmetis/defs.h +++ b/libmetis/defs.h @@ -57,4 +57,7 @@ #define KMETIS_DEFAULT_UFACTOR 30 #define OMETIS_DEFAULT_UFACTOR 200 +/* Metis error during recursive bisection */ +#define METIS_ERR_INVALID_BISECTION -999999 + #endif diff --git a/libmetis/pmetis.c b/libmetis/pmetis.c index 9174aa3..3e7af0d 100644 --- a/libmetis/pmetis.c +++ b/libmetis/pmetis.c @@ -132,6 +132,9 @@ int METIS_PartGraphRecursive(idx_t *nvtxs, idx_t *ncon, idx_t *xadj, iset(*nvtxs, 0, part); *objval = (*nparts == 1 ? 0 : MlevelRecursiveBisection(ctrl, graph, *nparts, part, ctrl->tpwgts, 0)); + if (*objval == METIS_ERR_INVALID_BISECTION) + return metis_rcode(METIS_ERR_INVALID_BISECTION); + IFSET(ctrl->dbglvl, METIS_DBG_TIME, gk_stopcputimer(ctrl->TotalTmr)); IFSET(ctrl->dbglvl, METIS_DBG_TIME, PrintTimers(ctrl)); @@ -165,7 +168,7 @@ idx_t MlevelRecursiveBisection(ctrl_t *ctrl, graph_t *graph, idx_t nparts, if ((nvtxs = graph->nvtxs) == 0) { printf("\t***Cannot bisect a graph with 0 vertices!\n" "\t***You are trying to partition a graph into too many parts!\n"); - return 0; + return METIS_ERR_INVALID_BISECTION; } ncon = graph->ncon; @@ -203,16 +206,28 @@ idx_t MlevelRecursiveBisection(ctrl_t *ctrl, graph_t *graph, idx_t nparts, } /* Do the recursive call */ + idx_t lobjval, robjval; if (nparts > 3) { - objval += MlevelRecursiveBisection(ctrl, lgraph, (nparts>>1), part, + lobjval = MlevelRecursiveBisection(ctrl, lgraph, (nparts>>1), part, tpwgts, fpart); - objval += MlevelRecursiveBisection(ctrl, rgraph, nparts-(nparts>>1), part, + robjval = MlevelRecursiveBisection(ctrl, rgraph, nparts-(nparts>>1), part, tpwgts+(nparts>>1)*ncon, fpart+(nparts>>1)); + + if (lobjval != METIS_ERR_INVALID_BISECTION && robjval != METIS_ERR_INVALID_BISECTION) { + objval += lobjval + robjval; + } + else + objval = METIS_ERR_INVALID_BISECTION; } else if (nparts == 3) { FreeGraph(&lgraph); - objval += MlevelRecursiveBisection(ctrl, rgraph, nparts-(nparts>>1), part, + robjval = MlevelRecursiveBisection(ctrl, rgraph, nparts-(nparts>>1), part, tpwgts+(nparts>>1)*ncon, fpart+(nparts>>1)); + if (robjval != METIS_ERR_INVALID_BISECTION) { + objval += robjval; + } + else + objval = METIS_ERR_INVALID_BISECTION; }