/* * Main authors: * Christian Schulte * * Copyright: * Christian Schulte, 2003 * * Last modified: * $Date: 2006-08-04 16:03:17 +0200 (Fri, 04 Aug 2006) $ by $Author: schulte $ * $Revision: 3511 $ * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * See the file "LICENSE" for information on usage and * redistribution of this file, and for a * DISCLAIMER OF ALL WARRANTIES. * */ namespace Gecode { namespace Search { /* * DFS engine * */ forceinline DfsEngine::DfsEngine(unsigned int c_d0, unsigned int a_d0, Stop* st, size_t sz) : EngineCtrl(st,sz), rcs(a_d0), cur(NULL), c_d(c_d0), d(0) {} forceinline void DfsEngine::init(Space* s) { cur = s; } forceinline void DfsEngine::reset(Space* s) { delete cur; rcs.reset(); cur = s; d = 0; EngineCtrl::reset(s); } forceinline size_t DfsEngine::stacksize(void) const { return rcs.stacksize(); } forceinline Space* DfsEngine::explore(void) { start(); while (true) { while (cur) { if (stop(stacksize())) return NULL; switch (cur->status(propagate)) { case SS_FAILED: fail++; delete cur; cur = NULL; EngineCtrl::current(NULL); break; case SS_SOLVED: { Space* s = cur; cur = NULL; EngineCtrl::current(NULL); return s; } case SS_BRANCH: { Space* c; if ((d == 0) || (d >= c_d)) { clone++; c = cur->clone(true,propagate); d = 1; } else { c = NULL; d++; } const BranchingDesc* desc = rcs.push(cur,c); EngineCtrl::push(c,desc); commit++; cur->commit(desc,0); break; } default: GECODE_NEVER; } } if (!rcs.next(*this)) return NULL; cur = rcs.recompute(d,*this); EngineCtrl::current(cur); } return NULL; } forceinline DfsEngine::~DfsEngine(void) { delete cur; rcs.reset(); } } /* * Control for DFS search engine * */ template forceinline DFS::DFS(T* s, unsigned int c_d, unsigned int a_d, Search::Stop* st) : Search::DFS(s,c_d,a_d,st,sizeof(T)) {} template forceinline T* DFS::next(void) { return static_cast(Search::DFS::next()); } /* * DFS convenience * */ template forceinline T* dfs(T* s, unsigned int c_d, unsigned int a_d, Search::Stop* st) { DFS d(s,c_d,a_d,st); return static_cast(d.next()); } } // STATISTICS: search-any