Rule literals are sorted, so first literal added is not first retrieved

Fixes #477
main
Nils Adermann 12 years ago
parent 1fe24a3837
commit a16aa68c1d

@ -1352,7 +1352,7 @@ class Solver
}
// conflict
list($newLevel, $newRule, $why) = $this->analyze($level, $rule);
list($learnLiteral, $newLevel, $newRule, $why) = $this->analyze($level, $rule);
assert($newLevel > 0);
assert($newLevel < $level);
@ -1369,9 +1369,8 @@ class Solver
$this->watch2OnHighest($newRule);
$this->addWatchesToRule($newRule);
$literals = $newRule->getLiterals();
$this->addDecision($literals[0], $level);
$this->decisionQueue[] = $literals[0];
$this->addDecision($learnLiteral, $level);
$this->decisionQueue[] = $learnLiteral;
$this->decisionQueueWhy[] = $newRule;
}
@ -1437,7 +1436,6 @@ class Solver
$l1retry = true;
while ($l1retry) {
$l1retry = false;
if (!$num && !--$l1num) {
@ -1483,7 +1481,7 @@ class Solver
assert($learnedLiterals[0] !== null);
$newRule = new Rule($learnedLiterals, Rule::RULE_LEARNED, $why);
return array($ruleLevel, $newRule, $why);
return array($learnedLiterals[0], $ruleLevel, $newRule, $why);
}
private function analyzeUnsolvableRule($problem, $conflictRule, &$lastWeakWhy)
@ -2029,7 +2027,7 @@ class Solver
{
echo "DecisionQueue: \n";
foreach ($this->decisionQueue as $i => $literal) {
echo ' ' . $literal . ' ' . $this->decisionQueueWhy[$i]."\n";
echo ' ' . $literal . ' ' . $this->decisionQueueWhy[$i]." level ".$this->decisionMap[$literal->getPackageId()]."\n";
}
echo "\n";
}

@ -622,6 +622,33 @@ class SolverTest extends TestCase
}
}
public function testLearnLiteralsWithSortedRuleLiterals()
{
$this->repo->addPackage($packageTwig2 = $this->getPackage('twig/twig', '2.0'));
$this->repo->addPackage($packageTwig16 = $this->getPackage('twig/twig', '1.6'));
$this->repo->addPackage($packageTwig15 = $this->getPackage('twig/twig', '1.5'));
$this->repo->addPackage($packageSymfony = $this->getPackage('symfony/symfony', '2.0'));
$this->repo->addPackage($packageTwigBridge = $this->getPackage('symfony/twig-bridge', '2.0'));
$packageTwigBridge->setRequires(array(
new Link('symfony/twig-bridge', 'twig/twig', $this->getVersionConstraint('<', '2.0'), 'requires'),
));
$packageSymfony->setReplaces(array(
new Link('symfony/symfony', 'symfony/twig-bridge', $this->getVersionConstraint('==', '2.0'), 'replaces'),
));
$this->reposComplete();
$this->request->install('symfony/twig-bridge');
$this->request->install('twig/twig');
$this->checkSolverResult(array(
array('job' => 'install', 'package' => $packageTwig16),
array('job' => 'install', 'package' => $packageTwigBridge),
));
}
protected function reposComplete()
{
$this->pool->addRepository($this->repoInstalled);

Loading…
Cancel
Save