cmdline_mpmetis.c
Go to the documentation of this file.
1 
11 #include "metisbin.h"
12 
13 
14 /*-------------------------------------------------------------------
15  * Command-line options
16  *-------------------------------------------------------------------*/
17 static struct gk_option long_options[] = {
18  {"gtype", 1, 0, METIS_OPTION_GTYPE},
19  {"ptype", 1, 0, METIS_OPTION_PTYPE},
20  {"objtype", 1, 0, METIS_OPTION_OBJTYPE},
21 
22  {"ctype", 1, 0, METIS_OPTION_CTYPE},
23  {"iptype", 1, 0, METIS_OPTION_IPTYPE},
24 
25  {"minconn", 0, 0, METIS_OPTION_MINCONN},
26  {"contig", 0, 0, METIS_OPTION_CONTIG},
27 
28  {"nooutput", 0, 0, METIS_OPTION_NOOUTPUT},
29 
30  {"ufactor", 1, 0, METIS_OPTION_UFACTOR},
31  {"niter", 1, 0, METIS_OPTION_NITER},
32  {"ncuts", 1, 0, METIS_OPTION_NCUTS},
33  {"ncommon", 1, 0, METIS_OPTION_NCOMMON},
34 
35  {"tpwgts", 1, 0, METIS_OPTION_TPWGTS},
36 
37  {"seed", 1, 0, METIS_OPTION_SEED},
38 
39  {"dbglvl", 1, 0, METIS_OPTION_DBGLVL},
40 
41  {"help", 0, 0, METIS_OPTION_HELP},
42  {0, 0, 0, 0}
43 };
44 
45 
46 
47 /*-------------------------------------------------------------------
48  * Mappings for the various parameter values
49  *-------------------------------------------------------------------*/
51  {"dual", METIS_GTYPE_DUAL},
52  {"nodal", METIS_GTYPE_NODAL},
53  {NULL, 0}
54 };
55 
57  {"rb", METIS_PTYPE_RB},
58  {"kway", METIS_PTYPE_KWAY},
59  {NULL, 0}
60 };
61 
63  {"cut", METIS_OBJTYPE_CUT},
64  {"vol", METIS_OBJTYPE_VOL},
65  {NULL, 0}
66 };
67 
69  {"rm", METIS_CTYPE_RM},
70  {"shem", METIS_CTYPE_SHEM},
71  {NULL, 0}
72 };
73 
75  {"grow", METIS_IPTYPE_GROW},
76  {"random", METIS_IPTYPE_RANDOM},
77  {NULL, 0}
78 };
79 
80 
81 /*-------------------------------------------------------------------
82  * Mini help
83  *-------------------------------------------------------------------*/
84 static char helpstr[][100] =
85 {
86 " ",
87 "Usage: mpmetis [options] meshfile nparts",
88 " ",
89 " Required parameters",
90 " meshfile Stores the mesh to be partitioned.",
91 " nparts The number of partitions to split the mesh.",
92 " ",
93 " Optional parameters",
94 " -gtype=string",
95 " Specifies the graph to be used for computing the partitioning",
96 " The possible values are:",
97 " dual - Partition the dual graph of the mesh [default]",
98 " nodal - Partition the nodal graph of the mesh",
99 " ",
100 " -ptype=string",
101 " Specifies the scheme to be used for computing the k-way partitioning.",
102 " The possible values are:",
103 " rb - Recursive bisectioning",
104 " kway - Direct k-way partitioning [default]",
105 " ",
106 " -ctype=string",
107 " Specifies the scheme to be used to match the vertices of the graph",
108 " during the coarsening.",
109 " The possible values are:",
110 " rm - Random matching",
111 " shem - Sorted heavy-edge matching [default]",
112 " ",
113 " -iptype=string [applies only when -ptype=rb]",
114 " Specifies the scheme to be used to compute the initial partitioning",
115 " of the graph.",
116 " The possible values are:",
117 " grow - Grow a bisection using a greedy strategy [default]",
118 " random - Compute a bisection at random",
119 " ",
120 " -objtype=string [applies only when -ptype=kway]",
121 " Specifies the objective that the partitioning routines will optimize.",
122 " The possible values are:",
123 " cut - Minimize the edgecut [default]",
124 " vol - Minimize the total communication volume",
125 " ",
126 " -contig [applies only when -ptype=kway]",
127 " Specifies that the partitioning routines should try to produce",
128 " partitions that are contiguous. Note that if the input graph is not",
129 " connected this option is ignored.",
130 " ",
131 " -minconn [applies only when -ptype=kway]",
132 " Specifies that the partitioning routines should try to minimize the",
133 " maximum degree of the subdomain graph, i.e., the graph in which each",
134 " partition is a node, and edges connect subdomains with a shared",
135 " interface.",
136 " ",
137 " -tpwgts=filename",
138 " Specifies the name of the file that stores the target weights for",
139 " each partition. By default, all partitions are assumed to be of ",
140 " the same size.",
141 " ",
142 " -ufactor=int",
143 " Specifies the maximum allowed load imbalance among the partitions.",
144 " A value of x indicates that the allowed load imbalance is 1+x/1000.",
145 " For ptype=rb, the load imbalance is measured as the ratio of the ",
146 " 2*max(left,right)/(left+right), where left and right are the sizes",
147 " of the respective partitions at each bisection. ",
148 " For ptype=kway, the load imbalance is measured as the ratio of ",
149 " max_i(pwgts[i])/avgpwgt, where pwgts[i] is the weight of the ith",
150 " partition and avgpwgt is the sum of the total vertex weights divided",
151 " by the number of partitions requested.",
152 " For ptype=rb, the default value is 1 (i.e., load imbalance of 1.001).",
153 " For ptype=kway, the default value is 30 (i.e., load imbalance of 1.03).",
154 " ",
155 " -ncommon=int",
156 " Specifies the common number of nodes that two elements must have",
157 " in order to put an edge between them in the dual graph. Default is 1.",
158 " ",
159 " -niter=int",
160 " Specifies the number of iterations for the refinement algorithms",
161 " at each stage of the uncoarsening process. Default is 10.",
162 " ",
163 " -ncuts=int",
164 " Specifies the number of different partitionings that it will compute.",
165 " The final partitioning is the one that achieves the best edgecut or",
166 " communication volume. Default is 1.",
167 " ",
168 " -nooutput",
169 " Specifies that no partitioning file should be generated.",
170 " ",
171 " -seed=int",
172 " Selects the seed of the random number generator. ",
173 " ",
174 " -dbglvl=int ",
175 " Selects the dbglvl. ",
176 " ",
177 " -help",
178 " Prints this message.",
179 ""
180 };
181 
182 static char shorthelpstr[][100] = {
183 " ",
184 " Usage: mpmetis [options] <filename> <nparts>",
185 " use 'mpmetis -help' for a summary of the options.",
186 ""
187 };
188 
189 
190 
191 /*************************************************************************
192 * This is the entry point of the command-line argument parser
193 **************************************************************************/
194 params_t *parse_cmdline(int argc, char *argv[])
195 {
196  int i, j, k;
197  int c, option_index;
198  params_t *params;
199 
200  params = (params_t *)gk_malloc(sizeof(params_t), "parse_cmdline");
201  memset((void *)params, 0, sizeof(params_t));
202 
203  /* initialize the params data structure */
204  params->gtype = METIS_GTYPE_DUAL;
205  params->ptype = METIS_PTYPE_KWAY;
206  params->objtype = METIS_OBJTYPE_CUT;
207  params->ctype = METIS_CTYPE_SHEM;
208  params->iptype = METIS_IPTYPE_GROW;
209  params->rtype = -1;
210 
211  params->minconn = 0;
212  params->contig = 0;
213 
214  params->nooutput = 0;
215  params->wgtflag = 3;
216 
217  params->ncuts = 1;
218  params->niter = 10;
219  params->ncommon = 1;
220 
221  params->dbglvl = 0;
222  params->balance = 0;
223  params->seed = -1;
224  params->dbglvl = 0;
225 
226  params->tpwgtsfile = NULL;
227 
228  params->filename = NULL;
229  params->nparts = 1;
230 
231  params->ufactor = -1;
232 
233  gk_clearcputimer(params->iotimer);
234  gk_clearcputimer(params->parttimer);
235  gk_clearcputimer(params->reporttimer);
236 
237 
238  /* Parse the command line arguments */
239  while ((c = gk_getopt_long_only(argc, argv, "", long_options, &option_index)) != -1) {
240  switch (c) {
241  case METIS_OPTION_GTYPE:
242  if (gk_optarg)
243  if ((params->gtype = gk_GetStringID(gtype_options, gk_optarg)) == -1)
244  errexit("Invalid option -%s=%s\n", long_options[option_index].name, gk_optarg);
245  break;
246  case METIS_OPTION_PTYPE:
247  if (gk_optarg)
248  if ((params->ptype = gk_GetStringID(ptype_options, gk_optarg)) == -1)
249  errexit("Invalid option -%s=%s\n", long_options[option_index].name, gk_optarg);
250  break;
252  if (gk_optarg)
253  if ((params->objtype = gk_GetStringID(objtype_options, gk_optarg)) == -1)
254  errexit("Invalid option -%s=%s\n", long_options[option_index].name, gk_optarg);
255  break;
256  case METIS_OPTION_CTYPE:
257  if (gk_optarg)
258  if ((params->ctype = gk_GetStringID(ctype_options, gk_optarg)) == -1)
259  errexit("Invalid option -%s=%s\n", long_options[option_index].name, gk_optarg);
260  break;
261  case METIS_OPTION_IPTYPE:
262  if (gk_optarg)
263  if ((params->iptype = gk_GetStringID(iptype_options, gk_optarg)) == -1)
264  errexit("Invalid option -%s=%s\n", long_options[option_index].name, gk_optarg);
265  break;
266 
267 /*
268  case METIS_OPTION_RTYPE:
269  if (gk_optarg)
270  if ((params->rtype = gk_GetStringID(rtype_options, gk_optarg)) == -1)
271  errexit("Invalid option -%s=%s\n", long_options[option_index].name, gk_optarg);
272  break;
273 */
274 
275  case METIS_OPTION_CONTIG:
276  params->contig = 1;
277  break;
278 
280  params->minconn = 1;
281  break;
282 
284  params->nooutput = 1;
285  break;
286 
288  params->balance = 1;
289  break;
290 
291  case METIS_OPTION_TPWGTS:
292  if (gk_optarg) params->tpwgtsfile = gk_strdup(gk_optarg);
293  break;
294 
295  case METIS_OPTION_NCUTS:
296  if (gk_optarg) params->ncuts = (idx_t)atoi(gk_optarg);
297  break;
298  case METIS_OPTION_NITER:
299  if (gk_optarg) params->niter = (idx_t)atoi(gk_optarg);
300  break;
301 
303  if (gk_optarg) params->ncommon = (idx_t)atoi(gk_optarg);
304  break;
305 
307  if (gk_optarg) params->ufactor = (idx_t)atoi(gk_optarg);
308  break;
309 
310  case METIS_OPTION_SEED:
311  if (gk_optarg) params->seed = (idx_t)atoi(gk_optarg);
312  break;
313 
314  case METIS_OPTION_DBGLVL:
315  if (gk_optarg) params->dbglvl = (idx_t)atoi(gk_optarg);
316  break;
317 
318  case METIS_OPTION_HELP:
319  for (i=0; strlen(helpstr[i]) > 0; i++)
320  printf("%s\n", helpstr[i]);
321  exit(0);
322  break;
323  case '?':
324  default:
325  errexit("Illegal command-line option(s)\n"
326  "Use %s -help for a summary of the options.\n", argv[0]);
327  }
328  }
329 
330  if (argc-gk_optind != 2) {
331  printf("Missing parameters.");
332  for (i=0; strlen(shorthelpstr[i]) > 0; i++)
333  printf("%s\n", shorthelpstr[i]);
334  exit(0);
335  }
336 
337  params->filename = gk_strdup(argv[gk_optind++]);
338  params->nparts = atoi(argv[gk_optind++]);
339 
340  if (params->nparts < 2)
341  errexit("The number of partitions should be greater than 1!\n");
342 
343 
344  /* Set the ptype-specific defaults */
345  if (params->ptype == METIS_PTYPE_RB) {
346  params->rtype = METIS_RTYPE_FM;
347  }
348  if (params->ptype == METIS_PTYPE_KWAY) {
349  params->iptype = METIS_IPTYPE_METISRB;
350  params->rtype = METIS_RTYPE_GREEDY;
351  }
352 
353  /* Check for invalid parameter combination */
354  if (params->ptype == METIS_PTYPE_RB) {
355  if (params->contig)
356  errexit("The -contig option cannot be specified with rb partitioning.\n");
357  if (params->minconn)
358  errexit("The -minconn option cannot be specified with rb partitioning.\n");
359  if (params->objtype == METIS_OBJTYPE_VOL)
360  errexit("The -objtype=vol option cannot be specified with rb partitioning.\n");
361  }
362 
363  return params;
364 }
365 
366 
The structure that stores the information about the command-line options.
Definition: gk_getopt.h:28
Definition: fis.c:15
void errexit(char *f_str,...)
Definition: error.c:54
int gk_optind
Index in ARGV of the next element to be scanned.
Definition: getopt.c:68
static char shorthelpstr[][100]
Scalar Scalar * c
Definition: benchVecAdd.cpp:17
static gk_StringMap_t objtype_options[]
static const SmartProjectionParams params
static gk_StringMap_t ctype_options[]
static gk_StringMap_t iptype_options[]
static char helpstr[][100]
int32_t idx_t
#define gk_clearcputimer(tmr)
Definition: gk_macros.h:32
params_t * parse_cmdline(int argc, char *argv[])
static struct gk_option long_options[]
#define NULL
Definition: ccolamd.c:609
char * gk_strdup(char *orgstr)
Duplicates a string.
Definition: string.c:372
char * gk_optarg
For communication arguments to the caller.
Definition: getopt.c:56
static gk_StringMap_t gtype_options[]
void * gk_malloc(size_t nbytes, char *msg)
Definition: memory.c:140
static gk_StringMap_t ptype_options[]
Annotation for function names.
Definition: attr.h:48
int gk_GetStringID(gk_StringMap_t *strmap, char *key)
Definition: string.c:519
int gk_getopt_long_only(int argc, char **argv, char *options, struct gk_option *long_options, int *opt_index)
Parse command-line arguments with only long options.
Definition: getopt.c:850
std::ptrdiff_t j


gtsam
Author(s):
autogenerated on Tue Jul 4 2023 02:34:01