rbs.hpp
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
00039
00040 #include <gecode/search/support.hh>
00041 #include <gecode/search/meta/rbs.hh>
00042
00043 namespace Gecode {
00044
00045 template<template<class> class E, class T>
00046 forceinline
00047 RBS<E,T>::RBS(T* s, const Search::Options& m_opt) {
00048 if (m_opt.cutoff == NULL)
00049 throw Search::UninitializedCutoff("RBS::RBS");
00050 Search::Options e_opt(m_opt.expand());
00051 e_opt.clone = false;
00052 Search::Meta::RestartStop* rs = new Search::Meta::RestartStop(m_opt.stop);
00053 e_opt.stop = rs;
00054 Space* master;
00055 Space* slave;
00056 if (s->status(rs->m_stat) == SS_FAILED) {
00057 rs->m_stat.fail++;
00058 master = NULL;
00059 slave = NULL;
00060 } else {
00061 if (m_opt.clone)
00062 master = s->clone();
00063 else
00064 master = s;
00065 slave = master->clone();
00066 CRI cri(0,0,0,NULL,NoGoods::eng);
00067 slave->slave(cri);
00068 }
00069 E<T> engine(dynamic_cast<T*>(slave),e_opt);
00070 Search::EngineBase<T>* eb = &engine;
00071 Search::Engine* ee = eb->e;
00072 eb->e = NULL;
00073 e = new Search::Meta::RBS(master,rs,ee,m_opt);
00074 }
00075
00076
00077 template<template<class> class E, class T>
00078 forceinline T*
00079 rbs(T* s, const Search::Options& o) {
00080 RBS<E,T> r(s,o);
00081 return r.next();
00082 }
00083
00084 }
00085
00086