From 7f41698157c77b627bdcf5837ba19468ceea7a7c Mon Sep 17 00:00:00 2001 From: Nils Adermann Date: Wed, 21 Oct 2020 13:36:31 +0200 Subject: [PATCH] Solver: on analyze, when reaching last decision > l1 skip other multi rule literals --- src/Composer/DependencyResolver/Solver.php | 46 +++++++++++----------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/Composer/DependencyResolver/Solver.php b/src/Composer/DependencyResolver/Solver.php index 92444eaac..4221c6fdd 100644 --- a/src/Composer/DependencyResolver/Solver.php +++ b/src/Composer/DependencyResolver/Solver.php @@ -465,35 +465,35 @@ class Solver // only level 1 marks left $l1num++; $l1retry = true; - } + } else { + $decision = $this->decisions->atOffset($decisionId); + $rule = $decision[Decisions::DECISION_REASON]; - $decision = $this->decisions->atOffset($decisionId); - $rule = $decision[Decisions::DECISION_REASON]; + if ($rule instanceof MultiConflictRule) { + // there is only ever exactly one positive decision in a multiconflict rule + foreach ($rule->getLiterals() as $literal) { + if (!isset($seen[abs($literal)]) && $this->decisions->satisfy(-$literal)) { + $this->learnedPool[\count($this->learnedPool) - 1][] = $rule; + $l = $this->decisions->decisionLevel($literal); + if (1 === $l) { + $l1num++; + } elseif ($level === $l) { + $num++; + } else { + // not level1 or conflict level, add to new rule + $learnedLiterals[] = $literal; - if ($rule instanceof MultiConflictRule) { - // there is only ever exactly one positive decision in a multiconflict rule - foreach ($rule->getLiterals() as $literal) { - if (!isset($seen[abs($literal)]) && $this->decisions->satisfy(-$literal)) { - $this->learnedPool[\count($this->learnedPool) - 1][] = $rule; - $l = $this->decisions->decisionLevel($literal); - if (1 === $l) { - $l1num++; - } elseif ($level === $l) { - $num++; - } else { - // not level1 or conflict level, add to new rule - $learnedLiterals[] = $literal; - - if ($l > $ruleLevel) { - $ruleLevel = $l; + if ($l > $ruleLevel) { + $ruleLevel = $l; + } } + $seen[abs($literal)] = true; + break; } - $seen[abs($literal)] = true; - break; } - } - $l1retry = true; + $l1retry = true; + } } }