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

101 lines
3.0 KiB
C++

/*
* Main authors:
* Kevin Leo <kevin.leo@monash.edu>
* Andrea Rendl <andrea.rendl@nicta.com.au>
* Guido Tack <guido.tack@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/solver_instance_base.hh>
#include <gecode/driver.hh>
#include <gecode/int.hh>
#include <gecode/kernel.hh>
#ifdef GECODE_HAS_SET_VARS
#include <gecode/set.hh>
#endif
#ifdef GECODE_HAS_FLOAT_VARS
#include <gecode/float.hh>
#endif
#undef ERROR
namespace MiniZinc {
class FznSpace : public Gecode::Space {
public:
/// The integer variables
std::vector<Gecode::IntVar> iv;
/// The introduced integer variables
Gecode::IntVarArray ivAux;
/// Indicates whether an integer variable is introduced by mzn2fzn
std::vector<bool> ivIntroduced;
/// Indicates whether an integer variable is defined
std::vector<bool> ivDefined;
/// The Boolean variables
std::vector<Gecode::BoolVar> bv;
/// The introduced Boolean variables
Gecode::BoolVarArray bvAux;
/// Indicates whether a Boolean variable is introduced by mzn2fzn
std::vector<bool> bvIntroduced;
/// Indicates whether a Boolean variable is defined
std::vector<bool> bvDefined;
#ifdef GECODE_HAS_SET_VARS
/// The set variables
std::vector<Gecode::SetVar> sv;
/// The introduced set variables
Gecode::SetVarArray svAux;
/// Indicates whether a set variable is introduced by mzn2fzn
std::vector<bool> svIntroduced;
/// Indicates whether a set variable is introduced by mzn2fzn
std::vector<bool> svDefined;
#endif
#ifdef GECODE_HAS_FLOAT_VARS
/// The float variables
std::vector<Gecode::FloatVar> fv;
/// The introduced float variables
Gecode::FloatVarArray fvAux;
/// Indicates whether a float variable is introduced by mzn2fzn
std::vector<bool> fvIntroduced;
/// Indicates whether a float variable is defined
std::vector<bool> fvDefined;
#endif
/// Indicates if the objective variable is integer (float otherwise)
bool optVarIsInt;
/// Index of the variable to optimize
int optVarIdx;
/// Whether the introduced variables still need to be copied
bool copyAuxVars;
/// solve type (SAT, MIN or MAX)
MiniZinc::SolveI::SolveType solveType;
/// copy constructor
FznSpace(FznSpace& f);
/// standard constructor
FznSpace() : optVarIsInt(true), optVarIdx(-1), copyAuxVars(true) {}
~FznSpace() override {}
/// get the index of the Boolean variable in bv; return -1 if not exists
int getBoolAliasIndex(const Gecode::BoolVar& bvar) {
for (unsigned int i = 0; i < bv.size(); i++) {
if (bv[i].varimp() == bvar.varimp()) {
// std::cout << "DEBUG: settings bool alias of variable to index " << i << std::endl;
return static_cast<int>(i);
}
}
return -1; // we should have found the boolvar in bv
}
protected:
/// Implement optimization
void constrain(const Space& s) override;
/// Copy function
Gecode::Space* copy() override;
};
} // namespace MiniZinc