Run test
| 589 | HTB_BINARY,HTB_BINARY,HTB_BINARY), best(b), mt(mt0), st(st0) {} |
| 590 | /// Run test |
| 591 | virtual bool run(void) { |
| 592 | using namespace Gecode; |
| 593 | Model* m = new Model(htb1,htb2,htb3); |
| 594 | Gecode::Search::FailStop f(2); |
| 595 | |
| 596 | Gecode::Search::Options mo; |
| 597 | mo.threads = mt; |
| 598 | mo.d_l = 100; |
| 599 | mo.stop = &f; |
| 600 | |
| 601 | Gecode::Search::Options so; |
| 602 | so.threads = st; |
| 603 | so.d_l = 100; |
| 604 | so.cutoff = Gecode::Search::Cutoff::constant(1000000); |
| 605 | if (best) { |
| 606 | SEBs sebs(3); |
| 607 | sebs[0] = bab<Model>(so); |
| 608 | sebs[1] = bab<Model>(so); |
| 609 | sebs[2] = rbs<Model,Gecode::BAB>(so); |
| 610 | Gecode::PBS<Model,Gecode::BAB> pbs(m, sebs, mo); |
| 611 | delete m; |
| 612 | |
| 613 | Model* b = nullptr; |
| 614 | while (true) { |
| 615 | Model* s = pbs.next(); |
| 616 | if (s != nullptr) { |
| 617 | delete b; b=s; |
| 618 | } |
| 619 | if ((s == nullptr) && !pbs.stopped()) |
| 620 | break; |
| 621 | f.limit(f.limit()+2); |
| 622 | } |
| 623 | bool ok = (b == nullptr) || b->best(); |
| 624 | delete b; |
| 625 | return ok; |
| 626 | } else { |
| 627 | SEBs sebs(3); |
| 628 | sebs[0] = dfs<Model>(so); |
| 629 | sebs[1] = lds<Model>(so); |
| 630 | sebs[2] = rbs<Model,Gecode::DFS>(so); |
| 631 | Gecode::PBS<Model,Gecode::DFS> pbs(m, sebs, mo); |
| 632 | |
| 633 | int n = 3 * m->solutions(); |
| 634 | delete m; |
| 635 | |
| 636 | while (true) { |
| 637 | Model* s = pbs.next(); |
| 638 | if (s != nullptr) { |
| 639 | n--; delete s; |
| 640 | } |
| 641 | if ((s == nullptr) && !pbs.stopped()) |
| 642 | break; |
| 643 | f.limit(f.limit()+2); |
| 644 | } |
| 645 | return n >= 0; |
| 646 | } |
| 647 | } |
| 648 | }; |