Generated on Sat May 25 2013 18:00:40 for Gecode by doxygen 1.8.3.1
rbs.hpp
Go to the documentation of this file.
1 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2 /*
3  * Main authors:
4  * Guido Tack <tack@gecode.org>
5  *
6  * Copyright:
7  * Guido Tack, 2012
8  *
9  * Last modified:
10  * $Date: 2013-03-08 11:11:37 +0100 (Fri, 08 Mar 2013) $ by $Author: schulte $
11  * $Revision: 13482 $
12  *
13  * This file is part of Gecode, the generic constraint
14  * development environment:
15  * http://www.gecode.org
16  *
17  * Permission is hereby granted, free of charge, to any person obtaining
18  * a copy of this software and associated documentation files (the
19  * "Software"), to deal in the Software without restriction, including
20  * without limitation the rights to use, copy, modify, merge, publish,
21  * distribute, sublicense, and/or sell copies of the Software, and to
22  * permit persons to whom the Software is furnished to do so, subject to
23  * the following conditions:
24  *
25  * The above copyright notice and this permission notice shall be
26  * included in all copies or substantial portions of the Software.
27  *
28  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
29  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
30  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
31  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
32  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
33  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
34  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35  *
36  */
37 
38 #include <gecode/search/support.hh>
40 
41 namespace Gecode {
42 
43  namespace Search {
44  GECODE_SEARCH_EXPORT Engine* rbs(Space* s, size_t sz,
45  MetaStop* stop,
46  Engine* e,
47  const Options& o);
48  }
49 
50  template<template<class> class E, class T>
52  RBS<E,T>::RBS(T* s, const Search::Options& m_opt) {
53  if (m_opt.cutoff == NULL)
54  throw Search::UninitializedCutoff("RBS::RBS");
55  Search::Options e_opt;
56  e_opt.clone = true;
57  e_opt.threads = m_opt.threads;
58  e_opt.c_d = m_opt.c_d;
59  e_opt.a_d = m_opt.a_d;
60  Search::MetaStop* ms = new Search::MetaStop(m_opt.stop);
61  e_opt.stop = ms;
62  Space* master;
63  if (m_opt.clone) {
64  if (s->status(ms->m_stat) == SS_FAILED) {
65  ms->m_stat.fail++;
66  master = new Search::FailedSpace();
67  } else {
68  master = s->clone();
69  }
70  } else {
71  master = s;
72  }
73  E<T> engine(dynamic_cast<T*>(master),e_opt);
74  EngineBase* eb = &engine;
75  Search::Engine* ee = eb->e;
76  eb->e = NULL;
77  e = Search::rbs(master,sizeof(T),ms,ee,m_opt);
78  }
79 
80  template<template<class> class E, class T>
81  forceinline T*
83  return dynamic_cast<T*>(e->next());
84  }
85 
86  template<template<class> class E, class T>
88  RBS<E,T>::statistics(void) const {
89  return e->statistics();
90  }
91 
92  template<template<class> class E, class T>
93  forceinline bool
94  RBS<E,T>::stopped(void) const {
95  return e->stopped();
96  }
97 
98 
99  template<template<class> class E, class T>
100  forceinline T*
101  rbs(T* s, const Search::Options& o) {
102  RBS<E,T> r(s,o);
103  return r.next();
104  }
105 
106 }
107 
108 // STATISTICS: search-other