70a1cfa856 Add reasoning about why a restart happens 5db96c6afc Add initial version of the 'complete' propagator 3410436fc5 Fix include problems on Linux and Windows 0218f3e7be Remove deprecated restart_count from the variables set on restart 7f4a528ced Fix makefile mistake for LastVal constraint 8a39aee00d Initialise LastVal stored as the minimal in the domain 86707c674e Update STATUS to match the new enum 44d672100f Add support for LastVal from FlatZinc bd8af2e8f6 Subsume after propagation 2f07e027ab Add LastVal propagator f05cf9daba Output number of copies 707e30c0f0 Update generated parser files 179ee693cc Add restart_number() builtin (to work around the problem that otherwise we can't implement round robin style search) 04a492da17 Fix restart numbers (didn't count incomplete neighbourhoods) fbaa3529ec Initial implementation of on_restart 6dd39a73dd Update LICENSE 8f5ea30eba Update LICENSE 4236a2e5ec Use std::vector instead of std::array c53655d685 Dynamically adjust test batch sizes 37248557b6 Require C++11 cc60ea7cde Minor, remove exraneous newline in changelog 74c5f54b9f Make Region pool thread local 6f04ac3514 Use atomic for propagator identifier 2e0c275b07 Add support for parallel testing 3ada422b76 Refactor, extracted run_test function 787c41b8c4 Refactor, move data and logic into Options 120fc512a7 Refactor, extract run_tests function 85dd87a4af Refactoring: Thread rand through calls in test cece9da4ef Refactor Assignments operator() to has_more 564410e4ee Refactor Assignment operator++ to next() e1c84af894 Separate test filtering from running 8558856298 Remove empty statement warnings a9d8cb64fa Fix compilation errors for CPProfiler support 9ec81a69b2 Add RestartStop REVERT: 313e87646d Fix include problems on Linux and Windows REVERT: 358b8ca63b Remove deprecated restart_count from the variables set on restart REVERT: 83508d5de2 Fix makefile mistake for LastVal constraint REVERT: 530bbaf107 Initialise LastVal stored as the minimal in the domain REVERT: 96ba0d3d7e Update STATUS to match the new enum REVERT: 7d772297f9 Add support for LastVal from FlatZinc REVERT: 98b0162d75 Subsume after propagation REVERT: 5cd4552144 Add LastVal propagator REVERT: 9b80e644b7 Output number of copies REVERT: aaa5301366 Update generated parser files REVERT: 6ff4efe6a4 Add restart_number() builtin (to work around the problem that otherwise we can't implement round robin style search) REVERT: 8bcbec5d6e Fix restart numbers (didn't count incomplete neighbourhoods) REVERT: 3f63e743b2 Initial implementation of on_restart REVERT: b6ffa462d1 Update LICENSE REVERT: ad0621c26c Update LICENSE REVERT: 93caa97684 Use std::vector instead of std::array REVERT: 32d6399b35 Dynamically adjust test batch sizes REVERT: e7f00e9977 Require C++11 REVERT: a5ba8e4282 Minor, remove exraneous newline in changelog REVERT: b24831354d Make Region pool thread local REVERT: b1a109ac2e Use atomic for propagator identifier REVERT: 3d77aaad71 Add support for parallel testing REVERT: b1b9526049 Refactor, extracted run_test function REVERT: 85b8a57f65 Refactor, move data and logic into Options REVERT: d2c1961437 Refactor, extract run_tests function REVERT: 0236327c75 Refactoring: Thread rand through calls in test REVERT: ba81289b02 Refactor Assignments operator() to has_more REVERT: 038a554bd8 Refactor Assignment operator++ to next() REVERT: f34f125131 Separate test filtering from running REVERT: cec6336ede Remove empty statement warnings REVERT: d63e1fc042 Fix compilation errors for CPProfiler support git-subtree-dir: software/gecode git-subtree-split: 70a1cfa856d138b0845d2681c46ca16f8507aebf
899 lines
28 KiB
C++
Executable File
899 lines
28 KiB
C++
Executable File
/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
|
/*
|
|
* Main authors:
|
|
* Christian Schulte <schulte@gecode.org>
|
|
*
|
|
* Copyright:
|
|
* Christian Schulte, 2009
|
|
*
|
|
* 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_DRIVER_HH
|
|
#define GECODE_DRIVER_HH
|
|
|
|
#include <gecode/minimodel.hh>
|
|
#include <gecode/search.hh>
|
|
#ifdef GECODE_HAS_GIST
|
|
#include <gecode/gist.hh>
|
|
#endif
|
|
|
|
/*
|
|
* Configure linking
|
|
*
|
|
*/
|
|
#if !defined(GECODE_STATIC_LIBS) && \
|
|
(defined(__CYGWIN__) || defined(__MINGW32__) || defined(_MSC_VER))
|
|
|
|
#ifdef GECODE_BUILD_DRIVER
|
|
#define GECODE_DRIVER_EXPORT __declspec( dllexport )
|
|
#else
|
|
#define GECODE_DRIVER_EXPORT __declspec( dllimport )
|
|
#endif
|
|
|
|
#else
|
|
|
|
#ifdef GECODE_GCC_HAS_CLASS_VISIBILITY
|
|
#define GECODE_DRIVER_EXPORT __attribute__ ((visibility("default")))
|
|
#else
|
|
#define GECODE_DRIVER_EXPORT
|
|
#endif
|
|
|
|
#endif
|
|
|
|
// Configure auto-linking
|
|
#ifndef GECODE_BUILD_DRIVER
|
|
#define GECODE_LIBRARY_NAME "Driver"
|
|
#include <gecode/support/auto-link.hpp>
|
|
#endif
|
|
|
|
/**
|
|
* \namespace Gecode::Driver
|
|
* \brief Script commandline driver
|
|
*
|
|
* The Gecode::Driver namespace contains support for passing common
|
|
* commandline options and for scripts that use the commandline
|
|
* options.
|
|
*
|
|
*/
|
|
|
|
namespace Gecode {
|
|
|
|
|
|
/**
|
|
* \defgroup TaskDriverCmd Commandline options for running scripts
|
|
* \ingroup TaskDriver
|
|
*/
|
|
|
|
/**
|
|
* \brief Different modes for executing scripts
|
|
* \ingroup TaskDriverCmd
|
|
*/
|
|
enum ScriptMode {
|
|
SM_SOLUTION, ///< Print solution and some statistics
|
|
SM_TIME, ///< Measure average runtime
|
|
SM_STAT, ///< Print statistics for script
|
|
SM_GIST, ///< Run script in Gist
|
|
};
|
|
|
|
/**
|
|
* \brief Different modes for restart-based search
|
|
* \ingroup TaskDriverCmd
|
|
*/
|
|
enum RestartMode {
|
|
RM_NONE, ///< No restarts
|
|
RM_CONSTANT, ///< Restart with constant sequence
|
|
RM_LINEAR, ///< Restart with linear sequence
|
|
RM_LUBY, ///< Restart with Luby sequence
|
|
RM_GEOMETRIC ///< Restart with geometric sequence
|
|
};
|
|
|
|
class BaseOptions;
|
|
|
|
namespace Driver {
|
|
/**
|
|
* \brief Base class for options
|
|
*
|
|
*/
|
|
class GECODE_DRIVER_EXPORT BaseOption {
|
|
friend class Gecode::BaseOptions;
|
|
protected:
|
|
const char* eopt; ///< String for option (excluding hyphen)
|
|
const char* iopt; ///< String for option (including hyphen)
|
|
const char* exp; ///< Short explanation
|
|
BaseOption* next; ///< Next option
|
|
/// Check for option and return its argument
|
|
char* argument(int argc, char* argv[]) const;
|
|
public:
|
|
/// Initialize for option \a o and explanation \a e
|
|
BaseOption(const char* o, const char* e);
|
|
/// Parse option at first position and return number of parsed arguments
|
|
virtual int parse(int argc, char* argv[]) = 0;
|
|
/// Print help text
|
|
virtual void help(void) = 0;
|
|
/// Destructor
|
|
virtual ~BaseOption(void);
|
|
/// Create heap-allocated copy of string \a s
|
|
static char* strdup(const char* s);
|
|
/// Create heap-allocated copy of string \a s with hyphen added
|
|
static char* stredup(const char* s);
|
|
/// Delete heap-allocated copy of string \a s
|
|
static void strdel(const char* s);
|
|
};
|
|
|
|
/**
|
|
* \brief String-valued option
|
|
*
|
|
*/
|
|
class GECODE_DRIVER_EXPORT StringValueOption : public BaseOption {
|
|
protected:
|
|
const char* cur; ///< Current value
|
|
public:
|
|
/// Initialize for option \a o and explanation \a e and default value \a v
|
|
StringValueOption(const char* o, const char* e, const char* v=nullptr);
|
|
/// Set default value to \a v
|
|
void value(const char* v);
|
|
/// Return current option value
|
|
const char* value(void) const;
|
|
/// Parse option at first position and return number of parsed arguments
|
|
virtual int parse(int argc, char* argv[]);
|
|
/// Print help text
|
|
virtual void help(void);
|
|
/// Destructor
|
|
virtual ~StringValueOption(void);
|
|
};
|
|
|
|
|
|
/**
|
|
* \brief String-valued option (integer value defined by strings)
|
|
*
|
|
*/
|
|
class GECODE_DRIVER_EXPORT StringOption : public BaseOption {
|
|
protected:
|
|
/// Option value
|
|
class Value {
|
|
public:
|
|
int val; ///< Value for an option value
|
|
const char* opt; ///< String for option value
|
|
const char* help; ///< Optional help text
|
|
Value* next; ///< Next option value
|
|
};
|
|
int cur; ///< Current value
|
|
Value* fst; ///< First option value
|
|
Value* lst; ///< Last option value
|
|
public:
|
|
/// Initialize for option \a o and explanation \a e and default value \a v
|
|
StringOption(const char* o, const char* e, int v=0);
|
|
/// Set default value to \a v
|
|
void value(int v);
|
|
/// Return current option value
|
|
int value(void) const;
|
|
/// Add option value for value \a v, string \a o, and help text \a h
|
|
void add(int v, const char* o, const char* h = nullptr);
|
|
/// Parse option at first position and return number of parsed arguments
|
|
virtual int parse(int argc, char* argv[]);
|
|
/// Print help text
|
|
virtual void help(void);
|
|
/// Destructor
|
|
virtual ~StringOption(void);
|
|
};
|
|
|
|
|
|
/**
|
|
* \brief Integer option
|
|
*
|
|
*/
|
|
class GECODE_DRIVER_EXPORT IntOption : public BaseOption {
|
|
protected:
|
|
int cur; ///< Current value
|
|
public:
|
|
/// Initialize for option \a o and explanation \a e and default value \a v
|
|
IntOption(const char* o, const char* e, int v=0);
|
|
/// Set default value to \a v
|
|
void value(int v);
|
|
/// Return current option value
|
|
int value(void) const;
|
|
/// Parse option at first position and return number of parsed arguments
|
|
virtual int parse(int argc, char* argv[]);
|
|
/// Print help text
|
|
virtual void help(void);
|
|
};
|
|
|
|
/**
|
|
* \brief Unsigned integer option
|
|
*
|
|
*/
|
|
class GECODE_DRIVER_EXPORT UnsignedIntOption : public BaseOption {
|
|
protected:
|
|
unsigned int cur; ///< Current value
|
|
public:
|
|
/// Initialize for option \a o and explanation \a e and default value \a v
|
|
UnsignedIntOption(const char* o, const char* e, unsigned int v=0);
|
|
/// Set default value to \a v
|
|
void value(unsigned int v);
|
|
/// Return current option value
|
|
unsigned int value(void) const;
|
|
/// Parse option at first position and return number of parsed arguments
|
|
virtual int parse(int argc, char* argv[]);
|
|
/// Print help text
|
|
virtual void help(void);
|
|
};
|
|
|
|
/**
|
|
* \brief Unsigned long long integer option
|
|
*
|
|
*/
|
|
class GECODE_DRIVER_EXPORT UnsignedLongLongIntOption : public BaseOption {
|
|
protected:
|
|
unsigned long long int cur; ///< Current value
|
|
public:
|
|
/// Initialize for option \a o and explanation \a e and default value \a v
|
|
UnsignedLongLongIntOption(const char* o, const char* e,
|
|
unsigned long long int v=0);
|
|
/// Set default value to \a v
|
|
void value(unsigned long long int v);
|
|
/// Return current option value
|
|
unsigned long long int value(void) const;
|
|
/// Parse option at first position and return number of parsed arguments
|
|
virtual int parse(int argc, char* argv[]);
|
|
/// Print help text
|
|
virtual void help(void);
|
|
};
|
|
|
|
/**
|
|
* \brief Double option
|
|
*
|
|
*/
|
|
class GECODE_DRIVER_EXPORT DoubleOption : public BaseOption {
|
|
protected:
|
|
double cur; ///< Current value
|
|
public:
|
|
/// Initialize for option \a o and explanation \a e and default value \a v
|
|
DoubleOption(const char* o, const char* e, double v=0);
|
|
/// Set default value to \a v
|
|
void value(double v);
|
|
/// Return current option value
|
|
double value(void) const;
|
|
/// Parse option at first position and return number of parsed arguments
|
|
virtual int parse(int argc, char* argv[]);
|
|
/// Print help text
|
|
virtual void help(void);
|
|
};
|
|
|
|
/**
|
|
* \brief Boolean option
|
|
*
|
|
*/
|
|
class GECODE_DRIVER_EXPORT BoolOption : public BaseOption {
|
|
protected:
|
|
bool cur; ///< Current value
|
|
public:
|
|
/// Initialize for option \a o and explanation \a e and default value \a v
|
|
BoolOption(const char* o, const char* e, bool v=false);
|
|
/// Set default value to \a v
|
|
void value(bool v);
|
|
/// Return current option value
|
|
bool value(void) const;
|
|
/// Parse option at first position and return number of parsed arguments
|
|
virtual int parse(int argc, char* argv[]);
|
|
/// Print help text
|
|
virtual void help(void);
|
|
};
|
|
|
|
/**
|
|
* \brief Integer propagation level option
|
|
*
|
|
*/
|
|
class GECODE_DRIVER_EXPORT IplOption : public BaseOption {
|
|
protected:
|
|
IntPropLevel cur; ///< Current value
|
|
public:
|
|
/// Initialize with default value \a ipl
|
|
IplOption(IntPropLevel ipl=IPL_DEF);
|
|
/// Set default level to \a l
|
|
void value(IntPropLevel l);
|
|
/// Return current option value
|
|
IntPropLevel value(void) const;
|
|
/// Parse option at first position and return number of parsed arguments
|
|
virtual int parse(int argc, char* argv[]);
|
|
/// Print help text
|
|
virtual void help(void);
|
|
};
|
|
|
|
/**
|
|
* \brief Trace flag option
|
|
*
|
|
*/
|
|
class GECODE_DRIVER_EXPORT TraceOption : public BaseOption {
|
|
protected:
|
|
int cur; ///< Current value
|
|
public:
|
|
/// Initialize with no tracing
|
|
TraceOption(int f=0);
|
|
/// Set default trace flags to \a f
|
|
void value(int f);
|
|
/// Return current option value
|
|
int value(void) const;
|
|
/// Parse option at first position and return number of parsed arguments
|
|
virtual int parse(int argc, char* argv[]);
|
|
/// Print help text
|
|
virtual void help(void);
|
|
};
|
|
|
|
/**
|
|
* \brief Profiler option
|
|
*
|
|
*/
|
|
class GECODE_DRIVER_EXPORT ProfilerOption : public BaseOption {
|
|
protected:
|
|
unsigned int cur_port; ///< Current port
|
|
int cur_execution_id; ///< Current execution ID
|
|
public:
|
|
/// Initialize for option \a o and explanation \a e and default value \a v
|
|
ProfilerOption(const char* o, const char* e, unsigned int p = 0, int v = -1);
|
|
/// Set default port to \a p
|
|
void port(unsigned int p);
|
|
/// Return current port
|
|
unsigned int port(void) const;
|
|
/// Set default execution ID to \a i
|
|
void execution_id(int i);
|
|
/// Return current execution ID
|
|
int execution_id(void) const;
|
|
/// Parse option at first position and return number of parsed arguments
|
|
virtual int parse(int argc, char* argv[]);
|
|
/// Print help text
|
|
virtual void help(void);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* \brief Base class for script options
|
|
* \ingroup TaskDriverCmd
|
|
*/
|
|
class GECODE_DRIVER_EXPORT BaseOptions {
|
|
protected:
|
|
Driver::BaseOption* fst; ///< First registered option
|
|
Driver::BaseOption* lst; ///< Last registered option
|
|
const char* _name; ///< Script name
|
|
public:
|
|
/// Initialize options for script with name \a s
|
|
BaseOptions(const char* s);
|
|
/// Print help text
|
|
virtual void help(void);
|
|
|
|
/// Add new option \a o
|
|
void add(Driver::BaseOption& o);
|
|
/**
|
|
* \brief Parse options from arguments \a argv (number is \a argc)
|
|
*
|
|
* The options are parsed from position one onwards until no more options
|
|
* are detected. After parsing, the parsed arguments have been removed.
|
|
*
|
|
*/
|
|
void parse(int& argc, char* argv[]);
|
|
|
|
/// Return name of script
|
|
const char* name(void) const;
|
|
/// Set name of script
|
|
void name(const char*);
|
|
|
|
/// Destructor
|
|
virtual ~BaseOptions(void);
|
|
};
|
|
|
|
/**
|
|
* \brief %Options for scripts
|
|
* \ingroup TaskDriverCmd
|
|
*/
|
|
class GECODE_DRIVER_EXPORT Options : public BaseOptions {
|
|
protected:
|
|
/// \name Model options
|
|
//@{
|
|
Driver::StringOption _model; ///< General model options
|
|
Driver::StringOption _symmetry; ///< General symmetry options
|
|
Driver::StringOption _propagation; ///< Propagation options
|
|
Driver::IplOption _ipl; ///< Integer propagation level
|
|
Driver::StringOption _branching; ///< Branching options
|
|
Driver::DoubleOption _decay; ///< Decay option
|
|
Driver::UnsignedIntOption _seed; ///< Seed option
|
|
Driver::DoubleOption _step; ///< Step option
|
|
//@}
|
|
|
|
/// \name Search options
|
|
//@{
|
|
Driver::StringOption _search; ///< Search options
|
|
Driver::UnsignedLongLongIntOption
|
|
_solutions; ///< How many solutions
|
|
Driver::DoubleOption _threads; ///< How many threads to use
|
|
Driver::UnsignedIntOption _c_d; ///< Copy recomputation distance
|
|
Driver::UnsignedIntOption _a_d; ///< Adaptive recomputation distance
|
|
Driver::UnsignedIntOption _d_l; ///< Discrepancy limit for LDS
|
|
Driver::UnsignedLongLongIntOption
|
|
_node; ///< Cutoff for number of nodes
|
|
Driver::UnsignedLongLongIntOption
|
|
_fail; ///< Cutoff for number of failures
|
|
Driver::DoubleOption _time; ///< Cutoff for time
|
|
Driver::UnsignedIntOption _assets; ///< Number of assets in a portfolio
|
|
Driver::UnsignedIntOption _slice; ///< Size of a portfolio slice
|
|
Driver::StringOption _restart; ///< Restart method option
|
|
Driver::DoubleOption _r_base; ///< Restart base
|
|
Driver::UnsignedIntOption _r_scale; ///< Restart scale factor
|
|
Driver::UnsignedLongLongIntOption
|
|
_r_limit; ///< Cutoff for number of restarts
|
|
Driver::BoolOption _nogoods; ///< Whether to use no-goods
|
|
Driver::UnsignedIntOption _nogoods_limit; ///< Limit for no-good extraction
|
|
Driver::DoubleOption _relax; ///< Probability to relax variable
|
|
Driver::BoolOption _interrupt; ///< Whether to catch SIGINT
|
|
//@}
|
|
|
|
/// \name Execution options
|
|
//@{
|
|
Driver::StringOption _mode; ///< Script mode to run
|
|
Driver::UnsignedIntOption _samples; ///< How many samples
|
|
Driver::UnsignedIntOption _iterations; ///< How many iterations per sample
|
|
Driver::BoolOption _print_last; ///< Print only last solution found
|
|
Driver::StringValueOption _out_file; ///< Where to print solutions
|
|
Driver::StringValueOption _log_file; ///< Where to print statistics
|
|
Driver::TraceOption _trace; ///< Trace flags for tracing
|
|
|
|
#ifdef GECODE_HAS_CPPROFILER
|
|
Driver::ProfilerOption _profiler; ///< Options for the CP Profiler
|
|
#endif
|
|
|
|
//@}
|
|
|
|
public:
|
|
/// Initialize options for script with name \a s
|
|
Options(const char* s);
|
|
|
|
/// \name Model options
|
|
//@{
|
|
/// Set default model value
|
|
void model(int v);
|
|
/// Add model option value for value \a v, string \a o, and help \a h
|
|
void model(int v, const char* o, const char* h = nullptr);
|
|
/// Return model value
|
|
int model(void) const;
|
|
|
|
/// Set default symmetry value
|
|
void symmetry(int v);
|
|
/// Add symmetry option value for value \a v, string \a o, and help \a h
|
|
void symmetry(int v, const char* o, const char* h = nullptr);
|
|
/// Return symmetry value
|
|
int symmetry(void) const;
|
|
|
|
/// Set default propagation value
|
|
void propagation(int v);
|
|
/// Add propagation option value for value \a v, string \a o, and help \a h
|
|
void propagation(int v, const char* o, const char* h = nullptr);
|
|
/// Return propagation value
|
|
int propagation(void) const;
|
|
|
|
/// Set default integer propagation level
|
|
void ipl(IntPropLevel i);
|
|
/// Return integer propagation level
|
|
IntPropLevel ipl(void) const;
|
|
|
|
/// Set default branching value
|
|
void branching(int v);
|
|
/// Add branching option value for value \a v, string \a o, and help \a h
|
|
void branching(int v, const char* o, const char* h = nullptr);
|
|
/// Return branching value
|
|
int branching(void) const;
|
|
|
|
/// Set default decay factor
|
|
void decay(double d);
|
|
/// Return decay factor
|
|
double decay(void) const;
|
|
|
|
/// Set default seed value
|
|
void seed(unsigned int s);
|
|
/// Return seed value
|
|
unsigned int seed(void) const;
|
|
|
|
/// Set default step value
|
|
void step(double s);
|
|
/// Return step value
|
|
double step(void) const;
|
|
//@}
|
|
|
|
/// \name Search options
|
|
//@{
|
|
/// Set default search value
|
|
void search(int v);
|
|
/// Add search option value for value \a v, string \a o, and help \a h
|
|
void search(int v, const char* o, const char* h = nullptr);
|
|
/// Return search value
|
|
int search(void) const;
|
|
|
|
/// Set default number of solutions to search for
|
|
void solutions(unsigned long long int n);
|
|
/// Return number of solutions to search for
|
|
unsigned long long int solutions(void) const;
|
|
|
|
/// Set number of parallel threads
|
|
void threads(double n);
|
|
/// Return number of parallel threads
|
|
double threads(void) const;
|
|
|
|
/// Set default copy recomputation distance
|
|
void c_d(unsigned int d);
|
|
/// Return copy recomputation distance
|
|
unsigned int c_d(void) const;
|
|
|
|
/// Set default adaptive recomputation distance
|
|
void a_d(unsigned int d);
|
|
/// Return adaptive recomputation distance
|
|
unsigned int a_d(void) const;
|
|
|
|
/// Set default discrepancy limit for LDS
|
|
void d_l(unsigned int d);
|
|
/// Return discrepancy limit for LDS
|
|
unsigned int d_l(void) const;
|
|
|
|
/// Set default node cutoff
|
|
void node(unsigned long long int n);
|
|
/// Return node cutoff
|
|
unsigned long long int node(void) const;
|
|
|
|
/// Set default failure cutoff
|
|
void fail(unsigned long long int n);
|
|
/// Return failure cutoff
|
|
unsigned long long int fail(void) const;
|
|
|
|
/// Set default time cutoff
|
|
void time(double t);
|
|
/// Return time cutoff
|
|
double time(void) const;
|
|
|
|
/// Set default number of assets in a portfolio
|
|
void assets(unsigned int n);
|
|
/// Return slice size in a portfolio
|
|
unsigned int assets(void) const;
|
|
|
|
/// Set default slice size in a portfolio
|
|
void slice(unsigned int n);
|
|
/// Return slice size in a portfolio
|
|
unsigned int slice(void) const;
|
|
|
|
/// Set default restart mode
|
|
void restart(RestartMode r);
|
|
/// Return restart mode
|
|
RestartMode restart(void) const;
|
|
|
|
/// Set default restart base
|
|
void restart_base(double base);
|
|
/// Return restart base
|
|
double restart_base(void) const;
|
|
|
|
/// Set default restart scale factor
|
|
void restart_scale(unsigned int scale);
|
|
/// Return restart scale factor
|
|
unsigned int restart_scale(void) const;
|
|
|
|
/// Set default restart cutoff
|
|
void restart_limit(unsigned long long int n);
|
|
/// Return restart cutoff
|
|
unsigned long long int restart_limit(void) const;
|
|
|
|
/// Set default nogoods posting behavior
|
|
void nogoods(bool b);
|
|
/// Return whether nogoods are used
|
|
bool nogoods(void) const;
|
|
|
|
/// Set default nogoods depth limit
|
|
void nogoods_limit(unsigned int l);
|
|
/// Return depth limit for nogoods
|
|
unsigned int nogoods_limit(void) const;
|
|
|
|
/// Set default relax probability
|
|
void relax(double d);
|
|
/// Return default relax probability
|
|
double relax(void) const;
|
|
|
|
/// Set default interrupt behavior
|
|
void interrupt(bool b);
|
|
/// Return interrupt behavior
|
|
bool interrupt(void) const;
|
|
//@}
|
|
|
|
/// \name Execution options
|
|
//@{
|
|
/// Set default mode
|
|
void mode(ScriptMode em);
|
|
/// Return mode
|
|
ScriptMode mode(void) const;
|
|
|
|
/// Set default number of samples
|
|
void samples(unsigned int s);
|
|
/// Return number of samples
|
|
unsigned int samples(void) const;
|
|
|
|
/// Set default number of iterations
|
|
void iterations(unsigned int i);
|
|
/// Return number of iterations
|
|
unsigned int iterations(void) const;
|
|
|
|
/// Set whether to print only last solution found
|
|
void print_last(bool p);
|
|
/// Return whether to print only last solution found
|
|
bool print_last(void) const;
|
|
|
|
/// Set default output file name for solutions
|
|
void out_file(const char* f);
|
|
/// Get file name for solutions
|
|
const char* out_file(void) const;
|
|
|
|
/// Set default output file name for Gecode stats
|
|
void log_file(const char* f);
|
|
/// Get file name for Gecode stats
|
|
const char* log_file(void) const;
|
|
|
|
/// Set trace flags
|
|
void trace(int f);
|
|
/// Return trace flags
|
|
int trace(void) const;
|
|
|
|
#ifdef GECODE_HAS_CPPROFILER
|
|
/// Set profiler execution identifier
|
|
void profiler_id(int i);
|
|
/// Return profiler execution id
|
|
int profiler_id(void) const;
|
|
/// Set profiler port
|
|
void profiler_port(unsigned int p);
|
|
/// Return profiler execution id
|
|
unsigned int profiler_port(void) const;
|
|
#endif
|
|
//@}
|
|
|
|
#ifdef GECODE_HAS_GIST
|
|
/// Helper class storing Gist inspectors
|
|
class I_ {
|
|
private:
|
|
/// The double click inspectors
|
|
Support::DynamicArray<Gist::Inspector*,Heap> _click;
|
|
/// Number of double click inspectors
|
|
unsigned int n_click;
|
|
/// The solution inspectors
|
|
Support::DynamicArray<Gist::Inspector*,Heap> _solution;
|
|
/// Number of solution inspectors
|
|
unsigned int n_solution;
|
|
/// The move inspectors
|
|
Support::DynamicArray<Gist::Inspector*,Heap> _move;
|
|
/// Number of move inspectors
|
|
unsigned int n_move;
|
|
/// The comparators
|
|
Support::DynamicArray<Gist::Comparator*,Heap> _compare;
|
|
/// Number of comparators
|
|
unsigned int n_compare;
|
|
public:
|
|
/// Constructor
|
|
I_(void);
|
|
/// Add inspector that reacts on node double clicks
|
|
void click(Gist::Inspector* i);
|
|
/// Add inspector that reacts on each new solution that is found
|
|
void solution(Gist::Inspector* i);
|
|
/// Add inspector that reacts on each move of the cursor
|
|
void move(Gist::Inspector* i);
|
|
/// Add comparator
|
|
void compare(Gist::Comparator* i);
|
|
|
|
/// Return click inspector number \a i, or nullptr if it does not exist
|
|
Gist::Inspector* click(unsigned int i) const;
|
|
/// Return solution inspector number \a i, or nullptr if it does not exist
|
|
Gist::Inspector* solution(unsigned int i) const;
|
|
/// Return move inspector number \a i, or nullptr if it does not exist
|
|
Gist::Inspector* move(unsigned int i) const;
|
|
/// Return comparator number \a i, or nullptr if it does not exist
|
|
Gist::Comparator* compare(unsigned int i) const;
|
|
} inspect;
|
|
#endif
|
|
};
|
|
|
|
}
|
|
|
|
namespace Gecode {
|
|
|
|
/**
|
|
* \brief %Options for scripts with additional size parameter
|
|
* \ingroup TaskDriverCmd
|
|
*/
|
|
class GECODE_DRIVER_EXPORT SizeOptions : public Options {
|
|
protected:
|
|
unsigned int _size; ///< Size value
|
|
public:
|
|
/// Initialize options for script with name \a s
|
|
SizeOptions(const char* s);
|
|
/// Print help text
|
|
virtual void help(void);
|
|
/// Parse options from arguments \a argv (number is \a argc)
|
|
void parse(int& argc, char* argv[]);
|
|
|
|
/// Set default size
|
|
void size(unsigned int s);
|
|
/// Return size
|
|
unsigned int size(void) const;
|
|
};
|
|
|
|
/**
|
|
* \brief %Options for scripts with additional instance parameter
|
|
* \ingroup TaskDriverCmd
|
|
*/
|
|
class GECODE_DRIVER_EXPORT InstanceOptions : public Options {
|
|
protected:
|
|
const char* _inst; ///< Instance string
|
|
public:
|
|
/// Initialize options for script with name \a s
|
|
InstanceOptions(const char* s);
|
|
/// Print help text
|
|
virtual void help(void);
|
|
/// Parse options from arguments \a argv (number is \a argc)
|
|
void parse(int& argc, char* argv[]);
|
|
|
|
/// Set default instance name
|
|
void instance(const char* s);
|
|
/// Return instance name
|
|
const char* instance(void) const;
|
|
/// Destructor
|
|
~InstanceOptions(void);
|
|
};
|
|
|
|
}
|
|
|
|
#include <gecode/driver/options.hpp>
|
|
|
|
namespace Gecode { namespace Driver {
|
|
|
|
/**
|
|
* \brief Parametric base-class for scripts
|
|
*
|
|
* All scripts must inherit from this class
|
|
* - adds printing and comparison for Gist to scripts
|
|
* - run allows to execute scripts
|
|
*/
|
|
template<class BaseSpace>
|
|
class ScriptBase : public BaseSpace {
|
|
public:
|
|
/// Constructor
|
|
ScriptBase(const Options& opt);
|
|
/// Constructor used for cloning
|
|
ScriptBase(ScriptBase& e);
|
|
/// Print a solution to \a os
|
|
virtual void print(std::ostream& os) const;
|
|
/// Compare with \a s
|
|
virtual void compare(const Space& home, std::ostream& os) const;
|
|
/// Choose output stream according to \a sn
|
|
static std::ostream& select_ostream(const char* sn, std::ofstream& ofs);
|
|
/** Run script with search engine \a Engine and options \a opt
|
|
*
|
|
* In the solution and stat modes, search can be aborted by sending
|
|
* SIGINT to the process (i.e., pressing Ctrl-C on the command
|
|
* line).
|
|
*
|
|
* In case \a s is different from nullptr, the search engine uses
|
|
* \a s as root of the search tree.
|
|
*/
|
|
template<class Script, template<class> class Engine, class Options>
|
|
static void run(const Options& opt, Script* s=nullptr);
|
|
private:
|
|
template<class Script, template<class> class Engine, class Options,
|
|
template<class, template<class> class> class Meta>
|
|
static void runMeta(const Options& opt, Script* s);
|
|
};
|
|
|
|
#ifdef GECODE_HAS_FLOAT_VARS
|
|
|
|
/// Class to extract the step option value
|
|
template<class BaseSpace>
|
|
class ExtractStepOption : public BaseSpace {
|
|
public:
|
|
/// Constructor that extracts the step value
|
|
ExtractStepOption(const Options& opt)
|
|
: BaseSpace(opt.step()) {}
|
|
/// Constructor used for cloning
|
|
ExtractStepOption(BaseSpace& e)
|
|
: BaseSpace(e) {}
|
|
};
|
|
|
|
#endif
|
|
|
|
/// Class to ignore the step option value
|
|
template<class BaseSpace>
|
|
class IgnoreStepOption : public BaseSpace {
|
|
public:
|
|
/// Constructor
|
|
IgnoreStepOption(const Options&) {}
|
|
/// Constructor used for cloning
|
|
IgnoreStepOption(BaseSpace& e)
|
|
: BaseSpace(e) {}
|
|
};
|
|
|
|
}}
|
|
|
|
#include <gecode/driver/script.hpp>
|
|
|
|
namespace Gecode {
|
|
|
|
/**
|
|
* \defgroup TaskDriverScript Script classes
|
|
* \ingroup TaskDriver
|
|
*/
|
|
|
|
/**
|
|
* \brief Base-class for scripts
|
|
* \ingroup TaskDriverScript
|
|
*/
|
|
typedef Driver::ScriptBase<Driver::IgnoreStepOption<Space> >
|
|
Script;
|
|
|
|
/**
|
|
* \brief Base-class for scripts for finding solution of lowest integer cost
|
|
* \ingroup TaskDriverScript
|
|
*/
|
|
typedef Driver::ScriptBase<Driver::IgnoreStepOption<IntMinimizeSpace> >
|
|
IntMinimizeScript;
|
|
/**
|
|
* \brief Base-class for scripts for finding solution of highest integer cost
|
|
* \ingroup TaskDriverScript
|
|
*/
|
|
typedef Driver::ScriptBase<Driver::IgnoreStepOption<IntMaximizeSpace> >
|
|
IntMaximizeScript;
|
|
|
|
/**
|
|
* \brief Base-class for scripts for finding solution of lexically lowest integer costs
|
|
* \ingroup TaskDriverScript
|
|
*/
|
|
typedef Driver::ScriptBase<Driver::IgnoreStepOption<IntLexMinimizeSpace> >
|
|
IntLexMinimizeScript;
|
|
/**
|
|
* \brief Base-class for scripts for finding solution of lexically highest integer costs
|
|
* \ingroup TaskDriverScript
|
|
*/
|
|
typedef Driver::ScriptBase<Driver::IgnoreStepOption<IntLexMaximizeSpace> >
|
|
IntLexMaximizeScript;
|
|
|
|
#ifdef GECODE_HAS_FLOAT_VARS
|
|
|
|
/**
|
|
* \brief Base-class for scripts for finding solution of lowest float cost
|
|
* \ingroup TaskDriverScript
|
|
*/
|
|
typedef Driver::ScriptBase<Driver::ExtractStepOption<FloatMinimizeSpace> >
|
|
FloatMinimizeScript;
|
|
/**
|
|
* \brief Base-class for scripts for finding solution of highest float cost
|
|
* \ingroup TaskDriverScript
|
|
*/
|
|
typedef Driver::ScriptBase<Driver::ExtractStepOption<FloatMaximizeSpace> >
|
|
FloatMaximizeScript;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
// STATISTICS: driver-any
|