Cleanup in src/, adding namespaces, removing php closing tag and general code cleanup

This commit is contained in:
Alexander Liljengård
2016-05-24 14:10:39 +02:00
parent 9f97eb1653
commit 5694a2fb30
64 changed files with 891 additions and 1328 deletions

View File

@ -1,16 +1,9 @@
<?php
<?php namespace Moserware\Skills\TrueSkill\Factors;
namespace Moserware\Skills\TrueSkill\Factors;
require_once(dirname(__FILE__) . "/../../FactorGraphs/Factor.php");
require_once(dirname(__FILE__) . "/../../FactorGraphs/Message.php");
require_once(dirname(__FILE__) . "/../../FactorGraphs/Variable.php");
require_once(dirname(__FILE__) . "/../../Numerics/GaussianDistribution.php");
use Moserware\Numerics\GaussianDistribution;
use Moserware\Skills\FactorGraphs\Factor;
use Moserware\Skills\FactorGraphs\Message;
use Moserware\Skills\FactorGraphs\Variable;
use Moserware\Skills\Numerics\GaussianDistribution;
abstract class GaussianFactor extends Factor
{
@ -21,6 +14,9 @@ abstract class GaussianFactor extends Factor
/**
* Sends the factor-graph message with and returns the log-normalization constant.
* @param Message $message
* @param Variable $variable
* @return float|int
*/
protected function sendMessageVariable(Message &$message, Variable &$variable)
{
@ -35,11 +31,9 @@ abstract class GaussianFactor extends Factor
{
$newDistribution = GaussianDistribution::fromPrecisionMean(0, 0);
$binding = &parent::createVariableToMessageBindingWithMessage($variable,
new Message(
$newDistribution,
sprintf("message from %s to %s", $this, $variable)));
new Message(
$newDistribution,
sprintf("message from %s to %s", $this, $variable)));
return $binding;
}
}
?>
}

View File

@ -1,13 +1,6 @@
<?php
namespace Moserware\Skills\TrueSkill\Factors;
<?php namespace Moserware\Skills\TrueSkill\Factors;
require_once(dirname(__FILE__) . "/../../FactorGraphs/Message.php");
require_once(dirname(__FILE__) . "/../../FactorGraphs/Variable.php");
require_once(dirname(__FILE__) . "/../../Numerics/GaussianDistribution.php");
require_once(dirname(__FILE__) . "/../TruncatedGaussianCorrectionFunctions.php");
require_once(dirname(__FILE__) . "/GaussianFactor.php");
use Moserware\Numerics\GaussianDistribution;
use Moserware\Skills\Numerics\GaussianDistribution;
use Moserware\Skills\TrueSkill\TruncatedGaussianCorrectionFunctions;
use Moserware\Skills\FactorGraphs\Message;
use Moserware\Skills\FactorGraphs\Variable;
@ -36,10 +29,10 @@ class GaussianGreaterThanFactor extends GaussianFactor
$message = &$messages[0]->getValue();
$messageFromVariable = GaussianDistribution::divide($marginal, $message);
return -GaussianDistribution::logProductNormalization($messageFromVariable, $message)
+
log(
GaussianDistribution::cumulativeTo(($messageFromVariable->getMean() - $this->_epsilon)/
$messageFromVariable->getStandardDeviation()));
+
log(
GaussianDistribution::cumulativeTo(($messageFromVariable->getMean() - $this->_epsilon) /
$messageFromVariable->getStandardDeviation()));
}
@ -54,24 +47,24 @@ class GaussianGreaterThanFactor extends GaussianFactor
$sqrtC = sqrt($c);
$dOnSqrtC = $d/$sqrtC;
$dOnSqrtC = $d / $sqrtC;
$epsilsonTimesSqrtC = $this->_epsilon*$sqrtC;
$epsilsonTimesSqrtC = $this->_epsilon * $sqrtC;
$d = $messageFromVar->getPrecisionMean();
$denom = 1.0 - TruncatedGaussianCorrectionFunctions::wExceedsMargin($dOnSqrtC, $epsilsonTimesSqrtC);
$newPrecision = $c/$denom;
$newPrecision = $c / $denom;
$newPrecisionMean = ($d +
$sqrtC*
TruncatedGaussianCorrectionFunctions::vExceedsMargin($dOnSqrtC, $epsilsonTimesSqrtC))/
$denom;
$sqrtC *
TruncatedGaussianCorrectionFunctions::vExceedsMargin($dOnSqrtC, $epsilsonTimesSqrtC)) /
$denom;
$newMarginal = GaussianDistribution::fromPrecisionMean($newPrecisionMean, $newPrecision);
$newMessage = GaussianDistribution::divide(
GaussianDistribution::multiply($oldMessage, $newMarginal),
$oldMarginal);
GaussianDistribution::multiply($oldMessage, $newMarginal),
$oldMarginal);
// Update the message and marginal
$message->setValue($newMessage);
@ -81,5 +74,4 @@ class GaussianGreaterThanFactor extends GaussianFactor
// Return the difference in the new marginal
return GaussianDistribution::subtract($newMarginal, $oldMarginal);
}
}
?>
}

View File

@ -1,18 +1,13 @@
<?php
namespace Moserware\Skills\TrueSkill\Factors;
<?php namespace Moserware\Skills\TrueSkill\Factors;
require_once(dirname(__FILE__) . "/../../FactorGraphs/Message.php");
require_once(dirname(__FILE__) . "/../../FactorGraphs/Variable.php");
require_once(dirname(__FILE__) . "/../../Numerics/GaussianDistribution.php");
require_once(dirname(__FILE__) . "/GaussianFactor.php");
use Moserware\Numerics\GaussianDistribution;
use Exception;
use Moserware\Skills\FactorGraphs\Message;
use Moserware\Skills\FactorGraphs\Variable;
use Moserware\Skills\Numerics\GaussianDistribution;
/**
* Connects two variables and adds uncertainty.
*
*
* See the accompanying math paper for more details.
*/
class GaussianLikelihoodFactor extends GaussianFactor
@ -22,7 +17,7 @@ class GaussianLikelihoodFactor extends GaussianFactor
public function __construct($betaSquared, Variable &$variable1, Variable &$variable2)
{
parent::__construct(sprintf("Likelihood of %s going to %s", $variable2, $variable1));
$this->_precision = 1.0/$betaSquared;
$this->_precision = 1.0 / $betaSquared;
$this->createVariableToMessageBinding($variable1);
$this->createVariableToMessageBinding($variable2);
}
@ -33,24 +28,24 @@ class GaussianLikelihoodFactor extends GaussianFactor
$messages = &$this->getMessages();
return GaussianDistribution::logRatioNormalization(
$vars[0]->getValue(),
$messages[0]->getValue());
$vars[0]->getValue(),
$messages[0]->getValue());
}
private function updateHelper(Message &$message1, Message &$message2,
Variable &$variable1, Variable &$variable2)
{
{
$message1Value = clone $message1->getValue();
$message2Value = clone $message2->getValue();
$message2Value = clone $message2->getValue();
$marginal1 = clone $variable1->getValue();
$marginal2 = clone $variable2->getValue();
$a = $this->_precision/($this->_precision + $marginal2->getPrecision() - $message2Value->getPrecision());
$a = $this->_precision / ($this->_precision + $marginal2->getPrecision() - $message2Value->getPrecision());
$newMessage = GaussianDistribution::fromPrecisionMean(
$a*($marginal2->getPrecisionMean() - $message2Value->getPrecisionMean()),
$a*($marginal2->getPrecision() - $message2Value->getPrecision()));
$a * ($marginal2->getPrecisionMean() - $message2Value->getPrecisionMean()),
$a * ($marginal2->getPrecision() - $message2Value->getPrecision()));
$oldMarginalWithoutMessage = GaussianDistribution::divide($marginal1, $message1Value);
@ -68,20 +63,17 @@ class GaussianLikelihoodFactor extends GaussianFactor
public function updateMessageIndex($messageIndex)
{
$messages = &$this->getMessages();
$vars = &$this->getVariables();
$vars = &$this->getVariables();
switch ($messageIndex)
{
switch ($messageIndex) {
case 0:
return $this->updateHelper($messages[0], $messages[1],
$vars[0], $vars[1]);
$vars[0], $vars[1]);
case 1:
return $this->updateHelper($messages[1], $messages[0],
$vars[1], $vars[0]);
$vars[1], $vars[0]);
default:
throw new Exception();
}
}
}
?>
}

View File

@ -1,14 +1,8 @@
<?php
namespace Moserware\Skills\TrueSkill\Factors;
<?php namespace Moserware\Skills\TrueSkill\Factors;
require_once(dirname(__FILE__) . "/../../FactorGraphs/Message.php");
require_once(dirname(__FILE__) . "/../../FactorGraphs/Variable.php");
require_once(dirname(__FILE__) . "/../../Numerics/GaussianDistribution.php");
require_once(dirname(__FILE__) . "/GaussianFactor.php");
use Moserware\Numerics\GaussianDistribution;
use Moserware\Skills\FactorGraphs\Message;
use Moserware\Skills\FactorGraphs\Variable;
use Moserware\Skills\Numerics\GaussianDistribution;
/**
* Supplies the factor graph with prior information.
@ -24,7 +18,7 @@ class GaussianPriorFactor extends GaussianFactor
parent::__construct(sprintf("Prior value going to %s", $variable));
$this->_newMessage = new GaussianDistribution($mean, sqrt($variance));
$newMessage = new Message(GaussianDistribution::fromPrecisionMean(0, 0),
sprintf("message from %s to %s", $this, $variable));
sprintf("message from %s to %s", $this, $variable));
$this->createVariableToMessageBindingWithMessage($variable, $newMessage);
}
@ -43,6 +37,4 @@ class GaussianPriorFactor extends GaussianFactor
$message->setValue($newMessage);
return GaussianDistribution::subtract($oldMarginal, $newMarginal);
}
}
?>
}

View File

@ -1,21 +1,14 @@
<?php
namespace Moserware\Skills\TrueSkill\Factors;
<?php namespace Moserware\Skills\TrueSkill\Factors;
require_once(dirname(__FILE__) . "/../../Guard.php");
require_once(dirname(__FILE__) . "/../../FactorGraphs/Message.php");
require_once(dirname(__FILE__) . "/../../FactorGraphs/Variable.php");
require_once(dirname(__FILE__) . "/../../Numerics/GaussianDistribution.php");
require_once(dirname(__FILE__) . "/../../Numerics/BasicMath.php");
require_once(dirname(__FILE__) . "/GaussianFactor.php");
use Moserware\Numerics\GaussianDistribution;
use Moserware\Skills\Guard;
use Moserware\Skills\FactorGraphs\Message;
use Moserware\Skills\FactorGraphs\Variable;
use Moserware\Skills\Numerics\BasicMatch;
use Moserware\Skills\Numerics\GaussianDistribution;
/**
* Factor that sums together multiple Gaussians.
*
*
* See the accompanying math paper for more details.s
*/
class GaussianWeightedSumFactor extends GaussianFactor
@ -37,20 +30,18 @@ class GaussianWeightedSumFactor extends GaussianFactor
// v_0 = a_1*v_1 + a_2*v_2 + ... + a_n * v_n
$variableWeightsLength = count($variableWeights);
$this->_weights[0] = \array_fill(0, count($variableWeights), 0);
for($i = 0; $i < $variableWeightsLength; $i++)
{
for ($i = 0; $i < $variableWeightsLength; $i++) {
$weight = &$variableWeights[$i];
$this->_weights[0][$i] = $weight;
$this->_weightsSquared[0][$i] = square($weight);
$this->_weightsSquared[0][$i] = BasicMatch::square($weight);
}
$variablesToSumLength = count($variablesToSum);
// 0..n-1
$this->_variableIndexOrdersForWeights[0] = array();
for($i = 0; $i < ($variablesToSumLength + 1); $i++)
{
for ($i = 0; $i < ($variablesToSumLength + 1); $i++) {
$this->_variableIndexOrdersForWeights[0][] = $i;
}
@ -62,10 +53,9 @@ class GaussianWeightedSumFactor extends GaussianFactor
// By convention, we'll put the v_0 term at the end
$weightsLength = $variableWeightsLength + 1;
for ($weightsIndex = 1; $weightsIndex < $weightsLength; $weightsIndex++)
{
for ($weightsIndex = 1; $weightsIndex < $weightsLength; $weightsIndex++) {
$currentWeights = \array_fill(0, $variableWeightsLength, 0);
$variableIndices = \array_fill(0, $variableWeightsLength + 1, 0);
$variableIndices[0] = $weightsIndex;
@ -73,42 +63,38 @@ class GaussianWeightedSumFactor extends GaussianFactor
// keep a single variable to keep track of where we are in the array.
// This is helpful since we skip over one of the spots
$currentDestinationWeightIndex = 0;
$currentDestinationWeightIndex = 0;
for ($currentWeightSourceIndex = 0;
$currentWeightSourceIndex < $variableWeightsLength;
$currentWeightSourceIndex++)
{
if ($currentWeightSourceIndex == ($weightsIndex - 1))
{
$currentWeightSourceIndex++) {
if ($currentWeightSourceIndex == ($weightsIndex - 1)) {
continue;
}
$currentWeight = (-$variableWeights[$currentWeightSourceIndex]/$variableWeights[$weightsIndex - 1]);
$currentWeight = (-$variableWeights[$currentWeightSourceIndex] / $variableWeights[$weightsIndex - 1]);
if ($variableWeights[$weightsIndex - 1] == 0)
{
if ($variableWeights[$weightsIndex - 1] == 0) {
// HACK: Getting around division by zero
$currentWeight = 0;
}
$currentWeights[$currentDestinationWeightIndex] = $currentWeight;
$currentWeightsSquared[$currentDestinationWeightIndex] = $currentWeight*$currentWeight;
$currentWeightsSquared[$currentDestinationWeightIndex] = $currentWeight * $currentWeight;
$variableIndices[$currentDestinationWeightIndex + 1] = $currentWeightSourceIndex + 1;
$currentDestinationWeightIndex++;
}
// And the final one
$finalWeight = 1.0/$variableWeights[$weightsIndex - 1];
$finalWeight = 1.0 / $variableWeights[$weightsIndex - 1];
if ($variableWeights[$weightsIndex - 1] == 0)
{
if ($variableWeights[$weightsIndex - 1] == 0) {
// HACK: Getting around division by zero
$finalWeight = 0;
}
$currentWeights[$currentDestinationWeightIndex] = $finalWeight;
$currentWeightsSquared[$currentDestinationWeightIndex] = square($finalWeight);
$currentWeightsSquared[$currentDestinationWeightIndex] = BasicMatch::square($finalWeight);
$variableIndices[count($variableWeights)] = 0;
$this->_variableIndexOrdersForWeights[] = $variableIndices;
@ -118,11 +104,10 @@ class GaussianWeightedSumFactor extends GaussianFactor
$this->createVariableToMessageBinding($sumVariable);
foreach ($variablesToSum as &$currentVariable)
{
foreach ($variablesToSum as &$currentVariable) {
$localCurrentVariable = &$currentVariable;
$this->createVariableToMessageBinding($localCurrentVariable);
}
}
}
public function getLogNormalization()
@ -134,8 +119,7 @@ class GaussianWeightedSumFactor extends GaussianFactor
// We start at 1 since offset 0 has the sum
$varCount = count($vars);
for ($i = 1; $i < $varCount; $i++)
{
for ($i = 1; $i < $varCount; $i++) {
$result += GaussianDistribution::logRatioNormalization($vars[$i]->getValue(), $messages[$i]->getValue());
}
@ -160,30 +144,29 @@ class GaussianWeightedSumFactor extends GaussianFactor
$weightsSquaredLength = count($weightsSquared);
for ($i = 0; $i < $weightsSquaredLength; $i++)
{
for ($i = 0; $i < $weightsSquaredLength; $i++) {
// These flow directly from the paper
$inverseOfNewPrecisionSum += $weightsSquared[$i]/
($variables[$i + 1]->getValue()->getPrecision() - $messages[$i + 1]->getValue()->getPrecision());
$inverseOfNewPrecisionSum += $weightsSquared[$i] /
($variables[$i + 1]->getValue()->getPrecision() - $messages[$i + 1]->getValue()->getPrecision());
$diff = GaussianDistribution::divide($variables[$i + 1]->getValue(), $messages[$i + 1]->getValue());
$anotherInverseOfNewPrecisionSum += $weightsSquared[$i]/$diff->getPrecision();
$anotherInverseOfNewPrecisionSum += $weightsSquared[$i] / $diff->getPrecision();
$weightedMeanSum += $weights[$i]
*
($variables[$i + 1]->getValue()->getPrecisionMean() - $messages[$i + 1]->getValue()->getPrecisionMean())
/
($variables[$i + 1]->getValue()->getPrecision() - $messages[$i + 1]->getValue()->getPrecision());
*
($variables[$i + 1]->getValue()->getPrecisionMean() - $messages[$i + 1]->getValue()->getPrecisionMean())
/
($variables[$i + 1]->getValue()->getPrecision() - $messages[$i + 1]->getValue()->getPrecision());
$anotherWeightedMeanSum += $weights[$i]*$diff->getPrecisionMean()/$diff->getPrecision();
$anotherWeightedMeanSum += $weights[$i] * $diff->getPrecisionMean() / $diff->getPrecision();
}
$newPrecision = 1.0/$inverseOfNewPrecisionSum;
$anotherNewPrecision = 1.0/$anotherInverseOfNewPrecisionSum;
$newPrecision = 1.0 / $inverseOfNewPrecisionSum;
$anotherNewPrecision = 1.0 / $anotherInverseOfNewPrecisionSum;
$newPrecisionMean = $newPrecision*$weightedMeanSum;
$anotherNewPrecisionMean = $anotherNewPrecision*$anotherWeightedMeanSum;
$newPrecisionMean = $newPrecision * $weightedMeanSum;
$anotherNewPrecisionMean = $anotherNewPrecision * $anotherWeightedMeanSum;
$newMessage = GaussianDistribution::fromPrecisionMean($newPrecisionMean, $newPrecision);
$oldMarginalWithoutMessage = GaussianDistribution::divide($marginal0, $message0);
@ -201,7 +184,7 @@ class GaussianWeightedSumFactor extends GaussianFactor
}
public function updateMessageIndex($messageIndex)
{
{
$allMessages = &$this->getMessages();
$allVariables = &$this->getVariables();
@ -216,16 +199,15 @@ class GaussianWeightedSumFactor extends GaussianFactor
// order as the weights. Thankfully, the weights and messages share the same index numbers,
// so we just need to make sure they're consistent
$allMessagesCount = count($allMessages);
for ($i = 0; $i < $allMessagesCount; $i++)
{
for ($i = 0; $i < $allMessagesCount; $i++) {
$updatedMessages[] = &$allMessages[$indicesToUse[$i]];
$updatedVariables[] = &$allVariables[$indicesToUse[$i]];
}
return $this->updateHelper($this->_weights[$messageIndex],
$this->_weightsSquared[$messageIndex],
$updatedMessages,
$updatedVariables);
$this->_weightsSquared[$messageIndex],
$updatedMessages,
$updatedVariables);
}
private static function createName($sumVariable, $variablesToSum, $weights)
@ -233,14 +215,12 @@ class GaussianWeightedSumFactor extends GaussianFactor
// TODO: Perf? Use PHP equivalent of StringBuilder? implode on arrays?
$result = (string)$sumVariable;
$result .= ' = ';
$totalVars = count($variablesToSum);
for($i = 0; $i < $totalVars; $i++)
{
for ($i = 0; $i < $totalVars; $i++) {
$isFirst = ($i == 0);
if($isFirst && ($weights[$i] < 0))
{
if ($isFirst && ($weights[$i] < 0)) {
$result .= '-';
}
@ -249,24 +229,18 @@ class GaussianWeightedSumFactor extends GaussianFactor
$result .= "*[";
$result .= (string)$variablesToSum[$i];
$result .= ']';
$isLast = ($i == ($totalVars - 1));
if(!$isLast)
{
if($weights[$i + 1] >= 0)
{
if (!$isLast) {
if ($weights[$i + 1] >= 0) {
$result .= ' + ';
}
else
{
} else {
$result .= ' - ';
}
}
}
}
return $result;
}
}
?>
}

View File

@ -1,13 +1,6 @@
<?php
namespace Moserware\Skills\TrueSkill\Factors;
<?php namespace Moserware\Skills\TrueSkill\Factors;
require_once(dirname(__FILE__) . "/../TruncatedGaussianCorrectionFunctions.php");
require_once(dirname(__FILE__) . "/../../FactorGraphs/Message.php");
require_once(dirname(__FILE__) . "/../../FactorGraphs/Variable.php");
require_once(dirname(__FILE__) . "/../../Numerics/GaussianDistribution.php");
require_once(dirname(__FILE__) . "/GaussianFactor.php");
use Moserware\Numerics\GaussianDistribution;
use Moserware\Skills\Numerics\GaussianDistribution;
use Moserware\Skills\TrueSkill\TruncatedGaussianCorrectionFunctions;
use Moserware\Skills\FactorGraphs\Message;
use Moserware\Skills\FactorGraphs\Variable;
@ -38,9 +31,9 @@ class GaussianWithinFactor extends GaussianFactor
$messageFromVariable = GaussianDistribution::divide($marginal, $message);
$mean = $messageFromVariable->getMean();
$std = $messageFromVariable->getStandardDeviation();
$z = GaussianDistribution::cumulativeTo(($this->_epsilon - $mean)/$std)
-
GaussianDistribution::cumulativeTo((-$this->_epsilon - $mean)/$std);
$z = GaussianDistribution::cumulativeTo(($this->_epsilon - $mean) / $std)
-
GaussianDistribution::cumulativeTo((-$this->_epsilon - $mean) / $std);
return -GaussianDistribution::logProductNormalization($messageFromVariable, $message) + log($z);
}
@ -55,22 +48,22 @@ class GaussianWithinFactor extends GaussianFactor
$d = $messageFromVariable->getPrecisionMean();
$sqrtC = sqrt($c);
$dOnSqrtC = $d/$sqrtC;
$dOnSqrtC = $d / $sqrtC;
$epsilonTimesSqrtC = $this->_epsilon*$sqrtC;
$epsilonTimesSqrtC = $this->_epsilon * $sqrtC;
$d = $messageFromVariable->getPrecisionMean();
$denominator = 1.0 - TruncatedGaussianCorrectionFunctions::wWithinMargin($dOnSqrtC, $epsilonTimesSqrtC);
$newPrecision = $c/$denominator;
$newPrecision = $c / $denominator;
$newPrecisionMean = ($d +
$sqrtC*
TruncatedGaussianCorrectionFunctions::vWithinMargin($dOnSqrtC, $epsilonTimesSqrtC))/
$denominator;
$sqrtC *
TruncatedGaussianCorrectionFunctions::vWithinMargin($dOnSqrtC, $epsilonTimesSqrtC)) /
$denominator;
$newMarginal = GaussianDistribution::fromPrecisionMean($newPrecisionMean, $newPrecision);
$newMessage = GaussianDistribution::divide(
GaussianDistribution::multiply($oldMessage, $newMarginal),
$oldMarginal);
GaussianDistribution::multiply($oldMessage, $newMarginal),
$oldMarginal);
// Update the message and marginal
$message->setValue($newMessage);
@ -79,6 +72,4 @@ class GaussianWithinFactor extends GaussianFactor
// Return the difference in the new marginal
return GaussianDistribution::subtract($newMarginal, $oldMarginal);
}
}
?>
}