| 402 | } |
| 403 | |
| 404 | bool |
| 405 | SetTestSpace::prune(const SetAssignment& a, Gecode::Support::RandomGenerator& rand) { |
| 406 | using namespace Gecode; |
| 407 | bool setsAssigned = true; |
| 408 | for (int j=x.size(); j--; ) |
| 409 | if (!x[j].assigned()) { |
| 410 | setsAssigned = false; |
| 411 | break; |
| 412 | } |
| 413 | bool intsAssigned = true; |
| 414 | for (int j=y.size(); j--; ) |
| 415 | if (!y[j].assigned()) { |
| 416 | intsAssigned = false; |
| 417 | break; |
| 418 | } |
| 419 | |
| 420 | // Select variable to be pruned |
| 421 | int i; |
| 422 | if (intsAssigned) { |
| 423 | i = rand(x.size()); |
| 424 | } else if (setsAssigned) { |
| 425 | i = rand(y.size()); |
| 426 | } else { |
| 427 | i = rand(x.size()+y.size()); |
| 428 | } |
| 429 | |
| 430 | if (setsAssigned || i>=x.size()) { |
| 431 | if (i>=x.size()) |
| 432 | i = i-x.size(); |
| 433 | while (y[i].assigned()) { |
| 434 | i = (i+1) % y.size(); |
| 435 | } |
| 436 | // Prune int var |
| 437 | |
| 438 | // Select mode for pruning |
| 439 | switch (rand(3)) { |
| 440 | case 0: |
| 441 | if (a.ints()[i] < y[i].max()) { |
| 442 | int v=a.ints()[i]+1+ |
| 443 | rand(static_cast<unsigned int>(y[i].max()-a.ints()[i])); |
| 444 | assert((v > a.ints()[i]) && (v <= y[i].max())); |
| 445 | rel(i, Gecode::IRT_LE, v); |
| 446 | } |
| 447 | break; |
| 448 | case 1: |
| 449 | if (a.ints()[i] > y[i].min()) { |
| 450 | int v=y[i].min()+ |
| 451 | rand(static_cast<unsigned int>(a.ints()[i]-y[i].min())); |
| 452 | assert((v < a.ints()[i]) && (v >= y[i].min())); |
| 453 | rel(i, Gecode::IRT_GR, v); |
| 454 | } |
| 455 | break; |
| 456 | default: |
| 457 | int v; |
| 458 | Gecode::Int::ViewRanges<Gecode::Int::IntView> it(y[i]); |
| 459 | unsigned int skip = rand(y[i].size()-1); |
| 460 | while (true) { |
| 461 | if (it.width() > skip) { |