mirror of
https://github.com/furyfire/trueskill.git
synced 2025-04-13 18:04:01 +00:00
59 lines
1.1 KiB
PHP
59 lines
1.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace DNW\Skills\FactorGraphs;
|
|
|
|
/**
|
|
* Helper class for computing the factor graph's normalization constant.
|
|
*/
|
|
class FactorList
|
|
{
|
|
/**
|
|
* @var Factor[] $list
|
|
*/
|
|
private array $list = [];
|
|
|
|
public function getLogNormalization(): float
|
|
{
|
|
$list = $this->list;
|
|
foreach ($list as &$currentFactor) {
|
|
$currentFactor->resetMarginals();
|
|
}
|
|
|
|
$sumLogZ = 0.0;
|
|
|
|
$listCount = count($this->list);
|
|
|
|
for ($i = 0; $i < $listCount; ++$i) {
|
|
$f = $this->list[$i];
|
|
|
|
$numberOfMessages = $f->getNumberOfMessages();
|
|
|
|
for ($j = 0; $j < $numberOfMessages; ++$j) {
|
|
$sumLogZ += $f->sendMessageIndex($j);
|
|
}
|
|
}
|
|
|
|
$sumLogS = 0;
|
|
|
|
foreach ($list as &$currentFactor) {
|
|
$sumLogS += $currentFactor->getLogNormalization();
|
|
}
|
|
|
|
return $sumLogZ + $sumLogS;
|
|
}
|
|
|
|
public function count(): int
|
|
{
|
|
return count($this->list);
|
|
}
|
|
|
|
public function addFactor(Factor $factor): Factor
|
|
{
|
|
$this->list[] = $factor;
|
|
|
|
return $factor;
|
|
}
|
|
}
|