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 6719176975 Squashed 'software/gecode/' changes from 313e87646d..70a1cfa856
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
2021-07-11 16:26:15 +10:00

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