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 1d9faf38de Squashed 'software/gecode/' content from commit 313e8764
git-subtree-dir: software/gecode
git-subtree-split: 313e87646da4fc2752a70e83df16d993121a8e40
2021-06-16 14:02:33 +10:00

345 lines
12 KiB
C++

/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
/*
* Main authors:
* Christian Schulte <schulte@gecode.org>
*
* Copyright:
* Christian Schulte, 2017
*
* This file is part of Gecode, the generic constraint
* development environment:
* http://www.gecode.org
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
#ifndef GECODE_FLATZINC_BRANCH_HH
#define GECODE_FLATZINC_BRANCH_HH
#include <gecode/int.hh>
#include <gecode/int/branch.hh>
#include <gecode/flatzinc.hh>
namespace Gecode { namespace FlatZinc {
/// Which integer or Boolean variable to select for branching
class IntBoolVarBranch : public VarBranch<IntVar> {
public:
/// Which variable selection
enum Select {
SEL_AFC_MAX, ///< With largest accumulated failure count
SEL_ACTION_MAX, ///< With highest action
SEL_CHB_MAX, ///< With highest CHB Q-score
SEL_AFC_SIZE_MAX, ///< With largest accumulated failure count divided by domain size
SEL_ACTION_SIZE_MAX, ///< With largest action divided by domain size
SEL_CHB_SIZE_MAX ///< With largest CHB Q-score divided by domain size
};
protected:
/// Which variable to select
Select s;
/// Integer AFC
IntAFC iafc;
/// Boolean AFC
BoolAFC bafc;
/// Integer action
IntAction iaction;
/// Boolean action
BoolAction baction;
/// Integer CHB
IntCHB ichb;
/// Boolean CHB
BoolCHB bchb;
public:
/// Initialize with selection strategy \a s and decay factor \a d
IntBoolVarBranch(Select s, double d);
/// Initialize with selection strategy \a s and AFC \a i and \a b
IntBoolVarBranch(Select s, IntAFC i, BoolAFC b);
/// Initialize with selection strategy \a s and action \a i and \a b
IntBoolVarBranch(Select s, IntAction i, BoolAction b);
/// Initialize with selection strategy \a s and CHB \a i and \a b
IntBoolVarBranch(Select s, IntCHB i, BoolCHB b);
/// Return selection strategy
Select select(void) const;
/// Return integer AFC
IntAFC intafc(void) const;
/// Return Boolean AFC
BoolAFC boolafc(void) const;
/// Return integer action
IntAction intaction(void) const;
/// Return Boolean action
BoolAction boolaction(void) const;
/// Return integer CHB
IntCHB intchb(void) const;
/// Return Boolean AFC
BoolCHB boolchb(void) const;
/// Expand AFC, action, and CHB
void expand(Home home, const IntVarArgs& x, const BoolVarArgs& y);
};
/// Variable selection for both integer and Boolean variables
//@{
/// Select variable with largest accumulated failure count
IntBoolVarBranch INTBOOL_VAR_AFC_MAX(double d=1.0);
/// Select variable with largest accumulated failure count
IntBoolVarBranch INTBOOL_VAR_AFC_MAX(IntAFC ia, BoolAFC ba);
/// Select variable with highest action
IntBoolVarBranch INTBOOL_VAR_ACTION_MAX(double d=1.0);
/// Select variable with highest action
IntBoolVarBranch INTBOOL_VAR_ACTION_MAX(IntAction ia, BoolAction ba);
/// Select variable with largest CHB Q-score
IntBoolVarBranch INTBOOL_VAR_CHB_MAX(double d=1.0);
/// Select variable with largest CHB Q-score
IntBoolVarBranch INTBOOL_VAR_CHB_MAX(IntCHB ic, BoolCHB bc);
/// Select variable with largest accumulated failure count divided by domain size
IntBoolVarBranch INTBOOL_VAR_AFC_SIZE_MAX(double d=1.0);
/// Select variable with largest accumulated failure count divided by domain size
IntBoolVarBranch INTBOOL_VAR_AFC_SIZE_MAX(IntAFC ia, BoolAFC ba);
/// Select variable with largest action divided by domain size
IntBoolVarBranch INTBOOL_VAR_ACTION_SIZE_MAX(double d=1.0);
/// Select variable with largest action divided by domain size
IntBoolVarBranch INTBOOL_VAR_ACTION_SIZE_MAX(IntAction ia, BoolAction ba);
/// Select variable with largest CHB Q-score divided by domain size
IntBoolVarBranch INTBOOL_VAR_CHB_SIZE_MAX(double d=1.0);
/// Select variable with largest CHB Q-score divided by domain size
IntBoolVarBranch INTBOOL_VAR_CHB_SIZE_MAX(IntCHB ic, BoolCHB bc);
//@}
/// Select by maximal AFC
class MeritMaxAFC {
protected:
/// Integer AFC information
IntAFC iafc;
/// Boolean AFC information
BoolAFC bafc;
public:
/// Constructor for initialization
MeritMaxAFC(Space& home, const IntBoolVarBranch& ibvb);
/// Constructor for cloning
MeritMaxAFC(Space& home, MeritMaxAFC& m);
/// Return merit
double operator()(Int::IntView x, int i) const;
/// Return merit
double operator()(Int::BoolView x, int i) const;
/// Dispose
void dispose(void);
};
/// Select by maximal AFC over size
class MeritMaxAFCSize {
protected:
/// Integer AFC information
IntAFC iafc;
/// Boolean AFC information
BoolAFC bafc;
public:
/// Constructor for initialization
MeritMaxAFCSize(Space& home, const IntBoolVarBranch& ibvb);
/// Constructor for cloning
MeritMaxAFCSize(Space& home, MeritMaxAFCSize& m);
/// Return merit
double operator()(Int::IntView x, int i) const;
/// Return merit
double operator()(Int::BoolView x, int i) const;
/// Dispose
void dispose(void);
};
/// Select by maximal Action
class MeritMaxAction {
protected:
/// Integer Action information
IntAction iaction;
/// Boolean Action information
BoolAction baction;
public:
/// Constructor for initialization
MeritMaxAction(Space& home, const IntBoolVarBranch& ibvb);
/// Constructor for cloning
MeritMaxAction(Space& home, MeritMaxAction& m);
/// Return merit
double operator()(Int::IntView x, int i) const;
/// Return merit
double operator()(Int::BoolView x, int i) const;
/// Dispose
void dispose(void);
};
/// Select by maximal Action over size
class MeritMaxActionSize {
protected:
/// Integer Action information
IntAction iaction;
/// Boolean Action information
BoolAction baction;
public:
/// Constructor for initialization
MeritMaxActionSize(Space& home, const IntBoolVarBranch& ibvb);
/// Constructor for cloning
MeritMaxActionSize(Space& home, MeritMaxActionSize& m);
/// Return merit
double operator()(Int::IntView x, int i) const;
/// Return merit
double operator()(Int::BoolView x, int i) const;
/// Dispose
void dispose(void);
};
/// Select by maximal CHB
class MeritMaxCHB {
protected:
/// Integer CHB information
IntCHB ichb;
/// Boolean CHB information
BoolCHB bchb;
public:
/// Constructor for initialization
MeritMaxCHB(Space& home, const IntBoolVarBranch& ibvb);
/// Constructor for cloning
MeritMaxCHB(Space& home, MeritMaxCHB& m);
/// Return merit
double operator()(Int::IntView x, int i) const;
/// Return merit
double operator()(Int::BoolView x, int i) const;
/// Dispose
void dispose(void);
};
/// Select by maximal CHB over size
class MeritMaxCHBSize {
protected:
/// Integer CHB information
IntCHB ichb;
/// Boolean CHB information
BoolCHB bchb;
public:
/// Constructor for initialization
MeritMaxCHBSize(Space& home, const IntBoolVarBranch& ibvb);
/// Constructor for cloning
MeritMaxCHBSize(Space& home, MeritMaxCHBSize& m);
/// Return merit
double operator()(Int::IntView x, int i) const;
/// Return merit
double operator()(Int::BoolView x, int i) const;
/// Dispose
void dispose(void);
};
/// %Choice storing position and value
class GECODE_VTABLE_EXPORT PosIntChoice : public Choice {
private:
/// Position of view to assign
int _pos;
/// Value to assign to
int _val;
public:
/// Initialize choice for brancher \a b, number of alternatives \a a, position \a p, and value \a n
PosIntChoice(const Brancher& b, unsigned int a, int p, int n);
/// Return position of view to assign
int pos(void) const;
/// Return value to assign to
int val(void) const;
/// Archive into \a e
virtual void archive(Archive& e) const;
};
/// Base-class for brancher for integer and Boolean views
class IntBoolBrancherBase : public Brancher {
protected:
/// Integer views to branch on
ViewArray<Int::IntView> x;
/// Boolean views to branch on
ViewArray<Int::BoolView> y;
/// Unassigned views start here (might be in \a x or \a y)
mutable int start;
/// Integer value selection and commit object
ValSelCommitBase<Int::IntView,int>* xvsc;
/// Boolean value selection and commit object
ValSelCommitBase<Int::BoolView,int>* yvsc;
/// Constructor for cloning \a b
IntBoolBrancherBase(Space& home, IntBoolBrancherBase& b);
/// Constructor for creation
IntBoolBrancherBase(Home home,
ViewArray<Int::IntView> x, ViewArray<Int::BoolView> y,
ValSelCommitBase<Int::IntView,int>* xvsc,
ValSelCommitBase<Int::BoolView,int>* yvsc);
public:
/// Check status of brancher, return true if alternatives left
virtual bool status(const Space& home) const;
/// Return choice
virtual const Choice* choice(Space& home) = 0;
/// Return choice
virtual const Choice* choice(const Space& home, Archive& e);
/// Perform commit for choice \a c and alternative \a b
virtual ExecStatus commit(Space& home, const Choice& c, unsigned int b);
/// Create no-good literal for choice \a c and alternative \a b
virtual NGL* ngl(Space& home, const Choice& c, unsigned int b) const;
/// Print branch for choice \a c and alternative \a b
virtual void print(const Space& home, const Choice& c, unsigned int b,
std::ostream& o) const;
/// Delete brancher and return its size
virtual size_t dispose(Space& home);
};
/// Brancher for integer and Boolean views
template<class Merit>
class IntBoolBrancher : public IntBoolBrancherBase {
protected:
/// Selection by maximal merit
Merit merit;
/// Constructor for cloning \a b
IntBoolBrancher(Space& home, IntBoolBrancher& b);
/// Constructor for creation
IntBoolBrancher(Home home,
ViewArray<Int::IntView> x, ViewArray<Int::BoolView> y,
Merit& m,
ValSelCommitBase<Int::IntView,int>* xvsc,
ValSelCommitBase<Int::BoolView,int>* yvsc);
public:
/// Return choice
virtual const Choice* choice(Space& home);
/// Perform cloning
virtual Actor* copy(Space& home);
/// Post brancher
static void post(Home home,
ViewArray<Int::IntView> x, ViewArray<Int::BoolView> y,
Merit& m,
ValSelCommitBase<Int::IntView,int>* xvsc,
ValSelCommitBase<Int::BoolView,int>* yvsc);
/// Delete brancher and return its size
virtual size_t dispose(Space& home);
};
/// Map respective integer value selection to Boolean value selection
BoolValBranch i2b(const IntValBranch& ivb);
/// Branch function for integer and Boolean variables
GECODE_FLATZINC_EXPORT void
branch(Home home, const IntVarArgs& x, const BoolVarArgs& y,
IntBoolVarBranch vars, IntValBranch vals);
}}
#include <gecode/flatzinc/branch.hpp>
#endif
// STATISTICS: flatzinc-branch