mirror of
				https://github.com/furyfire/trueskill.git
				synced 2025-11-04 10:12:28 +01:00 
			
		
		
		
	Tenative pass at getting prior layer working. Found out about division by zero and closure differences.
This commit is contained in:
		@@ -9,7 +9,6 @@ require_once(dirname(__FILE__) . "/Variable.php");
 | 
			
		||||
use Moserware\Skills\Guard;
 | 
			
		||||
use Moserware\Skills\HashMap;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
abstract class Factor
 | 
			
		||||
{
 | 
			
		||||
    private $_messages = array();
 | 
			
		||||
@@ -21,7 +20,7 @@ abstract class Factor
 | 
			
		||||
    protected function __construct($name)
 | 
			
		||||
    {
 | 
			
		||||
        $this->_name = "Factor[" . $name . "]";
 | 
			
		||||
        $this->_messagesToVariableBinding = new HashMap();
 | 
			
		||||
        $this->_messageToVariableBinding = new HashMap();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Returns the log-normalization constant of that factor
 | 
			
		||||
@@ -81,12 +80,12 @@ abstract class Factor
 | 
			
		||||
 | 
			
		||||
    public abstract function createVariableToMessageBinding(Variable &$variable);
 | 
			
		||||
 | 
			
		||||
    protected function createVariableToMessageBindingWithMessage(Variable &$variable, Variable &$message)
 | 
			
		||||
    protected function createVariableToMessageBindingWithMessage(Variable &$variable, Message &$message)
 | 
			
		||||
    {
 | 
			
		||||
        $index = count($this->_messages);
 | 
			
		||||
        $this->_messages[] = $message;
 | 
			
		||||
        $this->_messages[] = $message;        
 | 
			
		||||
        $this->_messageToVariableBinding->setValue($message, $variable);
 | 
			
		||||
        $this->_variables[] = $variable;
 | 
			
		||||
        $this->_variables[] = &$variable;
 | 
			
		||||
        return $message;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,7 @@ abstract class FactorGraphLayer
 | 
			
		||||
        return $this->_localFactors;        
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function &setInputVariablesGroups(&$value)
 | 
			
		||||
    public function setInputVariablesGroups(&$value)
 | 
			
		||||
    {
 | 
			
		||||
        $this->_inputVariablesGroups = $value;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,7 @@ class VariableFactory
 | 
			
		||||
 | 
			
		||||
    public function __construct($variablePriorInitializer)
 | 
			
		||||
    {
 | 
			
		||||
        $this->_variablePriorInitializer = $variablePriorInitializer;
 | 
			
		||||
        $this->_variablePriorInitializer = &$variablePriorInitializer;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function createBasicVariable()
 | 
			
		||||
@@ -22,7 +22,8 @@ class VariableFactory
 | 
			
		||||
 | 
			
		||||
    public function createKeyedVariable($key)
 | 
			
		||||
    {
 | 
			
		||||
        $newVar = new KeyedVariable($key, $this->_variablePriorInitializer());
 | 
			
		||||
        $initializer = $this->_variablePriorInitializer;
 | 
			
		||||
        $newVar = new KeyedVariable($key, "key variable", $initializer());
 | 
			
		||||
        return $newVar;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Moserware\Skills;
 | 
			
		||||
 | 
			
		||||
class HashMap
 | 
			
		||||
{
 | 
			
		||||
    private $_hashToValue = array();
 | 
			
		||||
 
 | 
			
		||||
@@ -81,9 +81,19 @@ class GaussianDistribution
 | 
			
		||||
        $result = new GaussianDistribution();
 | 
			
		||||
        $result->_precision = $precision;
 | 
			
		||||
        $result->_precisionMean = $precisionMean;
 | 
			
		||||
        $result->_variance = 1.0/$precision;
 | 
			
		||||
        $result->_standardDeviation = sqrt($result->_variance);
 | 
			
		||||
        $result->_mean = $result->_precisionMean/$result->_precision;
 | 
			
		||||
 | 
			
		||||
        if($precision != 0)
 | 
			
		||||
        {
 | 
			
		||||
            $result->_variance = 1.0/$precision;
 | 
			
		||||
            $result->_standardDeviation = sqrt($result->_variance);
 | 
			
		||||
            $result->_mean = $result->_precisionMean/$result->_precision;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            $result->_variance = \INF;
 | 
			
		||||
            $result->_standardDeviation = \INF;
 | 
			
		||||
            $result->_mean = \NAN;
 | 
			
		||||
        }
 | 
			
		||||
        return $result;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@ class RatingContainer
 | 
			
		||||
 | 
			
		||||
    public function __construct()
 | 
			
		||||
    {
 | 
			
		||||
        $this->_playerToRating = new \HashMap();
 | 
			
		||||
        $this->_playerToRating = new HashMap();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getRating($player)
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ abstract class GaussianFactor extends Factor
 | 
			
		||||
 | 
			
		||||
    public function createVariableToMessageBinding(Variable &$variable)
 | 
			
		||||
    {
 | 
			
		||||
        return parent::createVariableToMessageBinding($variable,
 | 
			
		||||
        return parent::createVariableToMessageBindingWithMessage($variable,
 | 
			
		||||
                                                      new Message(
 | 
			
		||||
                                                          GaussianDistribution::fromPrecisionMean(0, 0),
 | 
			
		||||
                                                          "message from {0} to {1}", $this));
 | 
			
		||||
 
 | 
			
		||||
@@ -23,11 +23,11 @@ class GaussianPriorFactor extends GaussianFactor
 | 
			
		||||
    {
 | 
			
		||||
        parent::__construct("Prior value going to {0}");
 | 
			
		||||
        $this->_newMessage = new GaussianDistribution($mean, sqrt($variance));
 | 
			
		||||
        $this->createVariableToMessageBinding($variable,
 | 
			
		||||
                                               new Message(
 | 
			
		||||
                                                   GaussianDistribution::fromPrecisionMean(0, 0),
 | 
			
		||||
        $newMessage = new Message(GaussianDistribution::fromPrecisionMean(0, 0),
 | 
			
		||||
                                                       "message from {0} to {1}",
 | 
			
		||||
                                                   $this, variable));
 | 
			
		||||
                                                   $this, $variable);
 | 
			
		||||
 | 
			
		||||
        $this->createVariableToMessageBindingWithMessage($variable, $newMessage);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected function updateMessageVariable(Message &$message, Variable &$variable)
 | 
			
		||||
 
 | 
			
		||||
@@ -35,11 +35,12 @@ class PlayerPriorValuesToSkillsLayer extends TrueSkillFactorGraphLayer
 | 
			
		||||
            {
 | 
			
		||||
                $currentTeamPlayerRating = $currentTeam->getRating($currentTeamPlayer);
 | 
			
		||||
                $playerSkill = $this->createSkillOutputVariable($currentTeamPlayer);
 | 
			
		||||
                $this->addLayerFactor($this->createPriorFactor($currentTeamPlayer, $currentTeamPlayerRating, $playerSkill));
 | 
			
		||||
                $priorFactor = $this->createPriorFactor($currentTeamPlayer, $currentTeamPlayerRating, $playerSkill);
 | 
			
		||||
                $this->addLayerFactor($priorFactor);
 | 
			
		||||
                $currentTeamSkills[] = $playerSkill;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $outputVariablesGroups = $this->getOutputVariablesGroups();
 | 
			
		||||
            $outputVariablesGroups = &$this->getOutputVariablesGroups();
 | 
			
		||||
            $outputVariablesGroups[] = $currentTeamSkills;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -52,7 +52,7 @@ class PlayerSkillsToPerformancesLayer extends TrueSkillFactorGraphLayer
 | 
			
		||||
                array_map(
 | 
			
		||||
                        function($likelihood)
 | 
			
		||||
                        {
 | 
			
		||||
                            return $this->scheduleStep("Skill to Perf step", $likelihood, 0);
 | 
			
		||||
                            return new ScheduleStep("Skill to Perf step", $likelihood, 0);
 | 
			
		||||
                        },
 | 
			
		||||
                        $this->getLocalFactors()),
 | 
			
		||||
                "All skill to performance sending");
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,7 @@ require_once(dirname(__FILE__) . '/Layers/PlayerSkillsToPerformancesLayer.php');
 | 
			
		||||
require_once(dirname(__FILE__) . '/Layers/TeamDifferencesComparisonLayer.php');
 | 
			
		||||
require_once(dirname(__FILE__) . '/Layers/TeamPerformancesToTeamPerformanceDifferencesLayer.php');
 | 
			
		||||
 | 
			
		||||
use Moserware\Numerics\GaussianDistribution;
 | 
			
		||||
use Moserware\Skills\GameInfo;
 | 
			
		||||
use Moserware\Skills\Rating;
 | 
			
		||||
use Moserware\Skills\FactorGraphs\FactorGraph;
 | 
			
		||||
@@ -32,8 +33,7 @@ class TrueSkillFactorGraph extends FactorGraph
 | 
			
		||||
{
 | 
			
		||||
    private $_gameInfo;
 | 
			
		||||
    private $_layers;
 | 
			
		||||
    private $_priorLayer;
 | 
			
		||||
    private $_variableFactory;
 | 
			
		||||
    private $_priorLayer;    
 | 
			
		||||
 | 
			
		||||
    public function __construct(GameInfo &$gameInfo, &$teams, array $teamRanks)
 | 
			
		||||
    {
 | 
			
		||||
@@ -44,8 +44,8 @@ class TrueSkillFactorGraph extends FactorGraph
 | 
			
		||||
                                        {
 | 
			
		||||
                                            return GaussianDistribution::fromPrecisionMean(0, 0);
 | 
			
		||||
                                        });
 | 
			
		||||
                                        
 | 
			
		||||
        $this->setVariableFactory($newFactory);
 | 
			
		||||
 | 
			
		||||
        $this->_layers = array(
 | 
			
		||||
                              $this->_priorLayer,
 | 
			
		||||
                              new PlayerSkillsToPerformancesLayer($this),
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user