20#include "absl/strings/str_split.h"
30#include "absl/flags/flag.h"
31#include "absl/flags/parse.h"
32#include "absl/flags/usage.h"
45ABSL_FLAG(
bool, all_solutions,
false,
"Search for all solutions.");
47 "Maximum number of solution to search for, 0 means unspecified.");
49 "If false, the solver must follow the defined search."
50 "If true, other search are allowed.");
51ABSL_FLAG(
int, threads, 0,
"Number of threads the solver will use.");
52ABSL_FLAG(
bool, presolve,
true,
"Presolve the model to simplify it.");
53ABSL_FLAG(
bool, statistics,
false,
"Print solver statistics after search.");
55 "Read the FlatZinc from stdin, not from a file.");
58 "Define problem name when reading from stdin.");
59ABSL_FLAG(std::string, params,
"",
"SatParameters as a text proto.");
61 "Print logging information from the flatzinc interpreter.");
63 "Display solutions in the flatzinc format");
69 char all_param[] =
"--all_solutions";
70 char free_param[] =
"--free_search";
71 char threads_param[] =
"--threads";
72 char solutions_param[] =
"--num_solutions";
73 char logging_param[] =
"--fz_logging";
74 char statistics_param[] =
"--statistics";
75 char seed_param[] =
"--fz_seed";
76 char time_param[] =
"--time_limit";
77 bool use_time_param =
false;
78 for (
int i = 1; i < *argc; ++i) {
79 if (strcmp((*argv)[i],
"-a") == 0) {
80 (*argv)[i] = all_param;
82 if (strcmp((*argv)[i],
"-f") == 0) {
83 (*argv)[i] = free_param;
85 if (strcmp((*argv)[i],
"-p") == 0) {
86 (*argv)[i] = threads_param;
88 if (strcmp((*argv)[i],
"-n") == 0) {
89 (*argv)[i] = solutions_param;
91 if (strcmp((*argv)[i],
"-l") == 0) {
92 (*argv)[i] = logging_param;
94 if (strcmp((*argv)[i],
"-s") == 0) {
95 (*argv)[i] = statistics_param;
97 if (strcmp((*argv)[i],
"-r") == 0) {
98 (*argv)[i] = seed_param;
100 if (strcmp((*argv)[i],
"-t") == 0) {
101 (*argv)[i] = time_param;
102 use_time_param =
true;
105 const char kUsage[] =
106 "Usage: see flags.\nThis program parses and solve a flatzinc problem.";
108 absl::SetProgramUsageMessage(kUsage);
109 const std::vector<char*> residual_flags =
110 absl::ParseCommandLine(*argc, *argv);
114 if (use_time_param) {
115 absl::SetFlag(&FLAGS_time_limit, absl::GetFlag(FLAGS_time_limit) / 1000.0);
117 return residual_flags;
125 std::string problem_name =
126 input_is_filename ?
input : absl::GetFlag(FLAGS_fz_model_name);
127 if (input_is_filename || absl::EndsWith(problem_name,
".fzn")) {
128 CHECK(absl::EndsWith(problem_name,
".fzn"))
129 <<
"Unrecognized flatzinc file: `" << problem_name <<
"'";
130 problem_name.resize(problem_name.size() - 4);
131 const size_t found = problem_name.find_last_of(
"/\\");
132 if (found != std::string::npos) {
133 problem_name = problem_name.substr(found + 1);
137 if (input_is_filename) {
144 " parsed in ", timer.
GetInMs(),
" ms");
164 if (multi_line_input.empty()) {
165 std::cout << std::endl;
168 const absl::string_view flatzinc_prefix =
169 absl::GetFlag(FLAGS_use_flatzinc_format) ?
"%% " :
"";
170 const std::vector<absl::string_view> lines =
171 absl::StrSplit(multi_line_input,
'\n', absl::SkipEmpty());
172 for (
const absl::string_view& line : lines) {
173 std::cout << flatzinc_prefix << line << std::endl;
180int main(
int argc,
char** argv) {
183 const std::vector<char*> residual_flags =
187 if (absl::GetFlag(FLAGS_read_from_stdin)) {
188 std::string currentLine;
189 while (std::getline(std::cin, currentLine)) {
190 input.append(currentLine);
193 if (residual_flags.empty()) {
194 LOG(
ERROR) <<
"Usage: " << argv[0] <<
" <file>";
197 input = residual_flags.back();
206 input, !absl::GetFlag(FLAGS_read_from_stdin), &logger);
208 parameters.display_all_solutions = absl::GetFlag(FLAGS_all_solutions);
209 parameters.use_free_search = absl::GetFlag(FLAGS_free_search);
210 parameters.log_search_progress = absl::GetFlag(FLAGS_fz_logging);
211 if (absl::GetFlag(FLAGS_num_solutions) == 0) {
212 absl::SetFlag(&FLAGS_num_solutions,
213 absl::GetFlag(FLAGS_all_solutions)
217 parameters.max_number_of_solutions = absl::GetFlag(FLAGS_num_solutions);
218 parameters.random_seed = absl::GetFlag(FLAGS_fz_seed);
219 parameters.display_statistics = absl::GetFlag(FLAGS_statistics);
220 parameters.number_of_threads = absl::GetFlag(FLAGS_threads);
221 parameters.max_time_in_seconds = absl::GetFlag(FLAGS_time_limit);
225 solution_logger.
EnableLogging(absl::GetFlag(FLAGS_use_flatzinc_format));
228 absl::GetFlag(FLAGS_params),
229 &logger, &solution_logger);
void SetLogToStdOut(bool enable)
void AddInfoLoggingCallback(std::function< void(const std::string &message)> callback)
void EnableLogging(bool enable)
void PrintStatistics() const
ModelSharedTimeLimit * time_limit
ABSL_FLAG(double, time_limit, 0, "time limit in seconds.")
int main(int argc, char **argv)
void InitGoogleLogging(const char *argv0)
void LogInFlatzincFormat(const std::string &multi_line_input)
bool ParseFlatzincString(const std::string &input, Model *model)
bool ParseFlatzincFile(const std::string &filename, Model *model)
Model ParseFlatzincModel(const std::string &input, bool input_is_filename, SolverLogger *logger)
std::vector< char * > FixAndParseParameters(int *argc, char ***argv)
void SolveFzWithCpModelProto(const fz::Model &fz_model, const fz::FlatzincSatParameters &p, const std::string &sat_params, SolverLogger *logger, SolverLogger *solution_logger)
Collection of objects used to extend the Constraint Solver library.
static int input(yyscan_t yyscanner)
#define SOLVER_LOG(logger,...)