Hi Kish, No, the engine can only restart based on the number of failures. But, it will also restart when it has found a solution. So what you could do is to use an embarrassingly large number of failures (ULONG_MAX) and a constant cutoff generator (Search::Cutoff::constant(ULONG_MAX)).
Cheers Christian -- Christian Schulte, www.ict.kth.se/~cschulte/ > -----Original Message----- > From: Kish Shen [mailto:kiss...@cisco.com] > Sent: Friday, August 30, 2013 8:01 PM > To: cschu...@kth.se > Cc: users@gecode.org > Subject: Re: [gecode-users] Adding restart-based search to ECLiPSe's interface > to Gecode > > Hi Christian, > > Thanks for the code. This code looks to be more C++ like than what I have now, > where my GecodeSearch class (equivalent to EngineBase here) has several > private engine pointers for the different engine types, and the functions like > next() switch on the search methods to call the function of the correct engine > type. I will change my code to be more like what you are doing here. Thanks > again. > > My next question is now about doing the restart: are there any alternatives to > doing restart based on the number of failures? One alternative is to do restart > only with a new solution. I assume this is what the old RESTART engine did. As > the current gfd interface supports this engine, I would like to continue to > support it. As I said in my previous posting, I am not sure if the next solution is > done via restart in RBS, because it seem to use DFS or BAB as the "actual" search > engine, and these engines don't restart (as far as I can tell) with the next > solution. > > Thanks and cheers, > > Kish > > On 27/08/2013 09:51, Christian Schulte wrote: > > Hi Kish, > > > > Here is a solution built on top of Gecode. It defines a type > > Kish::EngineBase that can be passed around irrespective of which > > engine it actual is. The other stuff is just for illustration and how > > to recast Gecode's engines as engines of type Kish::EngineBase. > > > > Hope this helps. > > > > Best > > Christian > > > > > > namespace Kish { > > > > class EngineBase { > > public: > > EngineBase(void) {} > > virtual Gecode::Space* next(void) = 0; > > virtual Gecode::Search::Statistics statistics(void) const = 0; > > virtual bool stopped(void) const = 0; > > virtual ~EngineBase(void) {} > > }; > > > > class DFS : public EngineBase { > > protected: > > Gecode::DFS<Gecode::Space> e; > > public: > > DFS(Gecode::Space* s, const Gecode::Search::Options& o) > > : e(s,o) {} > > virtual Gecode::Space* next(void) { > > return e.next(); > > } > > virtual Gecode::Search::Statistics statistics(void) const { > > return e.statistics(); > > } > > virtual bool stopped(void) const { > > return e.stopped(); > > } > > virtual ~DFS(void) {} > > }; > > > > class BAB : public EngineBase { > > protected: > > Gecode::BAB<Gecode::Space> e; > > public: > > BAB(Gecode::Space* s, const Gecode::Search::Options& o) > > : e(s,o) {} > > virtual Gecode::Space* next(void) { > > return e.next(); > > } > > virtual Gecode::Search::Statistics statistics(void) const { > > return e.statistics(); > > } > > virtual bool stopped(void) const { > > return e.stopped(); > > } > > virtual ~BAB(void) {} > > }; > > > > template<template<class> class E> > > class RBS : public EngineBase { > > protected: > > Gecode::RBS<E,Gecode::Space> e; > > public: > > RBS(Gecode::Space* s, const Gecode::Search::Options& o) > > : e(s,o) {} > > virtual Gecode::Space* next(void) { > > return e.next(); > > } > > virtual Gecode::Search::Statistics statistics(void) const { > > return e.statistics(); > > } > > virtual bool stopped(void) const { > > return e.stopped(); > > } > > virtual ~RBS(void) {} > > }; > > > > enum WhichEngine { > > WE_DFS, WE_BAB, > > WE_RBS_DFS, WE_RBS_BAB > > }; > > > > EngineBase* engine(WhichEngine we, > > Gecode::Space* s, > > const Gecode::Search::Options& o) { > > switch (we) { > > case WE_DFS: return new DFS(s,o); > > case WE_BAB: return new BAB(s,o); > > case WE_RBS_DFS: return new RBS<Gecode::DFS>(s,o); > > case WE_RBS_BAB: return new RBS<Gecode::BAB>(s,o); > > } > > } > > } > > > > > > -- > > Christian Schulte, Professor of Computer Science, KTH, > > www.ict.kth.se/~cschulte/ > > > > > > -----Original Message----- > > From: users-boun...@gecode.org [mailto:users-boun...@gecode.org] On > > Behalf Of Christian Schulte > > Sent: Thursday, August 22, 2013 9:50 AM > > To: 'Kish Shen' > > Cc: users@gecode.org > > Subject: Re: [gecode-users] Adding restart-based search to ECLiPSe's > > interface to Gecode > > > > Hi Kish, > > > > My bad... There is really no common basetype for search engines, the > > type I mentioned is actually for the implementations and not the interfaces... > > > > I think you will have to wait until I have added a common basetype > > (there is a basetype, but it is not powerful enough), I might be able > > to do it until the end of the week. > > > > Sorry for the confusion! > > > > Cheers > > Christian > > > > -- > > Christian Schulte, Professor of Computer Science, KTH, > > www.ict.kth.se/~cschulte/ > > > > > > > > -----Original Message----- > > From: Kish Shen [mailto:kiss...@cisco.com] > > Sent: Thursday, August 22, 2013 9:45 AM > > To: cschu...@kth.se > > Cc: users@gecode.org > > Subject: Re: [gecode-users] Adding restart-based search to ECLiPSe's > > interface to Gecode > > > > Hi Christian, > > > > Thanks again! > > > > On 21/08/2013 19:17, Christian Schulte wrote: > >> Try to avoid the Gecode::Search::bab .... functions. Just create as > > follows: > >> Gecode::Search::Engine* e = new Gecode::BAB(...) Then it also will > >> work for RBS, and you do not have to create a second engine yourself, > >> this will the RBS class do for you. > >> > >> And do not forget to delete e eventually! > >> > > > > This is the part that I don't know how to do correct -- probably > > because of my lack of C++ knowledge, but as far as I can tell, > > Gecode::DFS etc are not of class Engine*, according to the doc: > > > > template<class T> > > class Gecode::DFS<T> > > > > for subclasses T of Space > > > > T is GecodeSpace in my case, I assume. I am not sure what class DFS > > is, but I can't see how it could be Engine*. > > > > Anway, I tried to do the assignment as you suggested: > > > > > > Search::Engine* segine; > > ... > > sengine = new DFS<GecodeSpace>(solver, o); and indeed I get the error > > > > cannot convert 'Gecode::DFS<GecodeSpace>*' to 'Gecode::Search::Engine*' > > > > (I first tried sengine = new DFS(solver, o) but got an error 'expected > > type-specifier') > > > > So I am not sure what to do -- do I need to change the type of > > sengine, and/or the way I assign an engine to sengine? > > > > Cheers, > > > > Kish > > > > > > > > > > > > _______________________________________________ > > Gecode users mailing list > > users@gecode.org > > https://www.gecode.org/mailman/listinfo/gecode-users > > _______________________________________________ Gecode users mailing list users@gecode.org https://www.gecode.org/mailman/listinfo/gecode-users