Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/elmergrid/src/metis-5.1.0/programs/cmdline_gpmetis.c
3206 views
1
/*!
2
\file cmdline_gpmetis.c
3
\brief Command-line argument parsing for gpmetis
4
5
\date 12/24/2008
6
\author George
7
\version\verbatim $Id: cmdline_gpmetis.c 13901 2013-03-24 16:17:03Z karypis $\endverbatim
8
*/
9
10
#include "metisbin.h"
11
12
13
/*-------------------------------------------------------------------
14
* Command-line options
15
*-------------------------------------------------------------------*/
16
static struct gk_option long_options[] = {
17
{"ptype", 1, 0, METIS_OPTION_PTYPE},
18
{"objtype", 1, 0, METIS_OPTION_OBJTYPE},
19
20
{"ctype", 1, 0, METIS_OPTION_CTYPE},
21
{"iptype", 1, 0, METIS_OPTION_IPTYPE},
22
/* {"rtype", 1, 0, METIS_OPTION_RTYPE}, */
23
24
/* {"balanced", 0, 0, METIS_OPTION_BALANCE}, */
25
26
{"no2hop", 0, 0, METIS_OPTION_NO2HOP},
27
{"minconn", 0, 0, METIS_OPTION_MINCONN},
28
{"contig", 0, 0, METIS_OPTION_CONTIG},
29
30
{"nooutput", 0, 0, METIS_OPTION_NOOUTPUT},
31
32
{"ufactor", 1, 0, METIS_OPTION_UFACTOR},
33
{"niter", 1, 0, METIS_OPTION_NITER},
34
{"ncuts", 1, 0, METIS_OPTION_NCUTS},
35
36
{"tpwgts", 1, 0, METIS_OPTION_TPWGTS},
37
{"ubvec", 1, 0, METIS_OPTION_UBVEC},
38
39
{"seed", 1, 0, METIS_OPTION_SEED},
40
41
{"dbglvl", 1, 0, METIS_OPTION_DBGLVL},
42
43
{"help", 0, 0, METIS_OPTION_HELP},
44
{0, 0, 0, 0}
45
};
46
47
48
49
/*-------------------------------------------------------------------
50
* Mappings for the various parameter values
51
*-------------------------------------------------------------------*/
52
static gk_StringMap_t ptype_options[] = {
53
{"rb", METIS_PTYPE_RB},
54
{"kway", METIS_PTYPE_KWAY},
55
{NULL, 0}
56
};
57
58
static gk_StringMap_t objtype_options[] = {
59
{"cut", METIS_OBJTYPE_CUT},
60
{"vol", METIS_OBJTYPE_VOL},
61
{NULL, 0}
62
};
63
64
static gk_StringMap_t ctype_options[] = {
65
{"rm", METIS_CTYPE_RM},
66
{"shem", METIS_CTYPE_SHEM},
67
{NULL, 0}
68
};
69
70
static gk_StringMap_t iptype_options[] = {
71
{"grow", METIS_IPTYPE_GROW},
72
{"random", METIS_IPTYPE_RANDOM},
73
{NULL, 0}
74
};
75
76
static gk_StringMap_t rtype_options[] = {
77
{"fm", METIS_RTYPE_FM},
78
{"greedy", METIS_RTYPE_GREEDY},
79
{NULL, 0}
80
};
81
82
83
84
/*-------------------------------------------------------------------
85
* Mini help
86
*-------------------------------------------------------------------*/
87
static char helpstr[][100] =
88
{
89
" ",
90
"Usage: gpmetis [options] graphfile nparts",
91
" ",
92
" Required parameters",
93
" graphfile Stores the graph to be partitioned.",
94
" nparts The number of partitions to split the graph.",
95
" ",
96
" Optional parameters",
97
" -ptype=string",
98
" Specifies the scheme to be used for computing the k-way partitioning.",
99
" The possible values are:",
100
" rb - Recursive bisectioning",
101
" kway - Direct k-way partitioning [default]",
102
" ",
103
" -ctype=string",
104
" Specifies the scheme to be used to match the vertices of the graph",
105
" during the coarsening.",
106
" The possible values are:",
107
" rm - Random matching",
108
" shem - Sorted heavy-edge matching [default]",
109
" ",
110
" -iptype=string [applies only when -ptype=rb]",
111
" Specifies the scheme to be used to compute the initial partitioning",
112
" of the graph.",
113
" The possible values are:",
114
" grow - Grow a bisection using a greedy scheme [default for ncon=1]",
115
" random - Compute a bisection at random [default for ncon>1]",
116
" ",
117
" -objtype=string [applies only when -ptype=kway]",
118
" Specifies the objective that the partitioning routines will optimize.",
119
" The possible values are:",
120
" cut - Minimize the edgecut [default]",
121
" vol - Minimize the total communication volume",
122
" ",
123
/*
124
" -rtype=string",
125
" Specifies the scheme to be used for refinement.",
126
" The possible values are:",
127
" fm - 2-way FM refinement [default for -ptype=rb]",
128
" random - Random k-way refinement",
129
" greedy - Greedy k-way refinement [default for -ptype=kway]",
130
" ",
131
*/
132
" -no2hop",
133
" Specifies that the coarsening will not perform any 2-hop matchings",
134
" when the standard matching fails to sufficiently contract the graph.",
135
" ",
136
" -contig [applies only when -ptype=kway]",
137
" Specifies that the partitioning routines should try to produce",
138
" partitions that are contiguous. Note that if the input graph is not",
139
" connected this option is ignored.",
140
" ",
141
" -minconn [applies only when -ptype=kway]",
142
" Specifies that the partitioning routines should try to minimize the",
143
" maximum degree of the subdomain graph, i.e., the graph in which each",
144
" partition is a node, and edges connect subdomains with a shared",
145
" interface.",
146
" ",
147
" -tpwgts=filename",
148
" Specifies the name of the file that stores the target weights for",
149
" each partition. By default, all partitions are assumed to be of ",
150
" the same size.",
151
" ",
152
" -ufactor=int",
153
" Specifies the maximum allowed load imbalance among the partitions.",
154
" A value of x indicates that the allowed load imbalance is 1+x/1000.",
155
" For ptype=rb, the load imbalance is measured as the ratio of the ",
156
" 2*max(left,right)/(left+right), where left and right are the sizes",
157
" of the respective partitions at each bisection. ",
158
" For ptype=kway, the load imbalance is measured as the ratio of ",
159
" max_i(pwgts[i])/avgpwgt, where pwgts[i] is the weight of the ith",
160
" partition and avgpwgt is the sum of the total vertex weights divided",
161
" by the number of partitions requested.",
162
" For ptype=rb, the default value is 1 (i.e., load imbalance of 1.001).",
163
" For ptype=kway, the default value is 30 (i.e., load imbalance of 1.03).",
164
" ",
165
" -ubvec=string",
166
" Applies only for multi-constraint partitioning and specifies the per",
167
" constraint allowed load imbalance among partitions. The required ",
168
" parameter corresponds to a space separated set of floating point",
169
" numbers, one for each of the constraints. For example, for three",
170
" constraints, the string can be \"1.02 1.2 1.35\" indicating a ",
171
" desired maximum load imbalance of 2%, 20%, and 35%, respectively.",
172
" The load imbalance is defined in a way similar to ufactor.",
173
" If supplied, this parameter takes priority over ufactor.",
174
" ",
175
" -niter=int",
176
" Specifies the number of iterations for the refinement algorithms",
177
" at each stage of the uncoarsening process. Default is 10.",
178
" ",
179
" -ncuts=int",
180
" Specifies the number of different partitionings that it will compute.",
181
" The final partitioning is the one that achieves the best edgecut or",
182
" communication volume. Default is 1.",
183
" ",
184
" -nooutput",
185
" Specifies that no partitioning file should be generated.",
186
" ",
187
/*
188
" -balance",
189
" Specifies that the final partitioning should contain nparts-1 equal",
190
" size partitions with the last partition having upto nparts-1 fewer",
191
" vertices.",
192
" ",
193
*/
194
" -seed=int",
195
" Selects the seed of the random number generator. ",
196
" ",
197
" -dbglvl=int ",
198
" Selects the dbglvl. ",
199
" ",
200
" -help",
201
" Prints this message.",
202
""
203
};
204
205
static char shorthelpstr[][100] = {
206
" ",
207
" Usage: gpmetis [options] <filename> <nparts>",
208
" use 'gpmetis -help' for a summary of the options.",
209
""
210
};
211
212
213
214
/*************************************************************************
215
* This is the entry point of the command-line argument parser
216
**************************************************************************/
217
params_t *parse_cmdline(int argc, char *argv[])
218
{
219
int i, j, k;
220
int c, option_index;
221
params_t *params;
222
223
params = (params_t *)gk_malloc(sizeof(params_t), "parse_cmdline");
224
memset((void *)params, 0, sizeof(params_t));
225
226
/* initialize the params data structure */
227
params->ptype = METIS_PTYPE_KWAY;
228
params->objtype = METIS_OBJTYPE_CUT;
229
params->ctype = METIS_CTYPE_SHEM;
230
params->iptype = -1;
231
params->rtype = -1;
232
233
params->no2hop = 0;
234
params->minconn = 0;
235
params->contig = 0;
236
237
params->nooutput = 0;
238
params->wgtflag = 3;
239
240
params->ncuts = 1;
241
params->niter = 10;
242
243
params->dbglvl = 0;
244
params->balance = 0;
245
params->seed = -1;
246
params->dbglvl = 0;
247
248
params->tpwgtsfile = NULL;
249
250
params->filename = NULL;
251
params->nparts = 1;
252
253
params->ufactor = -1;
254
255
params->ubvecstr = NULL;
256
params->ubvec = NULL;
257
258
259
gk_clearcputimer(params->iotimer);
260
gk_clearcputimer(params->parttimer);
261
gk_clearcputimer(params->reporttimer);
262
263
264
/* Parse the command line arguments */
265
while ((c = gk_getopt_long_only(argc, argv, "", long_options, &option_index)) != -1) {
266
switch (c) {
267
case METIS_OPTION_PTYPE:
268
if (gk_optarg)
269
if ((params->ptype = gk_GetStringID(ptype_options, gk_optarg)) == -1)
270
errexit("Invalid option -%s=%s\n", long_options[option_index].name, gk_optarg);
271
break;
272
case METIS_OPTION_OBJTYPE:
273
if (gk_optarg)
274
if ((params->objtype = gk_GetStringID(objtype_options, gk_optarg)) == -1)
275
errexit("Invalid option -%s=%s\n", long_options[option_index].name, gk_optarg);
276
break;
277
case METIS_OPTION_CTYPE:
278
if (gk_optarg)
279
if ((params->ctype = gk_GetStringID(ctype_options, gk_optarg)) == -1)
280
errexit("Invalid option -%s=%s\n", long_options[option_index].name, gk_optarg);
281
break;
282
case METIS_OPTION_IPTYPE:
283
if (gk_optarg)
284
if ((params->iptype = gk_GetStringID(iptype_options, gk_optarg)) == -1)
285
errexit("Invalid option -%s=%s\n", long_options[option_index].name, gk_optarg);
286
break;
287
288
/*
289
case METIS_OPTION_RTYPE:
290
if (gk_optarg)
291
if ((params->rtype = gk_GetStringID(rtype_options, gk_optarg)) == -1)
292
errexit("Invalid option -%s=%s\n", long_options[option_index].name, gk_optarg);
293
break;
294
*/
295
296
case METIS_OPTION_NO2HOP:
297
params->no2hop = 1;
298
break;
299
300
case METIS_OPTION_CONTIG:
301
params->contig = 1;
302
break;
303
304
case METIS_OPTION_MINCONN:
305
params->minconn = 1;
306
break;
307
308
case METIS_OPTION_NOOUTPUT:
309
params->nooutput = 1;
310
break;
311
312
case METIS_OPTION_BALANCE:
313
params->balance = 1;
314
break;
315
316
case METIS_OPTION_TPWGTS:
317
if (gk_optarg) params->tpwgtsfile = gk_strdup(gk_optarg);
318
break;
319
320
case METIS_OPTION_UBVEC:
321
if (gk_optarg) params->ubvecstr = gk_strdup(gk_optarg);
322
break;
323
324
case METIS_OPTION_NCUTS:
325
if (gk_optarg) params->ncuts = (idx_t)atoi(gk_optarg);
326
break;
327
case METIS_OPTION_NITER:
328
if (gk_optarg) params->niter = (idx_t)atoi(gk_optarg);
329
break;
330
331
case METIS_OPTION_UFACTOR:
332
if (gk_optarg) params->ufactor = (idx_t)atoi(gk_optarg);
333
break;
334
335
case METIS_OPTION_SEED:
336
if (gk_optarg) params->seed = (idx_t)atoi(gk_optarg);
337
break;
338
339
case METIS_OPTION_DBGLVL:
340
if (gk_optarg) params->dbglvl = (idx_t)atoi(gk_optarg);
341
break;
342
343
case METIS_OPTION_HELP:
344
for (i=0; strlen(helpstr[i]) > 0; i++)
345
printf("%s\n", helpstr[i]);
346
exit(0);
347
break;
348
case '?':
349
default:
350
errexit("Illegal command-line option(s)\n"
351
"Use %s -help for a summary of the options.\n", argv[0]);
352
}
353
}
354
355
if (argc-gk_optind != 2) {
356
printf("Missing parameters.");
357
for (i=0; strlen(shorthelpstr[i]) > 0; i++)
358
printf("%s\n", shorthelpstr[i]);
359
exit(0);
360
}
361
362
params->filename = gk_strdup(argv[gk_optind++]);
363
params->nparts = atoi(argv[gk_optind++]);
364
365
if (params->nparts < 2)
366
errexit("The number of partitions should be greater than 1!\n");
367
368
369
/* Set the ptype-specific defaults */
370
if (params->ptype == METIS_PTYPE_RB) {
371
params->rtype = METIS_RTYPE_FM;
372
}
373
if (params->ptype == METIS_PTYPE_KWAY) {
374
params->iptype = METIS_IPTYPE_METISRB;
375
params->rtype = METIS_RTYPE_GREEDY;
376
}
377
378
/* Check for invalid parameter combination */
379
if (params->ptype == METIS_PTYPE_RB) {
380
if (params->contig)
381
errexit("***The -contig option cannot be specified with rb partitioning. Will be ignored.\n");
382
if (params->minconn)
383
errexit("***The -minconn option cannot be specified with rb partitioning. Will be ignored. \n");
384
if (params->objtype == METIS_OBJTYPE_VOL)
385
errexit("The -objtype=vol option cannot be specified with rb partitioning.\n");
386
}
387
388
return params;
389
}
390
391
392
393