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