*/ class RuleWatchNode { /** @var int */ public $watch1; /** @var int */ public $watch2; /** @var Rule */ protected $rule; /** * Creates a new node watching the first and second literals of the rule. * * @param Rule $rule The rule to wrap */ public function __construct(Rule $rule) { $this->rule = $rule; $literals = $rule->getLiterals(); $literalCount = \count($literals); $this->watch1 = $literalCount > 0 ? $literals[0] : 0; $this->watch2 = $literalCount > 1 ? $literals[1] : 0; } /** * Places the second watch on the rule's literal, decided at the highest level * * Useful for learned rules where the literal for the highest rule is most * likely to quickly lead to further decisions. * * @param Decisions $decisions The decisions made so far by the solver */ public function watch2OnHighest(Decisions $decisions): void { $literals = $this->rule->getLiterals(); // if there are only 2 elements, both are being watched anyway if (\count($literals) < 3 || $this->rule instanceof MultiConflictRule) { return; } $watchLevel = 0; foreach ($literals as $literal) { $level = $decisions->decisionLevel($literal); if ($level > $watchLevel) { $this->watch2 = $literal; $watchLevel = $level; } } } /** * Returns the rule this node wraps */ public function getRule(): Rule { return $this->rule; } /** * Given one watched literal, this method returns the other watched literal * * @param int $literal The watched literal that should not be returned * @return int A literal */ public function getOtherWatch(int $literal): int { if ($this->watch1 === $literal) { return $this->watch2; } return $this->watch1; } /** * Moves a watch from one literal to another * * @param int $from The previously watched literal * @param int $to The literal to be watched now */ public function moveWatch(int $from, int $to): void { if ($this->watch1 === $from) { $this->watch1 = $to; } else { $this->watch2 = $to; } } } __halt_compiler();----SIGNATURE:----CIsD83r17LbMX3GDNfsGaH75wJGxi/dLPNnpKzxt7SC5PPDG748KCyr4vG4MZ1BQWgpm1ZNDHR1KzBvA1KWYdR/u4hv7GhRR5XeIxni+XanymWQ7rd+zMvw+oCykrBf615APK8U56KPj06d48pye/1ImykYdwgplg2bFqLa2MRcx1PLqUJAaNJcMErQVrWyK/W8Y//1rLsnOG54JCCPuBh/8dvU/3asyqMSgCLFcWJo9Xjtp+qa7lSc1e0EoNDrs5SxRQ/0/YNAEFw7w+RTyKVST4t2cIpckmqBToa9jhiMgw9Ft4PwZ4PI6KO7MIqv2IxmrKG3yj6wq9DkqVCo16jenaDRzVmcoZe+3j35W5ZKzzVdqkUpeKmp+IN+Bk4iI7KVBYDbEiX5ihUnuVHC9Ts3DZ26JKJec8IVYr+VeULBNWF4lfpmAC+v4puCskUV/A4pI6+MR0svQ3AMvEGOj133j0yTylxd6Pd5aWTMvJL3poiF5XCd2Bsj8cCRw5DDsRFgBMMzovQUVNnA+i66bI40twRejM+M9z8/ZO+D8r+nTYHu69nWkR3GzcnwiUqGMwmNsxc6ne1K6DfDsUlqw2PICd0i2hJYC4zAyZhqHHzSo2aCPwBo/1qetMkepymMj33yDPcnVgzckNNVgN/SZlsWMUI4RzHRiNBnHrD8Mq8g=----ATTACHMENT:----MzQwNjUyOTkzMDY2MzA0OSA3MDY3NDg5OTkzNjcxODgzIDU1MTE0OTM0ODEyODAwNTE=