Path: blob/devel/elmergrid/src/metis-5.1.0/libmetis/proto.h
3206 views
/*1* Copyright 1997, Regents of the University of Minnesota2*3* proto.h4*5* This file contains header files6*7* Started 10/19/958* George9*10* $Id: proto.h 13933 2013-03-29 22:20:46Z karypis $11*12*/1314#ifndef _LIBMETIS_PROTO_H_15#define _LIBMETIS_PROTO_H_1617/* auxapi.c */1819/* balance.c */20void Balance2Way(ctrl_t *ctrl, graph_t *graph, real_t *ntpwgts);21void Bnd2WayBalance(ctrl_t *ctrl, graph_t *graph, real_t *ntpwgts);22void General2WayBalance(ctrl_t *ctrl, graph_t *graph, real_t *ntpwgts);23void McGeneral2WayBalance(ctrl_t *ctrl, graph_t *graph, real_t *ntpwgts);242526/* bucketsort.c */27void BucketSortKeysInc(ctrl_t *ctrl, idx_t n, idx_t max, idx_t *keys,28idx_t *tperm, idx_t *perm);293031/* checkgraph.c */32int CheckGraph(graph_t *graph, int numflag, int verbose);33int CheckInputGraphWeights(idx_t nvtxs, idx_t ncon, idx_t *xadj, idx_t *adjncy,34idx_t *vwgt, idx_t *vsize, idx_t *adjwgt);35graph_t *FixGraph(graph_t *graph);363738/* coarsen.c */39graph_t *CoarsenGraph(ctrl_t *ctrl, graph_t *graph);40graph_t *CoarsenGraphNlevels(ctrl_t *ctrl, graph_t *graph, idx_t nlevels);41idx_t Match_RM(ctrl_t *ctrl, graph_t *graph);42idx_t Match_SHEM(ctrl_t *ctrl, graph_t *graph);43idx_t Match_2Hop(ctrl_t *ctrl, graph_t *graph, idx_t *perm, idx_t *match,44idx_t cnvtxs, size_t nunmatched);45idx_t Match_2HopAny(ctrl_t *ctrl, graph_t *graph, idx_t *perm, idx_t *match,46idx_t cnvtxs, size_t *r_nunmatched, size_t maxdegree);47idx_t Match_2HopAll(ctrl_t *ctrl, graph_t *graph, idx_t *perm, idx_t *match,48idx_t cnvtxs, size_t *r_nunmatched, size_t maxdegree);49void PrintCGraphStats(ctrl_t *ctrl, graph_t *graph);50void CreateCoarseGraph(ctrl_t *ctrl, graph_t *graph, idx_t cnvtxs,51idx_t *match);52void CreateCoarseGraphNoMask(ctrl_t *ctrl, graph_t *graph, idx_t cnvtxs,53idx_t *match);54void CreateCoarseGraphPerm(ctrl_t *ctrl, graph_t *graph, idx_t cnvtxs,55idx_t *match, idx_t *perm);56graph_t *SetupCoarseGraph(graph_t *graph, idx_t cnvtxs, idx_t dovsize);57void ReAdjustMemory(ctrl_t *ctrl, graph_t *graph, graph_t *cgraph);58596061/* compress.c */62graph_t *CompressGraph(ctrl_t *ctrl, idx_t nvtxs, idx_t *xadj, idx_t *adjncy,63idx_t *vwgt, idx_t *cptr, idx_t *cind);64graph_t *PruneGraph(ctrl_t *ctrl, idx_t nvtxs, idx_t *xadj, idx_t *adjncy,65idx_t *vwgt, idx_t *iperm, real_t factor);666768/* contig.c */69idx_t FindPartitionInducedComponents(graph_t *graph, idx_t *where,70idx_t *cptr, idx_t *cind);71void ComputeBFSOrdering(ctrl_t *ctrl, graph_t *graph, idx_t *bfsperm);72idx_t IsConnected(graph_t *graph, idx_t report);73idx_t IsConnectedSubdomain(ctrl_t *, graph_t *, idx_t, idx_t);74idx_t FindSepInducedComponents(ctrl_t *, graph_t *, idx_t *, idx_t *);75void EliminateComponents(ctrl_t *ctrl, graph_t *graph);76void MoveGroupContigForCut(ctrl_t *ctrl, graph_t *graph, idx_t to, idx_t gid,77idx_t *ptr, idx_t *ind);78void MoveGroupContigForVol(ctrl_t *ctrl, graph_t *graph, idx_t to, idx_t gid,79idx_t *ptr, idx_t *ind, idx_t *vmarker, idx_t *pmarker,80idx_t *modind);818283/* debug.c */84idx_t ComputeCut(graph_t *graph, idx_t *where);85idx_t ComputeVolume(graph_t *, idx_t *);86idx_t ComputeMaxCut(graph_t *graph, idx_t nparts, idx_t *where);87idx_t CheckBnd(graph_t *);88idx_t CheckBnd2(graph_t *);89idx_t CheckNodeBnd(graph_t *, idx_t);90idx_t CheckRInfo(ctrl_t *ctrl, ckrinfo_t *rinfo);91idx_t CheckNodePartitionParams(graph_t *);92idx_t IsSeparable(graph_t *);93void CheckKWayVolPartitionParams(ctrl_t *ctrl, graph_t *graph);949596/* fm.c */97void FM_2WayRefine(ctrl_t *ctrl, graph_t *graph, real_t *ntpwgts, idx_t niter);98void FM_2WayCutRefine(ctrl_t *ctrl, graph_t *graph, real_t *ntpwgts, idx_t niter);99void FM_Mc2WayCutRefine(ctrl_t *ctrl, graph_t *graph, real_t *ntpwgts, idx_t niter);100void SelectQueue(graph_t *graph, real_t *pijbm, real_t *ubfactors, rpq_t **queues,101idx_t *from, idx_t *cnum);102void Print2WayRefineStats(ctrl_t *ctrl, graph_t *graph, real_t *ntpwgts,103real_t deltabal, idx_t mincutorder);104105106/* fortran.c */107void Change2CNumbering(idx_t, idx_t *, idx_t *);108void Change2FNumbering(idx_t, idx_t *, idx_t *, idx_t *);109void Change2FNumbering2(idx_t, idx_t *, idx_t *);110void Change2FNumberingOrder(idx_t, idx_t *, idx_t *, idx_t *, idx_t *);111void ChangeMesh2CNumbering(idx_t n, idx_t *ptr, idx_t *ind);112void ChangeMesh2FNumbering(idx_t n, idx_t *ptr, idx_t *ind, idx_t nvtxs,113idx_t *xadj, idx_t *adjncy);114void ChangeMesh2FNumbering2(idx_t ne, idx_t nn, idx_t *ptr, idx_t *ind,115idx_t *epart, idx_t *npart);116117118/* graph.c */119graph_t *SetupGraph(ctrl_t *ctrl, idx_t nvtxs, idx_t ncon, idx_t *xadj,120idx_t *adjncy, idx_t *vwgt, idx_t *vsize, idx_t *adjwgt);121void SetupGraph_tvwgt(graph_t *graph);122void SetupGraph_label(graph_t *graph);123graph_t *SetupSplitGraph(graph_t *graph, idx_t snvtxs, idx_t snedges);124graph_t *CreateGraph(void);125void InitGraph(graph_t *graph);126void FreeRData(graph_t *graph);127void FreeGraph(graph_t **graph);128129130/* initpart.c */131void Init2WayPartition(ctrl_t *ctrl, graph_t *graph, real_t *ntpwgts, idx_t niparts);132void InitSeparator(ctrl_t *ctrl, graph_t *graph, idx_t niparts);133void RandomBisection(ctrl_t *ctrl, graph_t *graph, real_t *ntpwgts, idx_t niparts);134void GrowBisection(ctrl_t *ctrl, graph_t *graph, real_t *ntpwgts, idx_t niparts);135void McRandomBisection(ctrl_t *ctrl, graph_t *graph, real_t *ntpwgts, idx_t niparts);136void McGrowBisection(ctrl_t *ctrl, graph_t *graph, real_t *ntpwgts, idx_t niparts);137void GrowBisectionNode(ctrl_t *ctrl, graph_t *graph, real_t *ntpwgts, idx_t niparts);138void GrowBisectionNode2(ctrl_t *ctrl, graph_t *graph, real_t *ntpwgts, idx_t niparts);139140141/* kmetis.c */142idx_t MlevelKWayPartitioning(ctrl_t *ctrl, graph_t *graph, idx_t *part);143void InitKWayPartitioning(ctrl_t *ctrl, graph_t *graph);144145146/* kwayfm.c */147void Greedy_KWayOptimize(ctrl_t *ctrl, graph_t *graph, idx_t niter,148real_t ffactor, idx_t omode);149void Greedy_KWayCutOptimize(ctrl_t *ctrl, graph_t *graph, idx_t niter,150real_t ffactor, idx_t omode);151void Greedy_KWayVolOptimize(ctrl_t *ctrl, graph_t *graph, idx_t niter,152real_t ffactor, idx_t omode);153void Greedy_McKWayCutOptimize(ctrl_t *ctrl, graph_t *graph, idx_t niter,154real_t ffactor, idx_t omode);155void Greedy_McKWayVolOptimize(ctrl_t *ctrl, graph_t *graph, idx_t niter,156real_t ffactor, idx_t omode);157idx_t IsArticulationNode(idx_t i, idx_t *xadj, idx_t *adjncy, idx_t *where,158idx_t *bfslvl, idx_t *bfsind, idx_t *bfsmrk);159void KWayVolUpdate(ctrl_t *ctrl, graph_t *graph, idx_t v, idx_t from,160idx_t to, ipq_t *queue, idx_t *vstatus, idx_t *r_nupd, idx_t *updptr,161idx_t *updind, idx_t bndtype, idx_t *vmarker, idx_t *pmarker,162idx_t *modind);163164165/* kwayrefine.c */166void RefineKWay(ctrl_t *ctrl, graph_t *orggraph, graph_t *graph);167void AllocateKWayPartitionMemory(ctrl_t *ctrl, graph_t *graph);168void ComputeKWayPartitionParams(ctrl_t *ctrl, graph_t *graph);169void ProjectKWayPartition(ctrl_t *ctrl, graph_t *graph);170void ComputeKWayBoundary(ctrl_t *ctrl, graph_t *graph, idx_t bndtype);171void ComputeKWayVolGains(ctrl_t *ctrl, graph_t *graph);172int IsBalanced(ctrl_t *ctrl, graph_t *graph, real_t ffactor);173174175/* mcutil.c */176int rvecle(idx_t n, real_t *x, real_t *y);177int rvecge(idx_t n, real_t *x, real_t *y);178int rvecsumle(idx_t n, real_t *x1, real_t *x2, real_t *y);179real_t rvecmaxdiff(idx_t n, real_t *x, real_t *y);180int ivecle(idx_t n, idx_t *x, idx_t *z);181int ivecge(idx_t n, idx_t *x, idx_t *z);182int ivecaxpylez(idx_t n, idx_t a, idx_t *x, idx_t *y, idx_t *z);183int ivecaxpygez(idx_t n, idx_t a, idx_t *x, idx_t *y, idx_t *z);184int BetterVBalance(idx_t ncon, real_t *itvwgt, idx_t *v_vwgt, idx_t *u1_vwgt,185idx_t *u2_vwgt);186int BetterBalance2Way(idx_t n, real_t *x, real_t *y);187int BetterBalanceKWay(idx_t ncon, idx_t *vwgt, real_t *itvwgt, idx_t a1,188idx_t *pt1, real_t *bm1, idx_t a2, idx_t *pt2, real_t *bm2);189real_t ComputeLoadImbalance(graph_t *graph, idx_t nparts, real_t *pijbm);190real_t ComputeLoadImbalanceDiff(graph_t *graph, idx_t nparts, real_t *pijbm,191real_t *ubvec);192real_t ComputeLoadImbalanceDiffVec(graph_t *graph, idx_t nparts, real_t *pijbm,193real_t *ubfactors, real_t *diffvec);194void ComputeLoadImbalanceVec(graph_t *graph, idx_t nparts, real_t *pijbm,195real_t *lbvec);196197198/* mesh.c */199void CreateGraphDual(idx_t ne, idx_t nn, idx_t *eptr, idx_t *eind, idx_t ncommon,200idx_t **r_xadj, idx_t **r_adjncy);201idx_t FindCommonElements(idx_t qid, idx_t elen, idx_t *eind, idx_t *nptr,202idx_t *nind, idx_t *eptr, idx_t ncommon, idx_t *marker, idx_t *nbrs);203void CreateGraphNodal(idx_t ne, idx_t nn, idx_t *eptr, idx_t *eind, idx_t **r_xadj,204idx_t **r_adjncy);205idx_t FindCommonNodes(idx_t qid, idx_t nelmnts, idx_t *elmntids, idx_t *eptr,206idx_t *eind, idx_t *marker, idx_t *nbrs);207mesh_t *CreateMesh(void);208void InitMesh(mesh_t *mesh);209void FreeMesh(mesh_t **mesh);210211212/* meshpart.c */213void InduceRowPartFromColumnPart(idx_t nrows, idx_t *rowptr, idx_t *rowind,214idx_t *rpart, idx_t *cpart, idx_t nparts, real_t *tpwgts);215216217/* minconn.c */218void ComputeSubDomainGraph(ctrl_t *ctrl, graph_t *graph);219void UpdateEdgeSubDomainGraph(ctrl_t *ctrl, idx_t u, idx_t v, idx_t ewgt,220idx_t *r_maxndoms);221void PrintSubDomainGraph(graph_t *graph, idx_t nparts, idx_t *where);222void EliminateSubDomainEdges(ctrl_t *ctrl, graph_t *graph);223void MoveGroupMinConnForCut(ctrl_t *ctrl, graph_t *graph, idx_t to, idx_t nind,224idx_t *ind);225void MoveGroupMinConnForVol(ctrl_t *ctrl, graph_t *graph, idx_t to, idx_t nind,226idx_t *ind, idx_t *vmarker, idx_t *pmarker, idx_t *modind);227228229/* mincover.o */230void MinCover(idx_t *, idx_t *, idx_t, idx_t, idx_t *, idx_t *);231idx_t MinCover_Augment(idx_t *, idx_t *, idx_t, idx_t *, idx_t *, idx_t *, idx_t);232void MinCover_Decompose(idx_t *, idx_t *, idx_t, idx_t, idx_t *, idx_t *, idx_t *);233void MinCover_ColDFS(idx_t *, idx_t *, idx_t, idx_t *, idx_t *, idx_t);234void MinCover_RowDFS(idx_t *, idx_t *, idx_t, idx_t *, idx_t *, idx_t);235236237/* mmd.c */238void genmmd(idx_t, idx_t *, idx_t *, idx_t *, idx_t *, idx_t , idx_t *, idx_t *, idx_t *, idx_t *, idx_t, idx_t *);239void mmdelm(idx_t, idx_t *xadj, idx_t *, idx_t *, idx_t *, idx_t *, idx_t *, idx_t *, idx_t *, idx_t, idx_t);240idx_t mmdint(idx_t, idx_t *xadj, idx_t *, idx_t *, idx_t *, idx_t *, idx_t *, idx_t *, idx_t *);241void mmdnum(idx_t, idx_t *, idx_t *, idx_t *);242void mmdupd(idx_t, idx_t, idx_t *, idx_t *, idx_t, idx_t *, idx_t *, idx_t *, idx_t *, idx_t *, idx_t *, idx_t *, idx_t, idx_t *tag);243244245/* ometis.c */246void MlevelNestedDissection(ctrl_t *ctrl, graph_t *graph, idx_t *order,247idx_t lastvtx);248void MlevelNestedDissectionCC(ctrl_t *ctrl, graph_t *graph, idx_t *order,249idx_t lastvtx);250void MlevelNodeBisectionMultiple(ctrl_t *ctrl, graph_t *graph);251void MlevelNodeBisectionL2(ctrl_t *ctrl, graph_t *graph, idx_t niparts);252void MlevelNodeBisectionL1(ctrl_t *ctrl, graph_t *graph, idx_t niparts);253void SplitGraphOrder(ctrl_t *ctrl, graph_t *graph, graph_t **r_lgraph,254graph_t **r_rgraph);255graph_t **SplitGraphOrderCC(ctrl_t *ctrl, graph_t *graph, idx_t ncmps,256idx_t *cptr, idx_t *cind);257void MMDOrder(ctrl_t *ctrl, graph_t *graph, idx_t *order, idx_t lastvtx);258259260/* options.c */261ctrl_t *SetupCtrl(moptype_et optype, idx_t *options, idx_t ncon, idx_t nparts,262real_t *tpwgts, real_t *ubvec);263void SetupKWayBalMultipliers(ctrl_t *ctrl, graph_t *graph);264void Setup2WayBalMultipliers(ctrl_t *ctrl, graph_t *graph, real_t *tpwgts);265void PrintCtrl(ctrl_t *ctrl);266int CheckParams(ctrl_t *ctrl);267void FreeCtrl(ctrl_t **r_ctrl);268269270/* parmetis.c */271void MlevelNestedDissectionP(ctrl_t *ctrl, graph_t *graph, idx_t *order,272idx_t lastvtx, idx_t npes, idx_t cpos, idx_t *sizes);273void FM_2WayNodeRefine1SidedP(ctrl_t *ctrl, graph_t *graph, idx_t *hmarker,274real_t ubfactor, idx_t npasses);275void FM_2WayNodeRefine2SidedP(ctrl_t *ctrl, graph_t *graph, idx_t *hmarker,276real_t ubfactor, idx_t npasses);277278279/* pmetis.c */280idx_t MlevelRecursiveBisection(ctrl_t *ctrl, graph_t *graph, idx_t nparts,281idx_t *part, real_t *tpwgts, idx_t fpart);282idx_t MultilevelBisect(ctrl_t *ctrl, graph_t *graph, real_t *tpwgts);283void SplitGraphPart(ctrl_t *ctrl, graph_t *graph, graph_t **r_lgraph, graph_t **r_rgraph);284285286/* refine.c */287void Refine2Way(ctrl_t *ctrl, graph_t *orggraph, graph_t *graph, real_t *rtpwgts);288void Allocate2WayPartitionMemory(ctrl_t *ctrl, graph_t *graph);289void Compute2WayPartitionParams(ctrl_t *ctrl, graph_t *graph);290void Project2WayPartition(ctrl_t *ctrl, graph_t *graph);291292293/* separator.c */294void ConstructSeparator(ctrl_t *ctrl, graph_t *graph);295void ConstructMinCoverSeparator(ctrl_t *ctrl, graph_t *graph);296297298/* sfm.c */299void FM_2WayNodeRefine2Sided(ctrl_t *ctrl, graph_t *graph, idx_t niter);300void FM_2WayNodeRefine1Sided(ctrl_t *ctrl, graph_t *graph, idx_t niter);301void FM_2WayNodeBalance(ctrl_t *ctrl, graph_t *graph);302303304/* srefine.c */305void Refine2WayNode(ctrl_t *ctrl, graph_t *orggraph, graph_t *graph);306void Allocate2WayNodePartitionMemory(ctrl_t *ctrl, graph_t *graph);307void Compute2WayNodePartitionParams(ctrl_t *ctrl, graph_t *graph);308void Project2WayNodePartition(ctrl_t *ctrl, graph_t *graph);309310311/* stat.c */312void ComputePartitionInfoBipartite(graph_t *, idx_t, idx_t *);313void ComputePartitionBalance(graph_t *, idx_t, idx_t *, real_t *);314real_t ComputeElementBalance(idx_t, idx_t, idx_t *);315316317/* timing.c */318void InitTimers(ctrl_t *);319void PrintTimers(ctrl_t *);320321/* util.c */322idx_t iargmax_strd(size_t, idx_t *, idx_t);323idx_t iargmax_nrm(size_t n, idx_t *x, real_t *y);324idx_t iargmax2_nrm(size_t n, idx_t *x, real_t *y);325idx_t rargmax2(size_t, real_t *);326void InitRandom(idx_t);327int metis_rcode(int sigrval);328329330331/* wspace.c */332void AllocateWorkSpace(ctrl_t *ctrl, graph_t *graph);333void AllocateRefinementWorkSpace(ctrl_t *ctrl, idx_t nbrpoolsize);334void FreeWorkSpace(ctrl_t *ctrl);335void *wspacemalloc(ctrl_t *ctrl, size_t nbytes);336void wspacepush(ctrl_t *ctrl);337void wspacepop(ctrl_t *ctrl);338idx_t *iwspacemalloc(ctrl_t *, idx_t);339real_t *rwspacemalloc(ctrl_t *, idx_t);340ikv_t *ikvwspacemalloc(ctrl_t *, idx_t);341void cnbrpoolReset(ctrl_t *ctrl);342idx_t cnbrpoolGetNext(ctrl_t *ctrl, idx_t nnbrs);343void vnbrpoolReset(ctrl_t *ctrl);344idx_t vnbrpoolGetNext(ctrl_t *ctrl, idx_t nnbrs);345346347#endif348349350