18 #if defined(__GNUC__) // Linux or Mac OS X.
27 #include "absl/flags/flag.h"
40 ABSL_FLAG(
bool, all_solutions,
false,
"Search for all solutions.");
42 "Maximum number of solution to search for, 0 means unspecified.");
44 "If false, the solver must follow the defined search."
45 "If true, other search are allowed.");
46 ABSL_FLAG(
int, threads, 0,
"Number of threads the solver will use.");
47 ABSL_FLAG(
bool, presolve,
true,
"Presolve the model to simplify it.");
48 ABSL_FLAG(
bool, statistics,
false,
"Print solver statistics after search.");
50 "Read the FlatZinc from stdin, not from a file.");
53 "Define problem name when reading from stdin.");
54 ABSL_FLAG(std::string, params,
"",
"SatParameters as a text proto.");
62 absl::SetFlag(&FLAGS_log_prefix,
false);
64 char all_param[] =
"--all_solutions";
65 char free_param[] =
"--free_search";
66 char threads_param[] =
"--threads";
67 char solutions_param[] =
"--num_solutions";
68 char logging_param[] =
"--fz_logging";
69 char statistics_param[] =
"--statistics";
70 char seed_param[] =
"--fz_seed";
71 char verbose_param[] =
"--fz_verbose";
72 char debug_param[] =
"--fz_debug";
73 char time_param[] =
"--time_limit";
74 bool use_time_param =
false;
75 for (
int i = 1; i < *argc; ++i) {
76 if (strcmp((*argv)[i],
"-a") == 0) {
77 (*argv)[i] = all_param;
79 if (strcmp((*argv)[i],
"-f") == 0) {
80 (*argv)[i] = free_param;
82 if (strcmp((*argv)[i],
"-p") == 0) {
83 (*argv)[i] = threads_param;
85 if (strcmp((*argv)[i],
"-n") == 0) {
86 (*argv)[i] = solutions_param;
88 if (strcmp((*argv)[i],
"-l") == 0) {
89 (*argv)[i] = logging_param;
91 if (strcmp((*argv)[i],
"-s") == 0) {
92 (*argv)[i] = statistics_param;
94 if (strcmp((*argv)[i],
"-r") == 0) {
95 (*argv)[i] = seed_param;
97 if (strcmp((*argv)[i],
"-v") == 0) {
98 (*argv)[i] = verbose_param;
100 if (strcmp((*argv)[i],
"-d") == 0) {
101 (*argv)[i] = debug_param;
103 if (strcmp((*argv)[i],
"-t") == 0) {
104 (*argv)[i] = time_param;
105 use_time_param =
true;
108 const char kUsage[] =
109 "Usage: see flags.\nThis program parses and solve a flatzinc problem.";
111 absl::SetProgramUsageMessage(kUsage);
112 const std::vector<char*> residual_flags =
113 absl::ParseCommandLine(*argc, *argv);
117 if (use_time_param) {
118 absl::SetFlag(&FLAGS_time_limit, absl::GetFlag(FLAGS_time_limit) / 1000.0);
120 return residual_flags;
127 std::string problem_name =
128 input_is_filename ?
input : absl::GetFlag(FLAGS_fz_model_name);
129 if (input_is_filename || absl::EndsWith(problem_name,
".fzn")) {
130 CHECK(absl::EndsWith(problem_name,
".fzn"));
131 problem_name.resize(problem_name.size() - 4);
132 const size_t found = problem_name.find_last_of(
"/\\");
133 if (found != std::string::npos) {
134 problem_name = problem_name.substr(found + 1);
138 if (input_is_filename) {
144 FZLOG <<
"File " << (input_is_filename ?
input :
"stdin") <<
" parsed in "
165 int main(
int argc,
char** argv) {
168 const std::vector<char*> residual_flags =
172 if (absl::GetFlag(FLAGS_read_from_stdin)) {
173 std::string currentLine;
174 while (std::getline(std::cin, currentLine)) {
175 input.append(currentLine);
178 if (residual_flags.empty()) {
179 LOG(
ERROR) <<
"Usage: " << argv[0] <<
" <file>";
182 input = residual_flags.back();
187 input, !absl::GetFlag(FLAGS_read_from_stdin));
189 parameters.display_all_solutions = absl::GetFlag(FLAGS_all_solutions);
190 parameters.use_free_search = absl::GetFlag(FLAGS_free_search);
191 parameters.verbose_logging = absl::GetFlag(FLAGS_fz_logging);
192 if (absl::GetFlag(FLAGS_num_solutions) == 0) {
193 absl::SetFlag(&FLAGS_num_solutions,
194 absl::GetFlag(FLAGS_all_solutions) ?
kint32max : 1);
196 parameters.max_number_of_solutions = absl::GetFlag(FLAGS_num_solutions);
197 parameters.random_seed = absl::GetFlag(FLAGS_fz_seed);
198 parameters.display_statistics = absl::GetFlag(FLAGS_statistics);
199 parameters.number_of_threads = absl::GetFlag(FLAGS_threads);
200 parameters.max_time_in_seconds = absl::GetFlag(FLAGS_time_limit);