]> AND Private Git Repository - loba.git/blob - options.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
68809699c25c4d4436c51bee617e9e32ee5accdb
[loba.git] / options.cpp
1 #include "options.h"
2
3 #include <iomanip>
4 #include <iostream>
5 #include <sstream>
6 #include <unistd.h>             // getopt
7 #include <xbt/log.h>
8 #include "misc.h"
9
10 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(main);
11
12 namespace opt {
13
14     std::string program_name;
15
16     std::string platform_file;
17     std::string deployment_file;
18
19     int help_requested = 0;
20     bool version_requested = false;
21
22     unsigned log_rate = 1;
23
24     namespace auto_depl {
25         bool        enabled = false;
26         std::string topology;
27         unsigned    nhosts = 0;
28         double      load = 0.0;
29     }
30
31     unsigned maxiter = 4;       // fixme
32     bool exit_on_close = false;
33
34     bool bookkeeping = false;
35
36     cost_func comp_cost("1e9, 0"); // fixme: find better defaults
37     cost_func comm_cost("1, 0"); // fixme: find better defaults
38
39 } // namespace opt
40
41 namespace {
42
43     const char* on_off(bool b)
44     {
45         return b ? "on" : "off";
46     }
47
48 }
49
50 int opt::parse_args(int* argc, char* argv[])
51 {
52     int result = 1;
53
54     opt::program_name = argv[0];
55     opt::program_name.erase(0, 1 + opt::program_name.find_last_of('/'));
56     
57     int c;
58     opterr = 0;
59     while ((c = getopt(*argc, argv, "bc:C:ehi:l:L:N:T:V")) != -1) {
60         switch (c) {
61         case 'b':
62             opt::bookkeeping = true;
63             break;
64         case 'e':
65             opt::exit_on_close = true;
66             break;
67         case 'h':
68             opt::help_requested++;
69             break;
70         case 'c':
71             opt::comp_cost = cost_func(optarg);
72             break;
73         case 'C':
74             opt::comm_cost = cost_func(optarg);
75             break;
76         case 'i':
77             std::istringstream(optarg) >> opt::maxiter;
78             break;
79         case 'l':
80             std::istringstream(optarg) >> opt::log_rate;
81             break;
82         case 'L':
83             std::istringstream(optarg) >> opt::auto_depl::load;
84             break;
85         case 'N':
86             std::istringstream(optarg) >> opt::auto_depl::nhosts;
87             break;
88         case 'T':
89             opt::auto_depl::topology = optarg;
90             break;
91         case 'V':
92             opt::version_requested = true;
93             break;
94         case '?':
95             ERROR1("invalid option -- '%c'", optopt);
96             result = 0;
97             break;
98         }
99     }
100     opt::auto_depl::enabled = !opt::auto_depl::topology.empty();
101
102     if (opt::version_requested || opt::help_requested)
103         return 1;
104
105     if (optind < *argc) {
106         opt::platform_file = argv[optind++];
107     } else {
108         ERROR0("missing parameter -- <plaform_file>");
109         result = 0;
110     }
111     if (!opt::auto_depl::enabled) {
112         if (optind < *argc) {
113             opt::deployment_file = argv[optind++];
114         } else {
115             ERROR0("missing parameter -- <deployment_file>");
116             result = 0;
117         }
118     }
119
120     while (optind < *argc) {
121         ERROR1("unused parameter -- \"%s\"", argv[optind++]);
122         result = 0;
123     }
124
125     return result;
126 }
127
128 void opt::print()
129 {
130     INFO0(",----[ Simulation parameters ]");
131     INFO1("| platform file.......: \"%s\"", opt::platform_file.c_str());
132     if (opt::auto_depl::enabled) {
133         INFO0("| automatic deployment enabled with:");
134         INFO1("|     topology........: %s", opt::auto_depl::topology.c_str());
135         INFO1("|     number of hosts.: %u", opt::auto_depl::nhosts);
136         INFO1("|     initial load....: %g", opt::auto_depl::load);
137     } else {
138         INFO1("| deployment file.....: \"%s\"", opt::deployment_file.c_str());
139     }
140     INFO1("| log rate............: %u",     opt::log_rate);
141     INFO1("| maxiter.............: %u",     opt::maxiter);
142     INFO1("| exit on close.......: %s",     on_off(opt::exit_on_close));
143     INFO1("| bookkeeping.........: %s",     on_off(opt::bookkeeping));
144     INFO1("| comp. cost factors..: [%s]",   opt::comp_cost.to_string().c_str());
145     INFO1("| comm. cost factors..: [%s]",   opt::comm_cost.to_string().c_str());
146     INFO0("`----");
147 }
148
149 void opt::usage()
150 {
151 #define o(opt) "    " << std::setw(14) \
152                       << std::left << (opt) << std::right << " "
153 #define so(subopt) std::setw(10) << (subopt) << ": "
154
155     std::clog << "Usage: " << opt::program_name
156               << " [options] <platform_file> <deployment_file>\n";
157
158     std::clog << o("-h")
159               << "print help and exit (use -hh for extended help)\n";
160     if (opt::help_requested < 1)
161         return;
162
163     std::clog << o("--help") << "print help from SimGrid framework and exit\n";
164     std::clog << o("-V") << "print version and exit\n";
165
166     std::clog << o("-b") << "activate bookkeeping\n";
167     std::clog << o("-c [fn,...]f0")
168               << "polynomial factors for computation cost"
169               << " (" << opt::comp_cost.to_string() << ")\n";
170     std::clog << o("-C [fn,...]f0")
171               << "polynomial factors for communication cost"
172               << " (" << opt::comm_cost.to_string() << ")\n";
173     std::clog << o("-e") << "exit on reception of \"close\" message\n";
174     std::clog << o("-i value")
175               << "maximum number of iterations, 0 for infinity"
176               << " (" << opt::maxiter << ")\n";
177     std::clog << o("-l value")
178               << "print current load every n-th iterations, 0 to disable"
179               << " (" << opt::log_rate << ")\n";
180     std::clog << o("-L value")
181               << "total load with auto deployment, 0 for number of hosts"
182               << " (" << opt::auto_depl::load << ")\n";
183     std::clog << o("-N value")
184               << "number of hosts to use with auto deployment,"
185               << " 0 for max. (" << opt::auto_depl::nhosts << ")\n";
186     std::clog << o("-T type")
187               << "enable automatic deployment with selected topology\n";
188     if (opt::help_requested > 1) {
189         std::clog << so(1) << "pipo\n";
190         std::clog << so(42) << "atchoum\n";
191     }
192
193 #undef o
194 #undef oo
195 }
196
197 // Local variables:
198 // mode: c++
199 // End: