| 538 | } |
| 539 | |
| 540 | bool |
| 541 | SetTestSpace::disabled(const SetAssignment& a, SetTestSpace& c, Gecode::Support::RandomGenerator& rand) { |
| 542 | c.disable(); |
| 543 | using namespace Gecode; |
| 544 | bool setsAssigned = true; |
| 545 | for (int j=x.size(); j--; ) |
| 546 | if (!x[j].assigned()) { |
| 547 | setsAssigned = false; |
| 548 | break; |
| 549 | } |
| 550 | bool intsAssigned = true; |
| 551 | for (int j=y.size(); j--; ) |
| 552 | if (!y[j].assigned()) { |
| 553 | intsAssigned = false; |
| 554 | break; |
| 555 | } |
| 556 | |
| 557 | // Select variable to be pruned |
| 558 | int i; |
| 559 | if (intsAssigned) { |
| 560 | i = rand(x.size()); |
| 561 | } else if (setsAssigned) { |
| 562 | i = rand(y.size()); |
| 563 | } else { |
| 564 | i = rand(x.size()+y.size()); |
| 565 | } |
| 566 | |
| 567 | if (setsAssigned || i>=x.size()) { |
| 568 | if (i>=x.size()) |
| 569 | i = i-x.size(); |
| 570 | while (y[i].assigned()) { |
| 571 | i = (i+1) % y.size(); |
| 572 | } |
| 573 | // Prune int var |
| 574 | |
| 575 | // Select mode for pruning |
| 576 | switch (rand(3)) { |
| 577 | case 0: |
| 578 | if (a.ints()[i] < y[i].max()) { |
| 579 | int v=a.ints()[i]+1+ |
| 580 | rand(static_cast<unsigned int>(y[i].max()-a.ints()[i])); |
| 581 | assert((v > a.ints()[i]) && (v <= y[i].max())); |
| 582 | rel(i, Gecode::IRT_LE, v); |
| 583 | c.rel(i, Gecode::IRT_LE, v); |
| 584 | } |
| 585 | break; |
| 586 | case 1: |
| 587 | if (a.ints()[i] > y[i].min()) { |
| 588 | int v=y[i].min()+ |
| 589 | rand(static_cast<unsigned int>(a.ints()[i]-y[i].min())); |
| 590 | assert((v < a.ints()[i]) && (v >= y[i].min())); |
| 591 | rel(i, Gecode::IRT_GR, v); |
| 592 | c.rel(i, Gecode::IRT_GR, v); |
| 593 | } |
| 594 | break; |
| 595 | default: |
| 596 | int v; |
| 597 | Gecode::Int::ViewRanges<Gecode::Int::IntView> it(y[i]); |
no test coverage detected