1
0
Fork 0

Correct branch handling and implement reverting of decisions at a particular level

pull/9/head
Nils Adermann 2011-08-20 13:36:18 -04:00
parent 37e676cedd
commit b0c685176b
1 changed files with 50 additions and 5 deletions

View File

@ -371,9 +371,10 @@ class Solver
$watchLevel = 0; $watchLevel = 0;
foreach ($literals as $literal) { foreach ($literals as $literal) {
$level = $this->decisionsMap[$literal->getPackageId()]; if (isset($this->decisionMap[$literal->getPackageId()])) {
if ($level < 0) { $level = abs($this->decisionMap[$literal->getPackageId()]);
$level = -$level; } else {
$level = 0;
} }
if ($level > $watchLevel) { if ($level > $watchLevel) {
@ -932,6 +933,7 @@ class Solver
protected $branches = array(); protected $branches = array();
protected $problems = array(); protected $problems = array();
protected $learnedPool = array(); protected $learnedPool = array();
protected $recommendsIndex;
protected function literalFromId($id) protected function literalFromId($id)
{ {
@ -1091,6 +1093,49 @@ class Solver
return null; return null;
} }
/**
* Reverts a decision at the given level.
*/
private function revert($level)
{
while (!empty($this->decisionQueue)) {
$literal = $this->decisionQueue[count($this->decisionQueue) - 1];
if (!isset($this->decisionMap[$literal->getPackageId()])) {
break;
}
$decisionLevel = abs($this->decisionMap[$literal->getPackageId()]);
if ($decisionLevel <= $level) {
break;
}
/** TODO: implement recommendations
*if (v > 0 && solv->recommendations.count && v == solv->recommendations.elements[solv->recommendations.count - 1])
* solv->recommendations.count--;
*/
unset($this->decisionMap[$literal->getPackageId()]);
array_pop($this->decisionQueue);
array_pop($this->decisionQueueWhy);
$this->propagateIndex = count($this->decisionQueue);
}
while (!empty($this->branches)) {
list($literals, $branchLevel) = $this->branches[count($this->branches) - 1];
if ($branchLevel > -$level) {
continue;
}
array_pop($this->branches);
}
$this->recommendsIndex = -1;
}
/**------------------------------------------------------------------- /**-------------------------------------------------------------------
* *
* setpropagatelearn * setpropagatelearn
@ -1126,7 +1171,7 @@ class Solver
} }
if ($level == 1) { if ($level == 1) {
return $this->analyze_unsolvable($rule, $disableRules); return $this->analyzeUnsolvable($rule, $disableRules);
} }
// conflict // conflict
@ -1165,7 +1210,7 @@ class Solver
if (count($literals) > 1) { if (count($literals) > 1) {
foreach ($literals as $i => $literal) { foreach ($literals as $i => $literal) {
if (0 !== $i) { if (0 !== $i) {
$this->branches[] = array($literal, $level); $this->branches[] = array(array($literal), -$level);
} }
} }
} }