Files
2008-04-15 18:56:58 +01:00

510 lines
29 KiB
C

/*
* Copyright 1997, Regents of the University of Minnesota
*
* proto.h
*
* This file contains header files
*
* Started 10/19/95
* George
*
* $Id: proto.h,v 1.27 2003/05/03 16:10:48 karypis Exp $
*
*/
#ifndef _LIBMETIS_PROTO_H_
#define _LIBMETIS_PROTO_H_
/* balance.c */
void Balance2Way(CtrlType *, GraphType *, idxtype *, float);
void Bnd2WayBalance(CtrlType *, GraphType *, idxtype *);
void General2WayBalance(CtrlType *, GraphType *, idxtype *);
/* bucketsort.c */
void BucketSortKeysInc(idxtype, idxtype, idxtype *, idxtype *, idxtype *);
/* ccgraph.c */
void CreateCoarseGraph(CtrlType *, GraphType *, idxtype, idxtype *, idxtype *);
void CreateCoarseGraphNoMask(CtrlType *, GraphType *, idxtype, idxtype *, idxtype *);
void CreateCoarseGraph_NVW(CtrlType *, GraphType *, idxtype, idxtype *, idxtype *);
GraphType *SetUpCoarseGraph(GraphType *, idxtype, idxtype);
void ReAdjustMemory(GraphType *, GraphType *, idxtype);
/* coarsen.c */
GraphType *Coarsen2Way(CtrlType *, GraphType *);
/* compress.c */
void CompressGraph(CtrlType *, GraphType *, idxtype, idxtype *, idxtype *, idxtype *, idxtype *);
void PruneGraph(CtrlType *, GraphType *, idxtype, idxtype *, idxtype *, idxtype *, float);
/* debug.c */
idxtype ComputeCut(GraphType *, idxtype *);
idxtype ComputeMaxCut(GraphType *graph, idxtype nparts, idxtype *where);
idxtype CheckBnd(GraphType *);
idxtype CheckBnd2(GraphType *);
idxtype CheckNodeBnd(GraphType *, idxtype);
idxtype CheckRInfo(RInfoType *);
idxtype CheckNodePartitionParams(GraphType *);
idxtype IsSeparable(GraphType *);
/* estmem.c */
void EstimateCFraction(idxtype, idxtype *, idxtype *, float *, float *);
idxtype ComputeCoarseGraphSize(idxtype, idxtype *, idxtype *, idxtype, idxtype *, idxtype *, idxtype *);
/* fm.c */
void FM_2WayEdgeRefine(CtrlType *, GraphType *, idxtype *, idxtype);
/* fortran.c */
void Change2CNumbering(idxtype, idxtype *, idxtype *);
void Change2FNumbering(idxtype, idxtype *, idxtype *, idxtype *);
void Change2FNumbering2(idxtype, idxtype *, idxtype *);
void Change2FNumberingOrder(idxtype, idxtype *, idxtype *, idxtype *, idxtype *);
void ChangeMesh2CNumbering(idxtype, idxtype *);
void ChangeMesh2FNumbering(idxtype, idxtype *, idxtype, idxtype *, idxtype *);
void ChangeMesh2FNumbering2(idxtype, idxtype *, idxtype, idxtype, idxtype *, idxtype *);
void ChangeMesh2FNumbering3(idxtype, idxtype *);
/* frename.c */
void METIS_PARTGRAPHRECURSIVE(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_partgraphrecursive(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_partgraphrecursive_(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_partgraphrecursive__(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void METIS_WPARTGRAPHRECURSIVE(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, float *, idxtype *, idxtype *, idxtype *);
void metis_wpartgraphrecursive(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, float *, idxtype *, idxtype *, idxtype *);
void metis_wpartgraphrecursive_(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, float *, idxtype *, idxtype *, idxtype *);
void metis_wpartgraphrecursive__(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, float *, idxtype *, idxtype *, idxtype *);
void METIS_PARTGRAPHKWAY(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_partgraphkway(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_partgraphkway_(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_partgraphkway__(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void METIS_WPARTGRAPHKWAY(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, float *, idxtype *, idxtype *, idxtype *);
void metis_wpartgraphkway(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, float *, idxtype *, idxtype *, idxtype *);
void metis_wpartgraphkway_(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, float *, idxtype *, idxtype *, idxtype *);
void metis_wpartgraphkway__(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, float *, idxtype *, idxtype *, idxtype *);
void METIS_EDGEND(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_edgend(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_edgend_(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_edgend__(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void METIS_NODEND(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_nodend(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_nodend_(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_nodend__(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void METIS_NODEWND(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_nodewnd(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_nodewnd_(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_nodewnd__(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void METIS_PARTMESHNODAL(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_partmeshnodal(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_partmeshnodal_(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_partmeshnodal__(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void METIS_PARTMESHDUAL(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype, idxtype *);
void metis_partmeshdual(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype, idxtype *);
void metis_partmeshdual_(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype, idxtype *);
void metis_partmeshdual__(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype, idxtype *);
void METIS_MESHTONODAL(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_meshtonodal(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_meshtonodal_(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_meshtonodal__(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void METIS_MESHTODUAL(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_meshtodual(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_meshtodual_(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_meshtodual__(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void METIS_ESTIMATEMEMORY(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_estimatememory(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_estimatememory_(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_estimatememory__(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void METIS_MCPARTGRAPHRECURSIVE(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_mcpartgraphrecursive(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_mcpartgraphrecursive_(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_mcpartgraphrecursive__(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void METIS_MCPARTGRAPHKWAY(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, float *, idxtype *, idxtype *, idxtype *);
void metis_mcpartgraphkway(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, float *, idxtype *, idxtype *, idxtype *);
void metis_mcpartgraphkway_(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, float *, idxtype *, idxtype *, idxtype *);
void metis_mcpartgraphkway__(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, float *, idxtype *, idxtype *, idxtype *);
void METIS_PARTGRAPHVKWAY(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_partgraphvkway(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_partgraphvkway_(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void metis_partgraphvkway__(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void METIS_WPARTGRAPHVKWAY(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, float *, idxtype *, idxtype *, idxtype *);
void metis_wpartgraphvkway(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, float *, idxtype *, idxtype *, idxtype *);
void metis_wpartgraphvkway_(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, float *, idxtype *, idxtype *, idxtype *);
void metis_wpartgraphvkway__(idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, float *, idxtype *, idxtype *, idxtype *);
/* graph.c */
void SetUpGraph(GraphType *, idxtype, idxtype, idxtype, idxtype *, idxtype *, idxtype *, idxtype *, idxtype);
void SetUpGraph2(GraphType *, idxtype, idxtype, idxtype *, idxtype *, float *, idxtype *);
void VolSetUpGraph(GraphType *, idxtype, idxtype, idxtype, idxtype *, idxtype *, idxtype *, idxtype *, idxtype);
void RandomizeGraph(GraphType *);
idxtype IsConnectedSubdomain(CtrlType *, GraphType *, idxtype, idxtype);
idxtype IsConnected(CtrlType *, GraphType *, idxtype);
idxtype IsConnected2(GraphType *, idxtype);
idxtype FindComponents(CtrlType *, GraphType *, idxtype *, idxtype *);
/* initpart.c */
void Init2WayPartition(CtrlType *, GraphType *, idxtype *, float);
void InitSeparator(CtrlType *, GraphType *, float);
void GrowBisection(CtrlType *, GraphType *, idxtype *, float);
void GrowBisectionNode(CtrlType *, GraphType *, float);
void RandomBisection(CtrlType *, GraphType *, idxtype *, float);
/* kmetis.c */
idxtype MlevelKWayPartitioning(CtrlType *, GraphType *, idxtype, idxtype *, float *, float);
/* kvmetis.c */
idxtype MlevelVolKWayPartitioning(CtrlType *, GraphType *, idxtype, idxtype *, float *, float);
/* kwayfm.c */
void Random_KWayEdgeRefine(CtrlType *, GraphType *, idxtype, float *, float, idxtype, idxtype);
void Greedy_KWayEdgeRefine(CtrlType *, GraphType *, idxtype, float *, float, idxtype);
void Greedy_KWayEdgeBalance(CtrlType *, GraphType *, idxtype, float *, float, idxtype);
/* kwayrefine.c */
void RefineKWay(CtrlType *, GraphType *, GraphType *, idxtype, float *, float);
void RefineKWayRefinement(CtrlType *, GraphType *, GraphType *, idxtype, float *, float);
void AllocateKWayPartitionMemory(CtrlType *, GraphType *, idxtype);
void ComputeKWayPartitionParams(CtrlType *, GraphType *, idxtype);
void ProjectKWayPartition(CtrlType *, GraphType *, idxtype);
idxtype IsBalanced(idxtype *, idxtype, float *, float);
void ComputeKWayBoundary(CtrlType *, GraphType *, idxtype);
void ComputeKWayBalanceBoundary(CtrlType *, GraphType *, idxtype);
/* kwayvolfm.c */
void Random_KWayVolRefine(CtrlType *, GraphType *, idxtype, float *, float, idxtype, idxtype);
void Random_KWayVolRefineMConn(CtrlType *, GraphType *, idxtype, float *, float, idxtype, idxtype);
void Greedy_KWayVolBalance(CtrlType *, GraphType *, idxtype, float *, float, idxtype);
void Greedy_KWayVolBalanceMConn(CtrlType *, GraphType *, idxtype, float *, float, idxtype);
void KWayVolUpdate(CtrlType *, GraphType *, idxtype, idxtype, idxtype, idxtype *, idxtype *, idxtype *);
void ComputeKWayVolume(GraphType *, idxtype, idxtype *, idxtype *, idxtype *);
idxtype ComputeVolume(GraphType *, idxtype *);
void CheckVolKWayPartitionParams(CtrlType *, GraphType *, idxtype);
void ComputeVolSubDomainGraph(GraphType *, idxtype, idxtype *, idxtype *);
void EliminateVolSubDomainEdges(CtrlType *, GraphType *, idxtype, float *);
void EliminateVolComponents(CtrlType *, GraphType *, idxtype, float *, float);
/* kwayvolrefine.c */
void RefineVolKWay(CtrlType *, GraphType *, GraphType *, idxtype, float *, float);
void AllocateVolKWayPartitionMemory(CtrlType *, GraphType *, idxtype);
void ComputeVolKWayPartitionParams(CtrlType *, GraphType *, idxtype);
void ComputeKWayVolGains(CtrlType *, GraphType *, idxtype);
void ProjectVolKWayPartition(CtrlType *, GraphType *, idxtype);
void ComputeVolKWayBoundary(CtrlType *, GraphType *, idxtype);
void ComputeVolKWayBalanceBoundary(CtrlType *, GraphType *, idxtype);
/* match.c */
void Match_RM(CtrlType *, GraphType *);
void Match_RM_NVW(CtrlType *, GraphType *);
void Match_HEM(CtrlType *, GraphType *);
void Match_SHEM(CtrlType *, GraphType *);
/* mbalance.c */
void MocBalance2Way(CtrlType *, GraphType *, float *, float);
void MocGeneral2WayBalance(CtrlType *, GraphType *, float *, float);
/* mbalance2.c */
void MocBalance2Way2(CtrlType *, GraphType *, float *, float *);
void MocGeneral2WayBalance2(CtrlType *, GraphType *, float *, float *);
void SelectQueue3(idxtype, float *, float *, idxtype *, idxtype *, PQueueType [MAXNCON][2], float *);
/* mcoarsen.c */
GraphType *MCCoarsen2Way(CtrlType *, GraphType *);
/* memory.c */
void AllocateWorkSpace(CtrlType *, GraphType *, idxtype);
void FreeWorkSpace(CtrlType *, GraphType *);
idxtype WspaceAvail(CtrlType *);
idxtype *idxwspacemalloc(CtrlType *, idxtype);
void idxwspacefree(CtrlType *, idxtype);
float *fwspacemalloc(CtrlType *, idxtype);
void fwspacefree(CtrlType *, idxtype);
GraphType *CreateGraph(void);
void InitGraph(GraphType *);
void FreeRData(GraphType *);
void FreeGraph(GraphType *, int flag);
/* mesh.c */
idxtype GENDUALMETIS_COUNT(idxtype , idxtype , idxtype , idxtype *, idxtype *);
void GENDUALMETIS(idxtype, idxtype, idxtype, idxtype *, idxtype *, idxtype *, idxtype *adjncy);
void TRINODALMETIS(idxtype, idxtype, idxtype *, idxtype *, idxtype *adjncy);
void TETNODALMETIS(idxtype, idxtype, idxtype *, idxtype *, idxtype *adjncy);
void HEXNODALMETIS(idxtype, idxtype, idxtype *, idxtype *, idxtype *adjncy);
void QUADNODALMETIS(idxtype, idxtype, idxtype *, idxtype *, idxtype *adjncy);
void LINENODALMETIS(idxtype, idxtype, idxtype *, idxtype *, idxtype *adjncy);
/* meshpart.c */
/* mfm.c */
void MocFM_2WayEdgeRefine(CtrlType *, GraphType *, float *, idxtype);
void SelectQueue(idxtype, float *, float *, idxtype *, idxtype *, PQueueType [MAXNCON][2]);
idxtype BetterBalance(idxtype, float *, float *, float *);
float Compute2WayHLoadImbalance(idxtype, float *, float *);
void Compute2WayHLoadImbalanceVec(idxtype, float *, float *, float *);
/* mfm2.c */
void MocFM_2WayEdgeRefine2(CtrlType *, GraphType *, float *, float *, idxtype);
void SelectQueue2(idxtype, float *, float *, idxtype *, idxtype *, PQueueType [MAXNCON][2], float *);
idxtype IsBetter2wayBalance(idxtype, float *, float *, float *);
/* mincover.o */
void MinCover(idxtype *, idxtype *, idxtype, idxtype, idxtype *, idxtype *);
idxtype MinCover_Augment(idxtype *, idxtype *, idxtype, idxtype *, idxtype *, idxtype *, idxtype);
void MinCover_Decompose(idxtype *, idxtype *, idxtype, idxtype, idxtype *, idxtype *, idxtype *);
void MinCover_ColDFS(idxtype *, idxtype *, idxtype, idxtype *, idxtype *, idxtype);
void MinCover_RowDFS(idxtype *, idxtype *, idxtype, idxtype *, idxtype *, idxtype);
/* minitpart.c */
void MocInit2WayPartition(CtrlType *, GraphType *, float *, float);
void MocGrowBisection(CtrlType *, GraphType *, float *, float);
void MocRandomBisection(CtrlType *, GraphType *, float *, float);
void MocInit2WayBalance(CtrlType *, GraphType *, float *);
idxtype SelectQueueOneWay(idxtype ncon, float *npwgts, float *tpwgts, idxtype from, PQueueType queues[MAXNCON][2]);
/* minitpart2.c */
void MocInit2WayPartition2(CtrlType *, GraphType *, float *, float *);
void MocGrowBisection2(CtrlType *, GraphType *, float *, float *);
void MocGrowBisectionNew2(CtrlType *, GraphType *, float *, float *);
void MocInit2WayBalance2(CtrlType *, GraphType *, float *, float *);
idxtype SelectQueueOneWay2(idxtype ncon, float *pto, PQueueType queues[MAXNCON][2], float *ubvec);
/* mkmetis.c */
idxtype MCMlevelKWayPartitioning(CtrlType *, GraphType *, idxtype, idxtype *, float *);
/* mkwayfmh.c */
void MCRandom_KWayEdgeRefineHorizontal(CtrlType *, GraphType *, idxtype, float *, idxtype);
void MCGreedy_KWayEdgeBalanceHorizontal(CtrlType *, GraphType *, idxtype, float *, idxtype);
idxtype AreAllHVwgtsBelow(idxtype, float, float *, float, float *, float *);
idxtype AreAllHVwgtsAbove(idxtype, float, float *, float, float *, float *);
void ComputeHKWayLoadImbalance(idxtype, idxtype, float *, float *);
idxtype MocIsHBalanced(idxtype, idxtype, float *, float *);
idxtype IsHBalanceBetterFT(idxtype, idxtype, float *, float *, float *, float *);
idxtype IsHBalanceBetterTT(idxtype, idxtype, float *, float *, float *, float *);
/* mkwayrefine.c */
void MocRefineKWayHorizontal(CtrlType *, GraphType *, GraphType *, idxtype, float *);
void MocAllocateKWayPartitionMemory(CtrlType *, GraphType *, idxtype);
void MocComputeKWayPartitionParams(CtrlType *, GraphType *, idxtype);
void MocProjectKWayPartition(CtrlType *, GraphType *, idxtype);
void MocComputeKWayBalanceBoundary(CtrlType *, GraphType *, idxtype);
/* mmatch.c */
void MCMatch_RM(CtrlType *, GraphType *);
void MCMatch_HEM(CtrlType *, GraphType *);
void MCMatch_SHEM(CtrlType *, GraphType *);
void MCMatch_SHEBM(CtrlType *, GraphType *, idxtype);
void MCMatch_SBHEM(CtrlType *, GraphType *, idxtype);
float BetterVBalance(idxtype, idxtype, float *, float *, float *);
idxtype AreAllVwgtsBelowFast(idxtype, float *, float *, float);
/* mmd.c */
void genmmd(idxtype, idxtype *, idxtype *, idxtype *, idxtype *, idxtype , idxtype *, idxtype *, idxtype *, idxtype *, idxtype, idxtype *);
void mmdelm(idxtype, idxtype *xadj, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype, idxtype);
idxtype mmdint(idxtype, idxtype *xadj, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
void mmdnum(idxtype, idxtype *, idxtype *, idxtype *);
void mmdupd(idxtype, idxtype, idxtype *, idxtype *, idxtype, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype, idxtype *tag);
/* mpmetis.c */
idxtype MCMlevelRecursiveBisection(CtrlType *, GraphType *, idxtype, idxtype *, float, idxtype);
idxtype MCHMlevelRecursiveBisection(CtrlType *, GraphType *, idxtype, idxtype *, float *, idxtype);
void MCMlevelEdgeBisection(CtrlType *, GraphType *, float *, float);
void MCHMlevelEdgeBisection(CtrlType *, GraphType *, float *, float *);
/* mrefine.c */
void MocRefine2Way(CtrlType *, GraphType *, GraphType *, float *, float);
void MocAllocate2WayPartitionMemory(CtrlType *, GraphType *);
void MocCompute2WayPartitionParams(CtrlType *, GraphType *);
void MocProject2WayPartition(CtrlType *, GraphType *);
/* mrefine2.c */
void MocRefine2Way2(CtrlType *, GraphType *, GraphType *, float *, float *);
/* mutil.c */
idxtype AreAllVwgtsBelow(idxtype, float, float *, float, float *, float);
idxtype AreAnyVwgtsBelow(idxtype, float, float *, float, float *, float);
idxtype AreAllVwgtsAbove(idxtype, float, float *, float, float *, float);
float ComputeLoadImbalance(idxtype, idxtype, float *, float *);
idxtype AreAllBelow(idxtype, float *, float *);
/* myqsort.c */
void iidxsort(size_t, idxtype *);
void ikeysort(size_t, KeyValueType *);
void ikeyvalsort(size_t, KeyValueType *);
void idkeysort(size_t, DKeyValueType *);
/* ometis.c */
void MlevelNestedDissection(CtrlType *, GraphType *, idxtype *, float, idxtype);
void MlevelNestedDissectionCC(CtrlType *, GraphType *, idxtype *, float, idxtype);
void MlevelNodeBisectionMultiple(CtrlType *, GraphType *, idxtype *, float);
void MlevelNodeBisection(CtrlType *, GraphType *, idxtype *, float);
void SplitGraphOrder(CtrlType *, GraphType *, GraphType *, GraphType *);
void MMDOrder(CtrlType *, GraphType *, idxtype *, idxtype);
idxtype SplitGraphOrderCC(CtrlType *, GraphType *, GraphType *, idxtype, idxtype *, idxtype *);
/* parmetis.c */
void MlevelNestedDissectionP(CtrlType *, GraphType *, idxtype *, idxtype, idxtype, idxtype, idxtype *);
/* pmetis.c */
idxtype MlevelRecursiveBisection(CtrlType *, GraphType *, idxtype, idxtype *, float *, float, idxtype);
void MlevelEdgeBisection(CtrlType *, GraphType *, idxtype *, float);
void SplitGraphPart(CtrlType *, GraphType *, GraphType *, GraphType *);
void SetUpSplitGraph(GraphType *, GraphType *, idxtype, idxtype);
/* pqueue.c */
void PQueueInit(CtrlType *ctrl, PQueueType *, idxtype, idxtype);
void PQueueReset(PQueueType *);
void PQueueFree(CtrlType *ctrl, PQueueType *);
idxtype PQueueGetSize(PQueueType *);
idxtype PQueueInsert(PQueueType *, idxtype, idxtype);
idxtype PQueueDelete(PQueueType *, idxtype, idxtype);
idxtype PQueueUpdate(PQueueType *, idxtype, idxtype, idxtype);
void PQueueUpdateUp(PQueueType *, idxtype, idxtype, idxtype);
idxtype PQueueGetMax(PQueueType *);
idxtype PQueueSeeMax(PQueueType *);
idxtype PQueueGetKey(PQueueType *);
idxtype CheckHeap(PQueueType *);
/* refine.c */
void Refine2Way(CtrlType *, GraphType *, GraphType *, idxtype *, float ubfactor);
void Allocate2WayPartitionMemory(CtrlType *, GraphType *);
void Compute2WayPartitionParams(CtrlType *, GraphType *);
void Project2WayPartition(CtrlType *, GraphType *);
/* separator.c */
void ConstructSeparator(CtrlType *, GraphType *, float);
void ConstructMinCoverSeparator0(CtrlType *, GraphType *, float);
void ConstructMinCoverSeparator(CtrlType *, GraphType *, float);
/* sfm.c */
void FM_2WayNodeRefine(CtrlType *, GraphType *, float, idxtype);
void FM_2WayNodeRefineEqWgt(CtrlType *, GraphType *, idxtype);
void FM_2WayNodeRefine_OneSided(CtrlType *, GraphType *, float, idxtype);
void FM_2WayNodeBalance(CtrlType *, GraphType *, float);
idxtype ComputeMaxNodeGain(idxtype, idxtype *, idxtype *, idxtype *);
/* srefine.c */
void Refine2WayNode(CtrlType *, GraphType *, GraphType *, float);
void Allocate2WayNodePartitionMemory(CtrlType *, GraphType *);
void Compute2WayNodePartitionParams(CtrlType *, GraphType *);
void Project2WayNodePartition(CtrlType *, GraphType *);
/* stat.c */
void ComputePartitionInfo(GraphType *, idxtype, idxtype *);
void ComputePartitionInfoBipartite(GraphType *, idxtype, idxtype *);
void ComputePartitionBalance(GraphType *, idxtype, idxtype *, float *);
float ComputeElementBalance(idxtype, idxtype, idxtype *);
/* subdomains.c */
void Random_KWayEdgeRefineMConn(CtrlType *, GraphType *, idxtype, float *, float, idxtype, idxtype);
void Greedy_KWayEdgeBalanceMConn(CtrlType *, GraphType *, idxtype, float *, float, idxtype);
void PrintSubDomainGraph(GraphType *, idxtype, idxtype *);
void ComputeSubDomainGraph(GraphType *, idxtype, idxtype *, idxtype *);
void EliminateSubDomainEdges(CtrlType *, GraphType *, idxtype, float *);
void MoveGroupMConn(CtrlType *, GraphType *, idxtype *, idxtype *, idxtype, idxtype, idxtype, idxtype *);
void EliminateComponents(CtrlType *, GraphType *, idxtype, float *, float);
void MoveGroup(CtrlType *, GraphType *, idxtype, idxtype, idxtype, idxtype *, idxtype *);
/* timing.c */
void InitTimers(CtrlType *);
void PrintTimers(CtrlType *);
/* util.c */
GK_XMALLOC_PROTO(idxmalloc, idxtype)
GK_XREALLOC_PROTO(idxrealloc, idxtype)
GK_XSMALLOC_PROTO(idxsmalloc, idxtype)
GK_SET_PROTO(idxset, idxtype)
GK_ARGMAX_PROTO(idxargmax, idxtype)
GK_ARGMIN_PROTO(idxargmin, idxtype)
GK_SUM_PROTO(idxsum, idxtype, idxtype)
GK_AXPY_PROTO(idxaxpy, idxtype)
idxtype idxargmax_strd(size_t, idxtype *, idxtype);
idxtype famax2(size_t, float *);
void RandomPermute(size_t, idxtype *, idxtype);
void InitRandom(idxtype);
idxtype strtoidx(const char *nptr, char **endptr, int base);
/***************************************************************
* Programs Directory
****************************************************************/
/* smbfactor.c */
void ComputeFillIn(GraphType *, idxtype *);
idxtype ComputeFillIn2(GraphType *, idxtype *);
idxtype smbfct(idxtype, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
/* kfmetis.c */
void BalanceFillIn(CtrlType *ctrl, GraphType *graph, idxtype nparts, idxtype *part);
GraphType *ExtractPartitionGraph(GraphType *graph, idxtype *part, idxtype pid, idxtype *vmap, idxtype *vimap);
void ComputePartitionFillIn(CtrlType *ctrl, GraphType *graph, idxtype nparts, idxtype *part, idxtype *spart, idxtype pid, idxtype *r_fill, idxtype *r_subfill);
void RefineTopLevelSeparators(CtrlType *ctrl, GraphType *graph, idxtype nparts, idxtype *part, idxtype *spart, idxtype *, idxtype *, idxtype *, idxtype *);
/* rkmetis.c */
void METIS_RefineGraphKway(idxtype *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, idxtype *wgtflag, idxtype *numflag, idxtype *nparts, idxtype *options, idxtype *edgecut, idxtype *part);
void METIS_WRefineGraphKway(idxtype *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, idxtype *wgtflag, idxtype *numflag, idxtype *nparts, float *tpwgts, idxtype *options, idxtype *edgecut, idxtype *part);
idxtype MlevelKWayRefinement(CtrlType *ctrl, GraphType *graph, idxtype nparts, idxtype *part, float *tpwgts, float ubfactor);
/* cmetis.c */
void *METIS_PartGraphForContact(idxtype *nvtxs, idxtype *xadj, idxtype *adjncy,
double *xyzcoords, idxtype *sflag, idxtype *numflag, idxtype *nparts,
idxtype *options, idxtype *edgecut, idxtype *part);
void METIS_UpdateContactInfo(void *raw_cinfo, idxtype *nvtxs, double *xyzcoords, idxtype *sflag);
void *METIS_SetupContact0(idxtype *nvtxs, double *xyzcoords, idxtype *sflag,
idxtype *nparts, idxtype *part);
void *METIS_SetupContact(idxtype *nvtxs, double *xyzcoords, idxtype *sflag,
idxtype *nparts, idxtype *part);
void METIS_FindContacts(void *raw_cinfo, idxtype *nboxes, double *boxcoords, idxtype *nparts,
idxtype **r_cntptr, idxtype **r_cntind);
void METIS_FreeContactInfo(void *raw_cinfo);
GraphType *CreatePartitionGraphForContact(idxtype nvtxs, idxtype *xadj, idxtype *adjncy,
idxtype *vwgt, idxtype *adjwgt, idxtype cnvtxs, idxtype *part);
idxtype InduceDecissionTree(idxtype nvtxs, DKeyValueType **xyzcand, idxtype *sflag, idxtype nparts,
idxtype *part, idxtype maxnvtxs, idxtype minnvtxs, float minfrac, idxtype *r_nnodes, idxtype *r_nlnodes,
DTreeNodeType *dtree, idxtype *dtpart, idxtype *dtipart, idxtype *r_nclean,
idxtype *r_naclean, idxtype *r_ndirty, idxtype *r_maxdepth, idxtype *marker);
idxtype FindBoxContacts(ContactInfoType *cinfo, double *coords, idxtype *stack, idxtype *cntind, idxtype *marker);
void BuildDTLeafContents(ContactInfoType *cinfo, idxtype *sflag);
void CheckDTree(idxtype nvtxs, double *xyzcoords, idxtype *part, ContactInfoType *cinfo);
void CheckDTreeSurface(idxtype nvtxs, double *xyzcoords, idxtype *part, ContactInfoType *cinfo, idxtype *sflag);
void *METIS_PartSurfForContactRCB(idxtype *nvtxs, double *xyzcoords, idxtype *sflag,
idxtype *nparts, idxtype *part, idxtype *bestdims);
idxtype InduceRCBTree(idxtype nvtxs, DKeyValueType **xyzcand, idxtype firstPID, idxtype nparts,
idxtype *r_nnodes, idxtype *r_nlnodes, DTreeNodeType *dtree, idxtype *leafpart,
idxtype *part, idxtype *marker, idxtype *oldBestDims);
/* mrkmetis.c */
void METIS_mCRefineGraphKway(idxtype *nvtxs, idxtype *ncon, idxtype *xadj, idxtype *adjncy,
idxtype *vwgt, idxtype *adjwgt, idxtype *wgtflag, idxtype *numflag,
idxtype *nparts, float *rubvec, idxtype *options, idxtype *edgecut,
idxtype *part);
idxtype MCMlevelKWayRefinement(CtrlType *ctrl, GraphType *graph, idxtype nparts, idxtype *part,
float *rubvec);
/* streamio.c */
int mprintf(char *format,...);
int msprintf(char *str, char *format,...);
int mfprintf(FILE *stream, char *format,...);
int mscanf(char *format,...);
int msscanf(char *str, char *format,...);
int mfscanf(FILE *stream, char *format,...);
#endif