45 namespace Gecode {
namespace Gist {
190 std::vector<std::pair<VisualNode*,int> >
path;
193 path.push_back(std::pair<VisualNode*,int>(p,p->
getAlternative(na)));
196 while (!path.empty()) {
197 std::pair<VisualNode*,int> cur = path.back(); path.pop_back();
200 cur.first->getBranchLabel(na,p,p->
getChoice(),
201 curBest,
c_d,
a_d,cur.second);
202 na.
setLabel(cur.first,QString(l.c_str()));
245 if (
getShape()->getExtentAtDepth(depth, theExtent)) {
246 return (theExtent.
l <= x && x <= theExtent.
r);
257 while (depth > 0 && cur != NULL) {
291 std::ostringstream oss;
302 template<
class S1,
class S2>
303 static int getAlpha(
const S1& shape1,
int depth1,
304 const S2& shape2,
int depth2);
306 template<
class S1,
class S2>
308 const S1& shape1,
int depth1,
309 const S2& shape2,
int depth2,
int alpha);
312 template<
class S1,
class S2>
315 const S2& shape2,
int depth2) {
319 for (
int i=0;
i<depth1 &&
i<depth2;
i++) {
320 extentR += shape1[
i].r;
321 extentL += shape2[
i].l;
327 template<
class S1,
class S2>
330 const S1& shape1,
int depth1,
331 const S2& shape2,
int depth2,
int alpha) {
333 for (
int i=depth2;
i--;)
334 result[
i] = shape2[
i];
335 }
else if (depth2 == 0) {
336 for (
int i=depth1;
i--;)
337 result[
i] = shape1[
i];
341 int topmostL = shape1[0].
l;
342 int topmostR = shape2[0].r;
344 shape1[0].r - alpha - shape2[0].r;
346 shape2[0].l + alpha - shape1[0].l;
348 result[0] =
Extent(topmostL, topmostR+alpha);
356 for (; i<depth1 && i<depth2; i++) {
357 Extent currentExtent1 = shape1[
i];
358 Extent currentExtent2 = shape2[
i];
359 int newExtentL = currentExtent1.
l;
360 int newExtentR = currentExtent2.
r;
361 result[
i] =
Extent(newExtentL, newExtentR);
362 backoffTo1 += currentExtent1.
r - currentExtent2.
r;
363 backoffTo2 += currentExtent2.
l - currentExtent1.
l;
369 Extent currentExtent1 = shape1[
i];
370 int newExtentL = currentExtent1.
l;
371 int newExtentR = currentExtent1.
r;
372 result[
i] =
Extent(newExtentL, newExtentR+backoffTo1);
374 for (; i<depth1; i++) {
375 result[
i] = shape1[
i];
382 Extent currentExtent2 = shape2[
i];
383 int newExtentL = currentExtent2.
l;
384 int newExtentR = currentExtent2.
r;
385 result[
i] =
Extent(newExtentL+backoffTo2, newExtentR);
387 for (; i<depth2; i++) {
388 result[
i] = shape2[
i];
417 if (alt==0 && n_alt > 1) {
419 }
else if (alt==n_alt-1 && n_alt > 1) {
426 if (numberOfShapes==0) {
435 for (
int i = numberOfShapes;
i--;)
439 getShape()->depth() >= maxDepth+1) {
445 (*mergedShape)[0] = extent;
446 if (numberOfShapes < 1) {
448 }
else if (numberOfShapes == 1) {
451 for (
int i=childShape->
depth();
i--;)
452 (*mergedShape)[
i+1] = (*childShape)[
i];
453 (*mergedShape)[1].extend(- extent.
l, - extent.
r);
462 assert(root->
copy != NULL);
464 std::pair<int,int>* alpha =
465 r.
alloc<std::pair<int,int> >(numberOfShapes);
471 int ldepth =
getChild(na,0)->getShape()->depth();
472 for (
int i=ldepth;
i--;)
478 int rdepth = rShape->
depth();
479 for (
int i=rdepth;
i--;)
480 (*mergedShape)[
i+1] = (*rShape)[
i];
481 Extent* currentShapeR = &(*mergedShape)[1];
483 for (
int i = 1;
i < numberOfShapes;
i++) {
493 Layouter::getAlpha<Extent*,Shape>(¤tShapeL[0], ldepth,
494 *nextShapeL, nextShapeL->
depth());
495 Layouter::merge<Extent*,Shape>(¤tShapeL[0],
496 ¤tShapeL[0], ldepth,
497 *nextShapeL, nextShapeL->depth(),
499 ldepth =
std::max(ldepth,nextShapeL->depth());
500 alpha[
i].first = nextAlphaL - width;
507 Layouter::getAlpha<Shape,Extent*>(*nextShapeR, nextShapeR->
depth(),
508 ¤tShapeR[0], rdepth);
509 Layouter::merge<Shape,Extent*>(¤tShapeR[0],
510 *nextShapeR, nextShapeR->depth(),
511 ¤tShapeR[0], rdepth,
513 rdepth =
std::max(rdepth,nextShapeR->depth());
514 alpha[numberOfShapes -
i].second = nextAlphaR;
518 (*mergedShape)[1].extend(- extent.
l, - extent.
r);
524 int halfWidth =
false ? 0 : width / 2;
525 (*mergedShape)[1].move(- halfWidth);
535 for (
int i = 1;
i < numberOfShapes;
i++) {
536 offset += (alpha[
i].first + alpha[
i].second) / 2;