1
0
This repository has been archived on 2025-03-06. You can view files and clone it, but cannot push or open issues or pull requests.
Jip J. Dekker fad1b07018 Squashed 'software/minizinc/' content from commit 4f10c8205
git-subtree-dir: software/minizinc
git-subtree-split: 4f10c82056ffcb1041d7ffef29d77a7eef92cf76
2021-06-16 14:06:46 +10:00

136 lines
4.0 KiB
C++

/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
/*
* Main authors:
* Guido Tack <guido.tack@monash.edu>
* Gleb Belov <gleb.belov@monash.edu>
*/
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#pragma once
#include <minizinc/MIPdomains.hh>
#include <minizinc/astexception.hh>
#include <minizinc/builtins.hh>
#include <minizinc/file_utils.hh>
#include <minizinc/flatten.hh>
#include <minizinc/flatten_internal.hh> // temp., TODO
#include <minizinc/model.hh>
#include <minizinc/optimize.hh>
#include <minizinc/parser.hh>
#include <minizinc/passes/compile_pass.hh>
#include <minizinc/solver_instance.hh>
#include <minizinc/timer.hh>
#include <minizinc/typecheck.hh>
#include <minizinc/utils.hh>
#include <ctime>
#include <iomanip>
#include <memory>
#include <string>
#include <vector>
#ifdef HAS_GECODE
#include <minizinc/passes/gecode_pass.hh>
#endif
namespace MiniZinc {
class Flattener {
private:
std::unique_ptr<Env> _pEnv;
std::ostream& _os;
std::ostream& _log;
public:
Flattener(std::ostream& os, std::ostream& log, std::string stdlibDir);
~Flattener();
bool processOption(int& i, std::vector<std::string>& argv,
const std::string& workingDir = std::string());
static void printVersion(std::ostream& os);
void printHelp(std::ostream& os) const;
void flatten(const std::string& modelString = std::string(),
const std::string& modelName = std::string("stdin"));
void printStatistics(std::ostream& os);
void setFlagVerbose(bool f) { _flags.verbose = f; }
bool getFlagVerbose() const { return _flags.verbose; }
void setFlagStatistics(bool f) { _flags.statistics = f; }
bool getFlagStatistics() const { return _flags.statistics; }
void setFlagTimelimit(unsigned long long int t) { _fopts.timeout = t; }
unsigned long long int getFlagTimelimit() const { return _fopts.timeout; }
void setFlagOutputByDefault(bool f) { _fOutputByDefault = f; }
Env* getEnv() const {
assert(_pEnv.get());
return _pEnv.get();
}
bool hasInputFiles() const {
return !_filenames.empty() || _flags.stdinInput || !_flagSolutionCheckModel.empty();
}
SolverInstance::Status status = SolverInstance::UNKNOWN;
private:
Env* multiPassFlatten(const std::vector<std::unique_ptr<Pass> >& passes);
bool _fOutputByDefault = false; // if the class is used in mzn2fzn, write .fzn+.ozn by default
std::vector<std::string> _filenames;
std::vector<std::string> _datafiles;
std::vector<std::string> _includePaths;
bool _isFlatzinc = false;
struct {
bool typecheck = true;
bool verbose = false;
bool newfzn = false;
bool optimize = true;
bool chainCompression = true;
bool werror = false;
bool onlyRangeDomains = false;
bool allowUnboundedVars = false;
bool noMIPdomains = false;
bool statistics = false;
bool stdinInput = false;
bool allowMultiAssign = false;
bool gecode = false;
bool twoPass = false;
bool sac = false;
bool shave = false;
bool noOutputOzn = false;
bool keepMznPaths = false;
bool outputFznStdout = false;
bool outputOznStdout = false;
bool outputPathsStdout = false;
bool instanceCheckOnly = false;
bool modelCheckOnly = false;
bool modelInterfaceOnly = false;
bool modelTypesOnly = false;
bool outputObjective = false;
bool outputOutputItem = false;
bool compileSolutionCheckModel = false;
} _flags;
int _optMIPDmaxIntvEE = 0;
double _optMIPDmaxDensEE = 0.0;
unsigned int _flagPrePasses = 1;
std::string _stdLibDir;
std::string _globalsDir;
std::string _flagOutputBase;
std::string _flagOutputFzn;
std::string _flagOutputOzn;
std::string _flagOutputPaths;
FlatteningOptions::OutputMode _flagOutputMode = FlatteningOptions::OUTPUT_ITEM;
std::string _flagSolutionCheckModel;
FlatteningOptions _fopts;
Timer _starttime;
};
} // namespace MiniZinc