1
0
This repository has been archived on 2025-03-06. You can view files and clone it, but cannot push or open issues or pull requests.
Jip J. Dekker 2572df0663 Squashed 'software/gecode_base/' content from commit bbefcea214
git-subtree-dir: software/gecode_base
git-subtree-split: bbefcea214fec798a0f5acc442581984555acd21
2021-07-11 17:26:05 +10:00

236 lines
6.7 KiB
C++

/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
/*
* Main authors:
* Guido Tack <tack@gecode.org>
*
* Copyright:
* Guido Tack, 2006
*
* This file is part of Gecode, the generic constraint
* development environment:
* http://www.gecode.org
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
#ifndef GECODE_GIST_NODECURSOR_HH
#define GECODE_GIST_NODECURSOR_HH
#include <gecode/gist/visualnode.hh>
namespace Gecode { namespace Gist {
/// \brief A cursor that can be run over a tree
template<class Node>
class NodeCursor {
private:
/// The node where the iteration starts
Node* _startNode;
/// The current node
Node* _node;
/// The current alternative
unsigned int _alternative;
protected:
/// The node allocator
const typename Node::NodeAllocator& na;
/// Set current node to \a n
void node(Node* n);
/// Return start node
Node* startNode(void);
public:
/// Construct cursor, initially set to \a theNode
NodeCursor(Node* theNode, const typename Node::NodeAllocator& na);
/// Return current node
Node* node(void);
/// Return current alternative
unsigned int alternative(void);
/// Set current alternative
void alternative(unsigned int a);
/// \name Cursor interface
//@{
/// Test if the cursor may move to the parent node
bool mayMoveUpwards(void);
/// Move cursor to the parent node
void moveUpwards(void);
/// Test if cursor may move to the first child node
bool mayMoveDownwards(void);
/// Move cursor to the first child node
void moveDownwards(void);
/// Test if cursor may move to the first sibling
bool mayMoveSidewards(void);
/// Move cursor to the first sibling
void moveSidewards(void);
//@}
};
/// \brief A cursor that marks failed subtrees as hidden
class HideFailedCursor : public NodeCursor<VisualNode> {
private:
bool onlyDirty;
public:
/// Constructor
HideFailedCursor(VisualNode* theNode,
const VisualNode::NodeAllocator& na,
bool onlyDirtyNodes);
/// \name Cursor interface
//@{
/// Test if the cursor may move to the first child node
bool mayMoveDownwards(void);
/// Process node
void processCurrentNode(void);
//@}
};
/// \brief A cursor that marks all nodes in the tree as not hidden
class UnhideAllCursor : public NodeCursor<VisualNode> {
public:
/// Constructor
UnhideAllCursor(VisualNode* theNode,
const VisualNode::NodeAllocator& na);
/// \name Cursor interface
//@{
/// Process node
void processCurrentNode(void);
//@}
};
/// \brief A cursor that marks all nodes in the tree as not stopping
class UnstopAllCursor : public NodeCursor<VisualNode> {
public:
/// Constructor
UnstopAllCursor(VisualNode* theNode,
const VisualNode::NodeAllocator& na);
/// \name Cursor interface
//@{
/// Process node
void processCurrentNode(void);
//@}
};
/// \brief A cursor that finds the next solution
class NextSolCursor : public NodeCursor<VisualNode> {
private:
/// Whether to search backwards
bool back;
/// Whether the current node is not a solution
bool notOnSol(void);
public:
/// Constructor
NextSolCursor(VisualNode* theNode, bool backwards,
const VisualNode::NodeAllocator& na);
/// \name Cursor interface
//@{
/// Do nothing
void processCurrentNode(void);
/// Test if the cursor may move to the parent node
bool mayMoveUpwards(void);
/// Test if cursor may move to the first child node
bool mayMoveDownwards(void);
/// Move cursor to the first child node
void moveDownwards(void);
/// Test if cursor may move to the first sibling
bool mayMoveSidewards(void);
/// Move cursor to the first sibling
void moveSidewards(void);
//@}
};
/// \brief A cursor that collects statistics
class StatCursor : public NodeCursor<VisualNode> {
private:
/// Current depth
int curDepth;
public:
/// Depth of the search tree
int depth;
/// Number of failed nodes
int failed;
/// Number of solved nodes
int solved;
/// Number of choice nodes
int choice;
/// Number of open nodes
int open;
/// Constructor
StatCursor(VisualNode* theNode,
const VisualNode::NodeAllocator& na);
/// \name Cursor interface
//@{
/// Collect statistics
void processCurrentNode(void);
/// Move cursor to the first child node
void moveDownwards(void);
/// Move cursor to the parent node
void moveUpwards(void);
//@}
};
/// \brief A cursor that labels branches
class BranchLabelCursor : public NodeCursor<VisualNode> {
private:
/// The node allocator
VisualNode::NodeAllocator& _na;
/// Current best solution
BestNode* _curBest;
/// Recomputation distance
int _c_d;
/// Adaptive rcomputation distance
int _a_d;
/// Whether to clear labels
bool _clear;
public:
/// Constructor
BranchLabelCursor(VisualNode* theNode, BestNode* curBest,
int c_d, int a_d, bool clear,
VisualNode::NodeAllocator& na);
/// \name Cursor interface
//@{
void processCurrentNode(void);
//@}
};
/// \brief A cursor that frees all memory
class DisposeCursor : public NodeCursor<VisualNode> {
public:
/// Constructor
DisposeCursor(VisualNode* theNode,
const VisualNode::NodeAllocator& na);
/// \name Cursor interface
//@{
/// Dispose node
void processCurrentNode(void);
//@}
};
}}
#include <gecode/gist/nodecursor.hpp>
#endif
// STATISTICS: gist-any