this repo has no description
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, 2006 8 * 9 * This file is part of Gecode, the generic constraint 10 * development environment: 11 * http://www.gecode.org 12 * 13 * Permission is hereby granted, free of charge, to any person obtaining 14 * a copy of this software and associated documentation files (the 15 * "Software"), to deal in the Software without restriction, including 16 * without limitation the rights to use, copy, modify, merge, publish, 17 * distribute, sublicense, and/or sell copies of the Software, and to 18 * permit persons to whom the Software is furnished to do so, subject to 19 * the following conditions: 20 * 21 * The above copyright notice and this permission notice shall be 22 * included in all copies or substantial portions of the Software. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 28 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 29 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 30 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 31 * 32 */ 33 34#ifndef GECODE_GIST_NODECURSOR_HH 35#define GECODE_GIST_NODECURSOR_HH 36 37#include <gecode/gist/visualnode.hh> 38 39namespace Gecode { namespace Gist { 40 41 /// \brief A cursor that can be run over a tree 42 template<class Node> 43 class NodeCursor { 44 private: 45 /// The node where the iteration starts 46 Node* _startNode; 47 /// The current node 48 Node* _node; 49 /// The current alternative 50 unsigned int _alternative; 51 protected: 52 /// The node allocator 53 const typename Node::NodeAllocator& na; 54 /// Set current node to \a n 55 void node(Node* n); 56 /// Return start node 57 Node* startNode(void); 58 public: 59 /// Construct cursor, initially set to \a theNode 60 NodeCursor(Node* theNode, const typename Node::NodeAllocator& na); 61 /// Return current node 62 Node* node(void); 63 /// Return current alternative 64 unsigned int alternative(void); 65 /// Set current alternative 66 void alternative(unsigned int a); 67 68 /// \name Cursor interface 69 //@{ 70 /// Test if the cursor may move to the parent node 71 bool mayMoveUpwards(void); 72 /// Move cursor to the parent node 73 void moveUpwards(void); 74 /// Test if cursor may move to the first child node 75 bool mayMoveDownwards(void); 76 /// Move cursor to the first child node 77 void moveDownwards(void); 78 /// Test if cursor may move to the first sibling 79 bool mayMoveSidewards(void); 80 /// Move cursor to the first sibling 81 void moveSidewards(void); 82 //@} 83 }; 84 85 /// \brief A cursor that marks failed subtrees as hidden 86 class HideFailedCursor : public NodeCursor<VisualNode> { 87 private: 88 bool onlyDirty; 89 public: 90 /// Constructor 91 HideFailedCursor(VisualNode* theNode, 92 const VisualNode::NodeAllocator& na, 93 bool onlyDirtyNodes); 94 /// \name Cursor interface 95 //@{ 96 /// Test if the cursor may move to the first child node 97 bool mayMoveDownwards(void); 98 /// Process node 99 void processCurrentNode(void); 100 //@} 101 }; 102 103 /// \brief A cursor that marks all nodes in the tree as not hidden 104 class UnhideAllCursor : public NodeCursor<VisualNode> { 105 public: 106 /// Constructor 107 UnhideAllCursor(VisualNode* theNode, 108 const VisualNode::NodeAllocator& na); 109 /// \name Cursor interface 110 //@{ 111 /// Process node 112 void processCurrentNode(void); 113 //@} 114 }; 115 116 /// \brief A cursor that marks all nodes in the tree as not stopping 117 class UnstopAllCursor : public NodeCursor<VisualNode> { 118 public: 119 /// Constructor 120 UnstopAllCursor(VisualNode* theNode, 121 const VisualNode::NodeAllocator& na); 122 /// \name Cursor interface 123 //@{ 124 /// Process node 125 void processCurrentNode(void); 126 //@} 127 }; 128 129 /// \brief A cursor that finds the next solution 130 class NextSolCursor : public NodeCursor<VisualNode> { 131 private: 132 /// Whether to search backwards 133 bool back; 134 /// Whether the current node is not a solution 135 bool notOnSol(void); 136 public: 137 /// Constructor 138 NextSolCursor(VisualNode* theNode, bool backwards, 139 const VisualNode::NodeAllocator& na); 140 /// \name Cursor interface 141 //@{ 142 /// Do nothing 143 void processCurrentNode(void); 144 /// Test if the cursor may move to the parent node 145 bool mayMoveUpwards(void); 146 /// Test if cursor may move to the first child node 147 bool mayMoveDownwards(void); 148 /// Move cursor to the first child node 149 void moveDownwards(void); 150 /// Test if cursor may move to the first sibling 151 bool mayMoveSidewards(void); 152 /// Move cursor to the first sibling 153 void moveSidewards(void); 154 //@} 155 }; 156 157 /// \brief A cursor that collects statistics 158 class StatCursor : public NodeCursor<VisualNode> { 159 private: 160 /// Current depth 161 int curDepth; 162 public: 163 /// Depth of the search tree 164 int depth; 165 /// Number of failed nodes 166 int failed; 167 /// Number of solved nodes 168 int solved; 169 /// Number of choice nodes 170 int choice; 171 /// Number of open nodes 172 int open; 173 174 /// Constructor 175 StatCursor(VisualNode* theNode, 176 const VisualNode::NodeAllocator& na); 177 178 /// \name Cursor interface 179 //@{ 180 /// Collect statistics 181 void processCurrentNode(void); 182 /// Move cursor to the first child node 183 void moveDownwards(void); 184 /// Move cursor to the parent node 185 void moveUpwards(void); 186 //@} 187 188 }; 189 190 /// \brief A cursor that labels branches 191 class BranchLabelCursor : public NodeCursor<VisualNode> { 192 private: 193 /// The node allocator 194 VisualNode::NodeAllocator& _na; 195 /// Current best solution 196 BestNode* _curBest; 197 /// Recomputation distance 198 int _c_d; 199 /// Adaptive rcomputation distance 200 int _a_d; 201 /// Whether to clear labels 202 bool _clear; 203 public: 204 /// Constructor 205 BranchLabelCursor(VisualNode* theNode, BestNode* curBest, 206 int c_d, int a_d, bool clear, 207 VisualNode::NodeAllocator& na); 208 /// \name Cursor interface 209 //@{ 210 void processCurrentNode(void); 211 //@} 212 }; 213 214 /// \brief A cursor that frees all memory 215 class DisposeCursor : public NodeCursor<VisualNode> { 216 public: 217 /// Constructor 218 DisposeCursor(VisualNode* theNode, 219 const VisualNode::NodeAllocator& na); 220 221 /// \name Cursor interface 222 //@{ 223 /// Dispose node 224 void processCurrentNode(void); 225 //@} 226 227 }; 228 229}} 230 231#include <gecode/gist/nodecursor.hpp> 232 233#endif 234 235// STATISTICS: gist-any