1 /*
2 * Copyright 1997, Regents of the University of Minnesota
3 *
4 * kmetis.c
5 *
6 * This file contains the driving routine for kmetis
7 *
8 * Started 8/28/94
9 * George
10 *
11 * $Id: kmetis.c,v 1.1 1998/11/27 17:59:35 karypis Exp $
12 *
13 */
14
15 #include <metis.h>
16
17
18
19 /*************************************************************************
20 * Let the game begin
21 **************************************************************************/
main(int argc,char * argv[])22 main(int argc, char *argv[])
23 {
24 int i, nparts, options[10];
25 idxtype *part;
26 float rubvec[MAXNCON], lbvec[MAXNCON];
27 GraphType graph;
28 char filename[256];
29 int numflag = 0, wgtflag = 0, edgecut;
30 timer TOTALTmr, METISTmr, IOTmr;
31
32 if (argc != 3) {
33 printf("Usage: %s <GraphFile> <Nparts>\n",argv[0]);
34 exit(0);
35 }
36
37 strcpy(filename, argv[1]);
38 nparts = atoi(argv[2]);
39
40 if (nparts < 2) {
41 printf("The number of partitions should be greater than 1!\n");
42 exit(0);
43 }
44
45 cleartimer(TOTALTmr);
46 cleartimer(METISTmr);
47 cleartimer(IOTmr);
48
49 starttimer(TOTALTmr);
50 starttimer(IOTmr);
51 ReadGraph(&graph, filename, &wgtflag);
52 if (graph.nvtxs <= 0) {
53 printf("Empty graph. Nothing to do.\n");
54 exit(0);
55 }
56 stoptimer(IOTmr);
57
58 printf("**********************************************************************\n");
59 printf("%s", METISTITLE);
60 printf("Graph Information ---------------------------------------------------\n");
61 printf(" Name: %s, #Vertices: %d, #Edges: %d, #Parts: %d\n", filename, graph.nvtxs, graph.nedges/2, nparts);
62 if (graph.ncon > 1)
63 printf(" Balancing Constraints: %d\n", graph.ncon);
64 printf("\nK-way Partitioning... -----------------------------------------------\n");
65
66 part = idxmalloc(graph.nvtxs, "main: part");
67 options[0] = 0;
68
69 starttimer(METISTmr);
70 if (graph.ncon == 1) {
71 METIS_PartGraphKway(&graph.nvtxs, graph.xadj, graph.adjncy, graph.vwgt, graph.adjwgt,
72 &wgtflag, &numflag, &nparts, options, &edgecut, part);
73 }
74 else {
75 for (i=0; i<graph.ncon; i++)
76 rubvec[i] = HORIZONTAL_IMBALANCE;
77
78 METIS_mCPartGraphKway(&graph.nvtxs, &graph.ncon, graph.xadj, graph.adjncy, graph.vwgt,
79 graph.adjwgt, &wgtflag, &numflag, &nparts, rubvec, options, &edgecut, part);
80 }
81 stoptimer(METISTmr);
82
83 ComputePartitionBalance(&graph, nparts, part, lbvec);
84
85 printf(" %d-way Edge-Cut: %7d, Balance: ", nparts, edgecut);
86 for (i=0; i<graph.ncon; i++)
87 printf("%5.2f ", lbvec[i]);
88 printf("\n");
89
90 starttimer(IOTmr);
91 WritePartition(filename, part, graph.nvtxs, nparts);
92 stoptimer(IOTmr);
93 stoptimer(TOTALTmr);
94
95 printf("\nTiming Information --------------------------------------------------\n");
96 printf(" I/O: \t\t %7.3f\n", gettimer(IOTmr));
97 printf(" Partitioning: \t\t %7.3f (KMETIS time)\n", gettimer(METISTmr));
98 printf(" Total: \t\t %7.3f\n", gettimer(TOTALTmr));
99 printf("**********************************************************************\n");
100
101
102 GKfree(&graph.xadj, &graph.adjncy, &graph.vwgt, &graph.adjwgt, &part, LTERM);
103 }
104
105
106