34#include <QtGui/QPainter>
36#include <QPrintDialog>
53 QWidget* parent,
const Options& opt)
55 ,
mutex(QMutex::Recursive)
66 QMutexLocker locker(&
mutex);
76 int rootIdx =
na->allocate(rootSpace);
77 assert(rootIdx == 0); (void) rootIdx;
80 root->setMarked(
true);
85 setAutoFillBackground(
true);
94 Qt::BlockingQueuedConnection);
96 this, SLOT(inspectSolution(
const Space*)));
100 Qt::BlockingQueuedConnection);
108 scaleBar =
new QSlider(Qt::Vertical,
this);
109 scaleBar->setObjectName(
"scaleBar");
113 connect(
scaleBar, SIGNAL(valueChanged(
int)),
123 qRegisterMetaType<Statistics>(
"Statistics");
170 comparators.append(QPair<Comparator*,bool>(c,
false));
183 QSize viewport_size = size();
184 QAbstractScrollArea* sa =
185 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
188 zoomx = viewport_size.width()/2;
190 zoomy = viewport_size.height()/2;
192 int xoff = (sa->horizontalScrollBar()->value()+zoomx)/
scale;
193 int yoff = (sa->verticalScrollBar()->value()+zoomy)/
scale;
198 scale = (
static_cast<double>(scale0)) / 100.0;
199 bb =
root->getBoundingBox();
206 sa->horizontalScrollBar()->setRange(0,w-viewport_size.width());
207 sa->verticalScrollBar()->setRange(0,h-viewport_size.height());
208 sa->horizontalScrollBar()->setPageStep(viewport_size.width());
209 sa->verticalScrollBar()->setPageStep(viewport_size.height());
216 sa->horizontalScrollBar()->setValue(xoff-zoomx);
217 sa->verticalScrollBar()->setValue(yoff-zoomy);
225 QMutexLocker locker(&
mutex);
237 QSize viewport_size = size();
238 QAbstractScrollArea* sa =
239 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
240 sa->horizontalScrollBar()->setRange(0,w-viewport_size.width());
241 sa->verticalScrollBar()->setRange(0,h-viewport_size.height());
242 sa->horizontalScrollBar()->setPageStep(viewport_size.width());
243 sa->verticalScrollBar()->setPageStep(viewport_size.height());
262 QSize viewport_size = size();
263 QAbstractScrollArea* sa =
264 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
265 sa->horizontalScrollBar()->setRange(0,w-viewport_size.width());
266 sa->verticalScrollBar()->setRange(0,h-viewport_size.height());
295 SearcherThread::updateCanvas(
void) {
312 t->root->layout(*t->na);
313 BoundingBox bb = t->root->getBoundingBox();
315 int w =
static_cast<int>((bb.right-bb.left+
Layout::extent)*t->scale);
317 t->root->getShape()->depth()
321 int scale0 =
static_cast<int>(t->scale*100);
323 QWidget* p = t->parentWidget();
326 static_cast<double>(p->width()) / (bb.right - bb.left +
329 static_cast<double>(p->height()) /
332 scale0 =
static_cast<int>(std::min(newXScale, newYScale)*100);
337 double scale = (
static_cast<double>(scale0)) / 100.0;
345 t->layoutMutex.unlock();
372 node->getNumberOfChildNodes(*t->na, t->curBest, t->stats,
374 if (kids == 0 || node->getStatus() ==
STOP) {
381 std::stack<SearchItem> stck;
384 std::max(
static_cast<long unsigned int>(t->stats.maxDepth),
385 static_cast<long unsigned int>(depth+stck.size()));
389 t->stopSearchFlag =
false;
390 while (!stck.empty() && !t->stopSearchFlag) {
391 if (t->refresh > 0 && nodeCount >= t->refresh) {
392 node->dirtyUp(*t->na);
396 if (t->refreshPause > 0)
397 msleep(t->refreshPause);
401 if (si.i == si.noOfChildren) {
410 if (t->moveDuringSearch)
427 std::max(
static_cast<long unsigned int>(t->stats.maxDepth),
428 static_cast<long unsigned int>(depth+stck.size()));
434 t->stopSearchFlag =
false;
437 t->setCurrentNode(sol,
true,
false);
439 t->setCurrentNode(node,
true,
false);
450 QMutexLocker locker(&
mutex);
456 QMutexLocker locker(&
mutex);
462 QMutexLocker locker(&
mutex);
471 QMutexLocker locker(&
mutex);
480 QMutexLocker locker(&
mutex);
490 QMutexLocker locker(&
mutex);
499 QMutexLocker locker(&
mutex);
514 int zoomCurrent =
static_cast<int>(
scale*100);
532 bb =
root->getBoundingBox();
533 QWidget* p = parentWidget();
536 static_cast<double>(p->width()) / (bb.
right - bb.
left +
539 static_cast<double>(p->height()) / (
root->getShape()->depth() *
542 int scale0 =
static_cast<int>(std::min(newXScale, newYScale)*100);
552 int zoomCurrent =
static_cast<int>(
scale*100);
553 int targetZoom = scale0;
565 QMutexLocker locker(&
mutex);
573 c = c->getParent(*
na);
578 QAbstractScrollArea* sa =
579 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
581 x -= sa->viewport()->width() / 2;
582 y -= sa->viewport()->height() / 2;
584 sourceX = sa->horizontalScrollBar()->value();
585 targetX = std::max(sa->horizontalScrollBar()->minimum(),
x);
586 targetX = std::min(sa->horizontalScrollBar()->maximum(),
588 sourceY = sa->verticalScrollBar()->value();
589 targetY = std::max(sa->verticalScrollBar()->minimum(),
y);
590 targetY = std::min(sa->verticalScrollBar()->maximum(),
593 sa->horizontalScrollBar()->setValue(
targetX);
594 sa->verticalScrollBar()->setValue(
targetY);
608 QAbstractScrollArea* sa =
609 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
610 double p =
static_cast<double>(i)/100.0;
613 sa->horizontalScrollBar()->setValue(
sourceX+
static_cast<int>(xdiff));
614 sa->verticalScrollBar()->setValue(
sourceY+
static_cast<int>(ydiff));
619 QMutexLocker locker(&
mutex);
626 int failedInspectorType = -1;
627 int failedInspector = -1;
628 bool needCentering =
false;
639 needCentering =
true;
643 std::max(
stats.maxDepth, depth);
651 failedInspectorType = 0;
664 failedInspectorType = -1;
689 "Something went wrong - probably an incorrect brancher");
699 switch (curSpace->
status()) {
712 if (inspectorNo==-1) {
715 failedInspectorType = 1;
718 failedInspectorType = -1;
722 failedInspectorType = 1;
723 failedInspector = inspectorNo;
725 failedInspectorType = -1;
732 switch (failedInspectorType) {
734 qFatal(
"Exception in move inspector %d: %s.\n Stopping.",
735 failedInspector, e.
what());
738 qFatal(
"Exception in double click inspector %d: %s.\n Stopping.",
739 failedInspector, e.
what());
742 qFatal(
"Exception: %s.\n Stopping.", e.
what());
760 QMutexLocker locker(&
mutex);
768 QMutexLocker locker(&
mutex);
776 TreeCanvas::inspectSolution(
const Space* s) {
777 int failedInspectorType = -1;
778 int failedInspector = -1;
785 failedInspectorType = 1;
788 failedInspectorType = -1;
792 }
catch (Exception& e) {
793 switch (failedInspectorType) {
795 qFatal(
"Exception in move inspector %d: %s.\n Stopping.",
796 failedInspector, e.what());
799 qFatal(
"Exception in solution inspector %d: %s.\n Stopping.",
800 failedInspector, e.what());
803 qFatal(
"Exception: %s.\n Stopping.", e.what());
817 QMutexLocker locker(&
mutex);
831 int rootIdx =
na->allocate(rootSpace);
832 assert(rootIdx == 0); (void) rootIdx;
834 root->setMarked(
true);
850 QMutexLocker locker(&
mutex);
854 QInputDialog::getText(
this,
"Add bookmark",
"Name:",
855 QLineEdit::Normal,
"",&ok);
860 text = QString(
"Node ")+QString().setNum(
bookmarks.size());
875 QMutexLocker locker(&
mutex);
889 QMutexLocker locker(&
mutex);
894 while (nextAlt >= 0) {
905 QMutexLocker locker(&
mutex);
908 setCursor(QCursor(Qt::CrossCursor));
913 QMutexLocker locker(&
mutex);
916 setCursor(QCursor(Qt::CrossCursor));
926 QMutexLocker locker(&
mutex);
939 QMutexLocker locker(&
mutex);
962 QMutexLocker locker(&
mutex);
976 QMutexLocker locker(&
mutex);
990 QMutexLocker locker(&
mutex);
997 QMutexLocker locker(&
mutex);
1015#if QT_VERSION >= 0x040400
1016 QString filename = QFileDialog::getSaveFileName(
this, tr(
"Export tree as pdf"),
"", tr(
"PDF (*.pdf)"));
1017 if (filename !=
"") {
1018 QPrinter printer(QPrinter::ScreenResolution);
1019 QMutexLocker locker(&
mutex);
1022 printer.setFullPage(
true);
1026 printer.setOutputFileName(filename);
1027 QPainter painter(&printer);
1029 painter.setRenderHint(QPainter::Antialiasing);
1031 QRect pageRect = printer.pageRect();
1033 static_cast<double>(pageRect.width()) / (bb.
right - bb.
left +
1036 static_cast<double>(pageRect.height()) /
1039 double printScale = std::min(newXScale, newYScale);
1040 painter.scale(printScale,printScale);
1045 QRect clip(0,0,0,0);
1058#if QT_VERSION >= 0x040400
1059 exportNodePDF(
root);
1065#if QT_VERSION >= 0x040400
1073 if (QPrintDialog(&printer,
this).exec() == QDialog::Accepted) {
1074 QMutexLocker locker(&
mutex);
1077 QRect pageRect = printer.pageRect();
1079 static_cast<double>(pageRect.width()) / (bb.
right - bb.
left +
1082 static_cast<double>(pageRect.height()) /
1085 double printScale = std::min(newXScale, newYScale)*100;
1088 if (printScale > 400.0)
1090 printScale = printScale / 100.0;
1092 QPainter painter(&printer);
1093 painter.setRenderHint(QPainter::Antialiasing);
1094 painter.scale(printScale,printScale);
1095 painter.translate(
xtrans, 0);
1096 QRect clip(0,0,0,0);
1106 switch (
event->type()) {
1107 case QEvent::ToolTip:
1109 QHelpEvent* he =
static_cast<QHelpEvent*
>(
event);
1114 case QEvent::MouseButtonDblClick:
1115 case QEvent::MouseButtonPress:
1116 case QEvent::MouseButtonRelease:
1117 case QEvent::MouseMove:
1119 QMouseEvent* me =
static_cast<QMouseEvent*
>(
event);
1124 case QEvent::ContextMenu:
1126 QContextMenuEvent* ce =
static_cast<QContextMenuEvent*
>(
event);
1134 QAbstractScrollArea* sa =
1135 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
1136 int xoff = sa->horizontalScrollBar()->value()/
scale;
1137 int yoff = sa->verticalScrollBar()->value()/
scale;
1142 if (w < sa->viewport()->width())
1143 xoff -= (sa->viewport()->width()-w)/2;
1148 static_cast<int>((
y-30)/
scale+yoff));
1154 if (
mutex.tryLock()) {
1155 if (
event->type() == QEvent::ToolTip) {
1158 QHelpEvent* he =
static_cast<QHelpEvent*
>(
event);
1159 QToolTip::showText(he->globalPos(),
1163 QToolTip::hideText();
1168 return QWidget::event(
event);
1180 QPainter painter(
this);
1181 painter.setRenderHint(QPainter::Antialiasing);
1183 QAbstractScrollArea* sa =
1184 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
1185 int xoff = sa->horizontalScrollBar()->value()/
scale;
1186 int yoff = sa->verticalScrollBar()->value()/
scale;
1191 if (w < sa->viewport()->width())
1192 xoff -= (sa->viewport()->width()-w)/2;
1194 QRect origClip =
event->rect();
1195 painter.translate(0, 30);
1197 painter.translate(
xtrans-xoff, -yoff);
1198 QRect clip(
static_cast<int>(origClip.x()/
scale-
xtrans+xoff),
1199 static_cast<int>(origClip.y()/
scale+yoff),
1200 static_cast<int>(origClip.width()/
scale),
1201 static_cast<int>(origClip.height()/
scale));
1218 if (
mutex.tryLock()) {
1219 if(
event->button() == Qt::LeftButton) {
1235 if (
mutex.tryLock()) {
1251 QAbstractScrollArea* sa =
1252 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
1254 int w = sa->horizontalScrollBar()->maximum()+e->oldSize().width();
1255 int h = sa->verticalScrollBar()->maximum()+e->oldSize().height();
1257 sa->horizontalScrollBar()->setRange(0,w-e->size().width());
1258 sa->verticalScrollBar()->setRange(0,h-e->size().height());
1259 sa->horizontalScrollBar()->setPageStep(e->size().width());
1260 sa->verticalScrollBar()->setPageStep(e->size().height());
1265 if (
event->modifiers() & Qt::ShiftModifier) {
1298 Space* curSpace = NULL;
1301 if (curSpace == NULL)
1306 qFatal(
"Exception in move inspector %d: %s.\n Stopping.",
1319 setCursor(QCursor(Qt::ArrowCursor));
1329 if (
mutex.tryLock()) {
1330 if (
event->button() == Qt::LeftButton) {
1336 Space* curSpace = NULL;
1337 Space* compareSpace = NULL;
1340 if (curSpace == NULL) {
1348 switch (compareSpace->
status()) {
1362 comparators[i].first->compare(*curSpace,*compareSpace);
1364 qFatal(
"Exception in comparator %d: %s.\n Stopping.",
1374 setCursor(QCursor(Qt::ArrowCursor));
int size(void) const
Return size of array (number of elements)
Exception: Base-class for exceptions
virtual const char * what(void) const
Return information.
Static reference to the currently best space.
int right
Right coordinate.
Abstract base class for comparators.
A cursor that frees all memory.
A cursor that draws a tree on a QWidget.
Abstract base class for inspectors.
A cursor that finds the next solution.
Cursor & getCursor(void)
Return the cursor.
NodeAllocatorBase< VisualNode > NodeAllocator
unsigned int getNumberOfChildren(void) const
Return the number of children.
int getParent(void) const
Return the parent.
int getChild(int n) const
Return index of child no n.
bool isRoot(void) const
Check if this node is the root of a tree.
Run a cursor over a tree, processing nodes in pre-order.
void run(void)
Execute visitor.
A stack item for depth first search.
int noOfChildren
The number of children.
SearchItem(VisualNode *n0, int noOfChildren0)
Constructor.
int i
The currently explored child.
void update(int w, int h, int scale0)
void solution(const Space *)
void searchFinished(void)
void search(VisualNode *n, bool all, TreeCanvas *ti)
void moveToNode(VisualNode *n, bool)
int depth(void) const
Return depth of the shape.
bool hasCopy(void)
Return whether the node has a copy.
const Choice * getChoice(void)
Return choice of this node.
const Space * getWorkingSpace(void) const
Return working space (if present).
int getNumberOfChildNodes(NodeAllocator &na, BestNode *curBest, Statistics &stats, int c_d, int a_d)
Compute and return the number of children.
int getAlternative(const NodeAllocator &na) const
Return alternative number of this node.
bool isOpen(void)
Return whether this node still has open children.
NodeStatus getStatus(void) const
Return current status of the node.
Space * getSpace(NodeAllocator &na, BestNode *curBest, int c_d, int a_d)
Return working space. Receiver must delete the space.
void purge(const NodeAllocator &na)
Clear working space and copy (if present and this is not the root).
Statistics about the search tree
A canvas that displays the search tree.
double scale
Current scale factor.
void navNextSol(bool back=false)
Move selection to next solution (in DFS order)
void update(void)
Update display.
void zoomToFit(void)
Zoom the canvas so that the whole tree fits.
void resizeToOuter(void)
Resize to the outer widget size if auto zoom is enabled.
void activateComparator(int i, bool active)
Set active comparator.
void exportPDF(void)
Export pdf of the current subtree.
int targetX
Target x coordinate after smooth scrolling.
void wheelEvent(QWheelEvent *event)
Handle mouse wheel events.
Statistics stats
Statistics about the search tree.
void resizeEvent(QResizeEvent *event)
Handle resize event.
int targetScale
Target scale after layout.
QVector< VisualNode * > bookmarks
The bookmarks map.
SearcherThread searcher
Search engine thread.
VisualNode * currentNode
The currently selected node.
bool finish(void)
Stop search and wait for it to finish.
void exportWholeTreePDF(void)
Export pdf of the whole tree.
int xtrans
Offset on the x axis so that the tree is centered.
void activateDoubleClickInspector(int i, bool active)
Set active inspector.
void navUp(void)
Move selection to the parent of the selected node.
bool autoHideFailed
Whether to hide failed subtrees automatically.
void labelBranches(void)
Label all branches in subtree under current node.
VisualNode * eventNode(QEvent *event)
Return the node corresponding to the event position.
void contextMenuEvent(QContextMenuEvent *event)
Handle context menu event.
void startCompareNodesBeforeFP(void)
Wait for click on node to compare with current node before fixpoint.
void startCompareNodes(void)
Wait for click on node to compare with current node.
void addComparator(Comparator *c)
Add comparator c.
QMutex mutex
Mutex for synchronizing acccess to the tree.
void inspectBeforeFP(void)
Calls inspectCurrentNode(false)
void hideFailed(void)
Hide failed subtrees of selected node.
bool getAutoZoom(void)
Return preference whether to automatically zoom to fit.
void setRefreshPause(int i)
Set refresh pause in msec.
void bookmarkNode(void)
Bookmark current node.
void print(void)
Print the tree.
void searchAll(void)
Explore complete subtree of selected node.
QTimeLine scrollTimeLine
Timer for smooth scrolling.
int layoutDoneTimerId
Timer id for delaying the update.
void addSolutionInspector(Inspector *i)
Add inspector i.
int targetH
Target height after layout.
bool smoothScrollAndZoom
Whether to use smooth scrolling and zooming.
QTimeLine zoomTimeLine
Timer for smooth zooming.
void setPath(void)
Set the current node to be the head of the path.
void navRoot(void)
Move selection to the root node.
void statusChanged(VisualNode *, const Statistics &, bool)
Status bar update.
TreeCanvas(Space *rootSpace, bool bab, QWidget *parent, const Options &opt)
Constructor.
~TreeCanvas(void)
Destructor.
bool event(QEvent *event)
General event handler, used for displaying tool tips.
void setMoveDuringSearch(bool b)
Set preference whether to move cursor during search.
void searchOne(void)
Find next solution below selected node.
void scroll(void)
React to scroll events.
void navDown(void)
Move selection to the first child of the selected node.
QVector< QPair< Comparator *, bool > > comparators
The registered comparators, and whether they are active.
bool compareNodes
Whether node comparison action is running.
void scaleTree(int scale0, int zoomx=-1, int zoomy=-1)
Set scale factor to scale0.
void activateSolutionInspector(int i, bool active)
Set active inspector.
int c_d
The recomputation distance.
void mousePressEvent(QMouseEvent *event)
Handle mouse press event.
void navLeft(void)
Move selection to the left sibling of the selected node.
QSlider * scaleBar
The scale bar.
QMutex layoutMutex
Mutex for synchronizing layout and drawing.
int targetY
Target y coordinate after smooth scrolling.
QVector< QPair< Inspector *, bool > > doubleClickInspectors
The registered click inspectors, and whether they are active.
void autoZoomChanged(bool)
The auto-zoom state was changed.
void setRefresh(int i)
Set refresh rate.
Node::NodeAllocator * na
Allocator for nodes.
BestNode * curBest
The currently best solution (for branch-and-bound)
void paintEvent(QPaintEvent *event)
Paint the tree.
void unstopAll(void)
Do not stop at any stop node.
bool moveDuringSearch
Whether to move cursor during search.
bool getSmoothScrollAndZoom(void)
Return preference whether to use smooth scrolling and zooming.
void mouseDoubleClickEvent(QMouseEvent *event)
Handle mouse double click event.
int a_d
The adaptive recomputation distance.
void unhideAll(void)
Unhide all nodes below selected node.
void searchFinished(void)
Signals that Gist is finished.
int sourceX
Source x coordinate after smooth scrolling.
void scaleChanged(int)
The scale factor has changed.
bool getAutoHideFailed(void)
Return preference whether to automatically hide failed subtrees.
void solution(const Space *)
Signals that a solution has been found.
int targetW
Target width after layout.
void setRecompDistances(int c_d, int a_d)
Set recomputation distances.
void addMoveInspector(Inspector *i)
Add inspector i.
bool autoZoom
Whether to zoom automatically.
void emitStatusChanged(void)
Re-emit status change information for current node.
void setAutoZoom(bool b)
Set preference whether to automatically zoom to fit.
void centerCurrentNode(void)
Center the view on the currently selected node.
void setSmoothScrollAndZoom(bool b)
Set preference whether to use smooth scrolling and zooming.
bool finishedFlag
Flag signalling that Gist is ready to be closed.
void removedBookmark(int idx)
Signals that a bookmark has been removed.
VisualNode * pathHead
The head of the currently selected path.
void activateMoveInspector(int i, bool active)
Set active inspector.
void setCurrentNode(VisualNode *n, bool finished=true, bool update=true)
Set the selected node to n.
void contextMenu(QContextMenuEvent *)
Context menu triggered.
bool stopSearchFlag
Flag signalling the search to stop.
void setShowCopies(bool b)
Set preference whether to show copies in the tree.
void labelPath(void)
Label all branches on path to root node.
void layoutDone(int w, int h, int scale0)
Layout done.
virtual void timerEvent(QTimerEvent *e)
Timer invoked for smooth zooming and scrolling.
bool getMoveDuringSearch(void)
Return preference whether to move cursor during search.
bool compareNodesBeforeFP
Whether node comparison action computes fixpoint.
void toggleStop(void)
Do not stop at selected stop node.
void toggleHidden(void)
Toggle hidden state of selected node.
void navRight(void)
Move selection to the right sibling of the selected node.
void navPrevSol(void)
Move selection to previous solution (in DFS order)
bool showCopies
Whether to show copies in the tree.
void inspectPath(void)
Call the double click inspector for all nodes on the path from root to head of the path.
bool getShowCopies(void)
Return preference whether to show copies in the tree.
VisualNode * root
The root node of the tree.
void stopSearch(void)
Stop current search.
void inspectCurrentNode(bool fix=true, int inspectorNo=-1)
Call the double click inspector for the currently selected node.
int sourceY
Target y coordinate after smooth scrolling.
void setAutoHideFailed(bool b)
Set preference whether to automatically hide failed subtrees.
void addDoubleClickInspector(Inspector *i)
Add inspector i.
int refreshPause
Time (in msec) to pause after each refresh.
QVector< QPair< Inspector *, bool > > moveInspectors
The registered move inspectors, and whether they are active.
QVector< QPair< Inspector *, bool > > solutionInspectors
The registered solution inspectors, and whether they are active.
void addedBookmark(const QString &id)
Signals that a bookmark has been added.
Node class that supports visual layout
bool isHidden(void)
Return if node is hidden.
void dirtyUp(const NodeAllocator &na)
Mark all nodes up the path to the parent as dirty.
std::string toolTip(NodeAllocator &na, BestNode *curBest, int c_d, int a_d)
Return string that is used as a tool tip.
void hideFailed(const NodeAllocator &na, bool onlyDirty=false)
Hide all failed subtrees of this node.
BoundingBox getBoundingBox(void)
Return the bounding box.
void setMarked(bool m)
Set mark of this node.
Shape * getShape(void)
Return the shape of this node.
int bab(Space *root, const Gist::Options &opt=Gist::Options::def)
Create a new stand-alone Gist for branch-and-bound search of root.
void commit(const Choice &c, unsigned int a, CommitStatistics &stat=unused_commit)
Commit choice c for alternative a.
SpaceStatus status(StatusStatistics &stat=unused_status)
Query space status.
Space * clone(CloneStatistics &stat=unused_clone) const
Clone space.
@ SS_BRANCH
Space must be branched (at least one brancher left)
@ SS_SOLVED
Space is solved (no brancher left)
@ SS_FAILED
Space is failed
const int maxScale
Maximum scale factor.
const int defScale
Default scale factor.
const int minScale
Minimum scale factor.
const int maxAutoZoomScale
Maximum scale factor for automatic zoom.
The Gecode Interactive Search Tool.
@ UNDETERMINED
Node that has not been explored yet.
@ UNSTOP
Node representing ignored stop point.
@ FAILED
Node representing failure.
@ STOP
Node representing stop point.
@ SOLVED
Node representing a solution.
@ BRANCH
Node representing a branch.
Space * snapshot(Space *s, const Options &o)
Clone space s dependening on options o.
Gecode toplevel namespace
Post propagator for SetVar SetOpType SetVar y
T * dfs(T *s, const Search::Options &o=Search::Options::def)
Invoke depth-first search engine for subclass T of space s with options o.
Post propagator for SetVar x
#define GECODE_NEVER
Assert that this command is never executed.