rbs.hh
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef __GECODE_SEARCH_META_RBS_HH__
00039 #define __GECODE_SEARCH_META_RBS_HH__
00040
00041 #include <gecode/search.hh>
00042
00043 namespace Gecode { namespace Search { namespace Meta {
00044
00045 class RBS;
00046
00048 class GECODE_SEARCH_EXPORT RestartStop : public Stop {
00049 template<template<class>class,class> friend class ::Gecode::RBS;
00050 friend class ::Gecode::Search::Meta::RBS;
00051 private:
00053 FailStop* e_stop;
00055 Stop* m_stop;
00057 bool e_stopped;
00059 Statistics m_stat;
00060 public:
00062 RestartStop(Stop* s);
00064 virtual bool stop(const Statistics& s, const Options& o);
00066 void limit(const Search::Statistics& s, unsigned long int l);
00068 void update(const Search::Statistics& s);
00070 Stop* enginestop(void) const;
00072 bool enginestopped(void) const;
00074 Statistics metastatistics(void) const;
00076 ~RestartStop(void);
00077 };
00078
00080 class GECODE_SEARCH_EXPORT RBS : public Engine {
00081 protected:
00083 Engine* e;
00085 Space* master;
00087 Space* last;
00089 Cutoff* co;
00091 RestartStop* stop;
00093 unsigned long int sslr;
00095 bool shared;
00097 bool complete;
00099 bool restart;
00100 public:
00102 RBS(Space* s, RestartStop* stop0, Engine* e0, const Options& o);
00104 virtual Space* next(void);
00106 virtual Search::Statistics statistics(void) const;
00108 virtual bool stopped(void) const;
00110 virtual ~RBS(void);
00111 };
00112
00113
00114
00115
00116
00117
00118 forceinline
00119 RestartStop::RestartStop(Stop* s)
00120 : e_stop(new FailStop(0)), m_stop(s), e_stopped(false) {}
00121
00122 forceinline void
00123 RestartStop::limit(const Search::Statistics& s, unsigned long int l) {
00124 m_stat += s;
00125 e_stopped = false;
00126 e_stop->limit(l);
00127 }
00128
00129 forceinline void
00130 RestartStop::update(const Search::Statistics& s) {
00131 m_stat += s;
00132 }
00133
00134 forceinline Stop*
00135 RestartStop::enginestop(void) const {
00136 return e_stop;
00137 }
00138
00139 forceinline bool
00140 RestartStop::enginestopped(void) const {
00141 return e_stopped;
00142 }
00143
00144 forceinline Statistics
00145 RestartStop::metastatistics(void) const {
00146 return m_stat;
00147 }
00148
00149 forceinline
00150 RestartStop::~RestartStop(void) {
00151 delete e_stop;
00152 delete m_stop;
00153 }
00154
00155
00156
00157 forceinline
00158 RBS::RBS(Space* s, RestartStop* stop0,
00159 Engine* e0, const Options& opt)
00160 : e(e0), master(s), last(NULL), co(opt.cutoff), stop(stop0),
00161 sslr(0),
00162 shared(opt.threads == 1), complete(true), restart(false) {
00163 stop->limit(Statistics(),(*co)());
00164 }
00165
00166 }}}
00167
00168 #endif
00169
00170