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.

104 lines
3.1 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/. */
#ifndef __MINIZINC_GECODE_FZN_SPACE_HH__
#define __MINIZINC_GECODE_FZN_SPACE_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
#include <minizinc/solver_instance_base.hh>
namespace MiniZinc {
class FznSpace : public Gecode::Space {
public:
/// The integer variables
std::vector<Gecode::IntVar> iv;
/// The introduced integer variables
Gecode::IntVarArray iv_aux;
/// Indicates whether an integer variable is introduced by mzn2fzn
std::vector<bool> iv_introduced;
/// Indicates whether an integer variable is defined
std::vector<bool> iv_defined;
/// The Boolean variables
std::vector<Gecode::BoolVar> bv;
/// The introduced Boolean variables
Gecode::BoolVarArray bv_aux;
/// Indicates whether a Boolean variable is introduced by mzn2fzn
std::vector<bool> bv_introduced;
/// Indicates whether a Boolean variable is defined
std::vector<bool> bv_defined;
#ifdef GECODE_HAS_SET_VARS
/// The set variables
std::vector<Gecode::SetVar> sv;
/// The introduced set variables
Gecode::SetVarArray sv_aux;
/// Indicates whether a set variable is introduced by mzn2fzn
std::vector<bool> sv_introduced;
/// Indicates whether a set variable is introduced by mzn2fzn
std::vector<bool> sv_defined;
#endif
#ifdef GECODE_HAS_FLOAT_VARS
/// The float variables
std::vector<Gecode::FloatVar> fv;
/// The introduced float variables
Gecode::FloatVarArray fv_aux;
/// Indicates whether a float variable is introduced by mzn2fzn
std::vector<bool> fv_introduced;
/// Indicates whether a float variable is defined
std::vector<bool> fv_defined;
#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&);
/// standard constructor
FznSpace(void) : _optVarIsInt(true), _optVarIdx(-1), _copyAuxVars(true){};
~FznSpace(void) {}
/// get the index of the Boolean variable in bv; return -1 if not exists
int getBoolAliasIndex(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 i;
}
}
return -1; // we should have found the boolvar in bv
}
protected:
/// Implement optimization
virtual void constrain(const Space& s);
/// Copy function
virtual Gecode::Space* copy(void);
};
} // namespace MiniZinc
#endif