34 #include <QtGui/QPainter> 36 #include <QPrintDialog> 50 namespace Gecode {
namespace Gist {
55 , mutex(QMutex::Recursive)
56 , layoutMutex(QMutex::Recursive)
58 , compareNodes(false), compareNodesBeforeFP(false)
59 , autoHideFailed(true), autoZoom(false)
60 , refresh(500), refreshPause(0), smoothScrollAndZoom(false)
61 , moveDuringSearch(false)
63 , scrollTimeLine(1000), targetX(0), sourceX(0), targetY(0), sourceY(0)
64 , targetW(0), targetH(0), targetScale(0)
65 , layoutDoneTimerId(0) {
66 QMutexLocker locker(&
mutex);
76 int rootIdx =
na->allocate(rootSpace);
77 assert(rootIdx == 0); (void) rootIdx;
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;
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) {
296 t->layoutMutex.lock();
300 if (
t->autoHideFailed) {
301 t->root->hideFailed(*
t->na,
true);
305 t->currentNode->setMarked(
false);
307 t->currentNode->setMarked(
true);
312 t->root->layout(*
t->na);
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();
360 : n(n0), i(-1), noOfChildren(noOfChildren0) {}
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);
410 if (
t->moveDuringSearch)
411 emit moveToNode(n,
false);
427 std::max(static_cast<long unsigned int>(
t->stats.maxDepth),
428 static_cast<long unsigned int>(depth+stck.size()));
433 node->dirtyUp(*
t->na);
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);
533 QWidget*
p = parentWidget();
536 static_cast<double>(p->width()) / (bb.
right - bb.
left +
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);
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();
588 sourceY = sa->verticalScrollBar()->value();
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;
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;
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;
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;
1147 static_cast<int>(x/scale-
xtrans+xoff),
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);
1196 painter.scale(scale,scale);
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) {
1267 if (event->orientation() == Qt::Vertical && !
autoZoom)
1268 scaleTree(
scale*100+ceil(static_cast<double>(event->delta())/4.0),
1269 event->x(),
event->y());
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));
bool isOnPath(void)
Return whether node is on the path.
void search(VisualNode *n, bool all, TreeCanvas *ti)
Node representing stop point.
void setCurrentNode(VisualNode *n, bool finished=true, bool update=true)
Set the selected node to n.
void labelBranches(void)
Label all branches in subtree under current node.
std::string toolTip(NodeAllocator &na, BestNode *curBest, int c_d, int a_d)
Return string that is used as a tool tip.
void toggleStop(void)
Do not stop at selected stop node.
void unhideAll(const NodeAllocator &na)
Unhide all nodes in the subtree of this node.
int right
Right coordinate.
NodeStatus getStatus(void) const
Return current status of the node.
void stopSearch(void)
Stop current search.
Space must be branched (at least one brancher left)
void labelPath(NodeAllocator &na, BestNode *curBest, int c_d, int a_d)
Create or clear branch labels on path to root.
void exportPDF(void)
Export pdf of the current subtree.
bool isRoot(void) const
Check if this node is the root of a tree.
void inspectCurrentNode(bool fix=true, int inspectorNo=-1)
Call the double click inspector for the currently selected node.
void setMarked(bool m)
Set mark of this node.
void unhideAll(void)
Unhide all nodes below selected node.
void solution(const Space *)
Signals that a solution has been found.
void autoZoomChanged(bool)
The auto-zoom state was changed.
Static reference to the currently best space.
bool compareNodesBeforeFP
Whether node comparison action computes fixpoint.
const FloatNum max
Largest allowed float value.
void addMoveInspector(Inspector *i)
Add inspector i.
Node representing a branch.
bool showCopies
Whether to show copies in the tree.
void searchFinished(void)
Signals that Gist is finished.
void addDoubleClickInspector(Inspector *i)
Add inspector i.
~TreeCanvas(void)
Destructor.
void layout(const NodeAllocator &na)
Compute layout for the subtree of this node.
void setSmoothScrollAndZoom(bool b)
Set preference whether to use smooth scrolling and zooming.
void navPrevSol(void)
Move selection to previous solution (in DFS order)
void navDown(void)
Move selection to the first child of the selected node.
Abstract base class for comparators.
BoundingBox getBoundingBox(void)
Return the bounding box.
void addComparator(Comparator *c)
Add comparator c.
bool isHidden(void)
Return if node is hidden.
QVector< VisualNode * > bookmarks
The bookmarks map.
NodeAllocatorBase< VisualNode > NodeAllocator
void abs(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
const int defScale
Default scale factor.
int sourceX
Source x coordinate after smooth scrolling.
QVector< QPair< Inspector *, bool > > moveInspectors
The registered move inspectors, and whether they are active.
Space * getSpace(NodeAllocator &na, BestNode *curBest, int c_d, int a_d)
Return working space. Receiver must delete the space.
void zoomToFit(void)
Zoom the canvas so that the whole tree fits.
TreeCanvas(Space *rootSpace, bool bab, QWidget *parent, const Options &opt)
Constructor.
void activateComparator(int i, bool active)
Set active comparator.
VisualNode * root
The root node of the tree.
Node representing failure.
void setPath(void)
Set the current node to be the head of the path.
int targetScale
Target scale after layout.
void navRoot(void)
Move selection to the root node.
int targetW
Target width after layout.
QSlider * scaleBar
The scale bar.
void mouseDoubleClickEvent(QMouseEvent *event)
Handle mouse double click event.
void navNextSol(bool back=false)
Move selection to next solution (in DFS order)
void mousePressEvent(QMouseEvent *event)
Handle mouse press event.
void hideFailed(void)
Hide failed subtrees of selected node.
void statusChanged(VisualNode *, const Statistics &, bool)
Status bar update.
unsigned int getNumberOfChildren(void) const
Return the number of children.
void toggleStop(const NodeAllocator &na)
Do not stop at this node.
void setBookmarked(bool m)
Set bookmark of this node.
Abstract base class for inspectors.
int xtrans
Offset on the x axis so that the tree is centered.
SearchItem(VisualNode *n0, int noOfChildren0)
Constructor.
Node that has not been explored yet.
const int minScale
Minimum scale factor.
void inspectPath(void)
Call the double click inspector for all nodes on the path from root to head of the path...
bool finishedFlag
Flag signalling that Gist is ready to be closed.
int i
The currently explored child.
void labelBranches(NodeAllocator &na, BestNode *curBest, int c_d, int a_d)
Create or clear branch labels in subtree.
Gecode::FloatVal c(-8, 8)
void paintEvent(QPaintEvent *event)
Paint the tree.
void unstopAll(const NodeAllocator &na)
Do not stop at any stop node in the subtree of this node.
const Choice * getChoice(void)
Return choice of this node.
int p
Number of positive literals for node type.
bool getMoveDuringSearch(void)
Return preference whether to move cursor during search.
const FloatNum min
Smallest allowed float value.
int targetX
Target x coordinate after smooth scrolling.
Gecode::IntArgs i(4, 1, 2, 3, 4)
int n
Number of negative literals for node type.
BestNode * curBest
The currently best solution (for branch-and-bound)
void searchOne(void)
Find next solution below selected node.
const Space * getWorkingSpace(void) const
Return working space (if present).
Space * clone(CloneStatistics &stat=unused_clone) const
Clone space.
VarImp * x
Pointer to variable implementation.
virtual const char * what(void) const
Return information.
Node representing a solution.
double scale
Current scale factor.
void scaleTree(int scale0, int zoomx=-1, int zoomy=-1)
Set scale factor to scale0.
void commit(const Choice &c, unsigned int a, CommitStatistics &stat=unused_commit)
Commit choice c for alternative a.
void labelPath(void)
Label all branches on path to root node.
void setRefreshPause(int i)
Set refresh pause in msec.
bool getAutoHideFailed(void)
Return preference whether to automatically hide failed subtrees.
unsigned int size(I &i)
Size of all ranges of range iterator i.
bool clone
Whether engines create a clone when being initialized.
void activateDoubleClickInspector(int i, bool active)
Set active inspector.
QMutex mutex
Mutex for synchronizing acccess to the tree.
A cursor that draws a tree on a QWidget.
Cursor & getCursor(void)
Return the cursor.
void activateSolutionInspector(int i, bool active)
Set active inspector.
void setRefresh(int i)
Set refresh rate.
int a_d
The adaptive recomputation distance.
A cursor that frees all memory.
QTimeLine scrollTimeLine
Timer for smooth scrolling.
void emitStatusChanged(void)
Re-emit status change information for current node.
VisualNode * pathHead
The head of the currently selected path.
int layoutDoneTimerId
Timer id for delaying the update.
void resizeToOuter(void)
Resize to the outer widget size if auto zoom is enabled.
void navUp(void)
Move selection to the parent of the selected node.
const int maxScale
Maximum scale factor.
T * dfs(T *s, const Search::Options &o)
Invoke depth-first search engine for subclass T of space s with options o.
void unstopAll(void)
Do not stop at any stop node.
void contextMenu(QContextMenuEvent *)
Context menu triggered.
bool autoHideFailed
Whether to hide failed subtrees automatically.
Statistics stats
Statistics about the search tree.
void exportWholeTreePDF(void)
Export pdf of the whole tree.
int getPathAlternative(const NodeAllocator &na)
Return the alternative of the child that is on the path (-1 if none)
QMutex layoutMutex
Mutex for synchronizing layout and drawing.
bool moveDuringSearch
Whether to move cursor during search.
QVector< QPair< Inspector *, bool > > doubleClickInspectors
The registered click inspectors, and whether they are active.
void inspectBeforeFP(void)
Calls inspectCurrentNode(false)
void scroll(void)
React to scroll events.
Shape * getShape(void)
Return the shape of this node.
void run(void)
Execute visitor.
int targetY
Target y coordinate after smooth scrolling.
struct Gecode::@585::NNF::@62::@63 b
For binary nodes (and, or, eqv)
int getParent(void) const
Return the parent.
bool smoothScrollAndZoom
Whether to use smooth scrolling and zooming.
Post propagator for SetVar SetOpType SetVar y
void scaleChanged(int)
The scale factor has changed.
Exception: Base-class for exceptions
void print(void)
Print the tree.
bool getSmoothScrollAndZoom(void)
Return preference whether to use smooth scrolling and zooming.
struct Gecode::@585::NNF::@62::@64 a
For atomic nodes.
void dirtyUp(const NodeAllocator &na)
Mark all nodes up the path to the parent as dirty.
Run a cursor over a tree, processing nodes in pre-order.
void setAutoZoom(bool b)
Set preference whether to automatically zoom to fit.
void searchAll(void)
Explore complete subtree of selected node.
void toggleHidden(const NodeAllocator &na)
Toggle whether this node is hidden.
int maxDepth
Maximum depth of the tree.
void addedBookmark(const QString &id)
Signals that a bookmark has been added.
void setShowCopies(bool b)
Set preference whether to show copies in the tree.
bool isBookmarked(void)
Return whether node is bookmarked.
int c_d
The recomputation distance.
void unPathUp(const NodeAllocator &na)
Set all nodes from the node to the root not to be on the path.
const int maxAutoZoomScale
Maximum scale factor for automatic zoom.
int noOfChildren
The number of children.
Node class that supports visual layout
int getOffset(void)
Return offset off this node from its parent.
int bab(Space *root, const Gist::Options &opt)
Create a new stand-alone Gist for branch-and-bound search of root.
int getAlternative(const NodeAllocator &na) const
Return alternative number of this node.
void addSolutionInspector(Inspector *i)
Add inspector i.
VisualNode * findNode(const NodeAllocator &na, int x, int y)
Find a node in this subtree at coordinates x, y.
void resizeEvent(QResizeEvent *event)
Handle resize event.
void setMoveDuringSearch(bool b)
Set preference whether to move cursor during search.
void removedBookmark(int idx)
Signals that a bookmark has been removed.
void setRecompDistances(int c_d, int a_d)
Set recomputation distances.
bool getShowCopies(void)
Return preference whether to show copies in the tree.
SpaceStatus status(StatusStatistics &stat=unused_status)
Query space status.
void startCompareNodes(void)
Wait for click on node to compare with current node.
QVector< QPair< Inspector *, bool > > solutionInspectors
The registered solution inspectors, and whether they are active.
A cursor that finds the next solution.
bool event(QEvent *event)
General event handler, used for displaying tool tips.
Post propagator for SetVar x
SearcherThread searcher
Search engine thread.
int getNumberOfChildNodes(NodeAllocator &na, BestNode *curBest, Statistics &stats, int c_d, int a_d)
Compute and return the number of children.
bool stopSearchFlag
Flag signalling the search to stop.
void centerCurrentNode(void)
Center the view on the currently selected node.
bool autoZoom
Whether to zoom automatically.
VisualNode * eventNode(QEvent *event)
Return the node corresponding to the event position.
int refreshPause
Time (in msec) to pause after each refresh.
void startCompareNodesBeforeFP(void)
Wait for click on node to compare with current node before fixpoint.
void pathUp(const NodeAllocator &na)
Set all nodes from the node to the root to be on the path.
bool getAutoZoom(void)
Return preference whether to automatically zoom to fit.
virtual void timerEvent(QTimerEvent *e)
Timer invoked for smooth zooming and scrolling.
A stack item for depth first search.
void navRight(void)
Move selection to the right sibling of the selected node.
int getChild(int n) const
Return index of child no n.
bool compareNodes
Whether node comparison action is running.
void navLeft(void)
Move selection to the left sibling of the selected node.
bool hasCopy(void)
Return whether the node has a copy.
Gecode toplevel namespace
void setAutoHideFailed(bool b)
Set preference whether to automatically hide failed subtrees.
int sourceY
Target y coordinate after smooth scrolling.
Space * snapshot(Space *s, const Options &o)
Clone space s dependening on options o.
void bookmarkNode(void)
Bookmark current node.
bool isOpen(void)
Return whether this node still has open children.
int targetH
Target height after layout.
QTimeLine zoomTimeLine
Timer for smooth zooming.
void wheelEvent(QWheelEvent *event)
Handle mouse wheel events.
#define GECODE_NEVER
Assert that this command is never executed.
void activateMoveInspector(int i, bool active)
Set active inspector.
void update(IntSet &y, Space &home, IntSet &py)
void update(void)
Update display.
void toggleHidden(void)
Toggle hidden state of selected node.
Statistics about the search tree
Node::NodeAllocator * na
Allocator for nodes.
bool finish(void)
Stop search and wait for it to finish.
void layoutDone(int w, int h, int scale0)
Layout done.
void hideFailed(const NodeAllocator &na, bool onlyDirty=false)
Hide all failed subtrees of this node.
int depth(void) const
Return depth of the shape.
A canvas that displays the search tree.
QVector< QPair< Comparator *, bool > > comparators
The registered comparators, and whether they are active.
VisualNode * currentNode
The currently selected node.
void contextMenuEvent(QContextMenuEvent *event)
Handle context menu event.
void purge(const NodeAllocator &na)
Clear working space and copy (if present and this is not the root).
Node representing ignored stop point.
Space is solved (no brancher left)