mirror of
				https://github.com/furyfire/trueskill.git
				synced 2025-11-04 10:12:28 +01:00 
			
		
		
		
	First test passes!
The second one... not so much ;-)
This commit is contained in:
		@@ -16,6 +16,24 @@ class Matrix
 | 
			
		||||
        $this->_matrixRowData = $matrixData;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static function fromColumnValues($rows, $columns, $columnValues)
 | 
			
		||||
    {
 | 
			
		||||
        $data = array();
 | 
			
		||||
        $result = new Matrix($rows, $columns, $data);
 | 
			
		||||
 | 
			
		||||
        for($currentColumn = 0; $currentColumn < $columns; $currentColumn++)
 | 
			
		||||
        {
 | 
			
		||||
            $currentColumnData = $columnValues[$currentColumn];
 | 
			
		||||
 | 
			
		||||
            for($currentRow = 0; $currentRow < $rows; $currentRow++)
 | 
			
		||||
            {
 | 
			
		||||
                $result->setValue($currentRow, $currentColumn, $currentColumnData[$currentRow]);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static function fromRowsColumns()
 | 
			
		||||
    {
 | 
			
		||||
        $args = \func_get_args();
 | 
			
		||||
@@ -60,6 +78,7 @@ class Matrix
 | 
			
		||||
        // Just flip everything
 | 
			
		||||
        $transposeMatrix = array();
 | 
			
		||||
 | 
			
		||||
        $rowMatrixData = $this->_matrixRowData;
 | 
			
		||||
        for ($currentRowTransposeMatrix = 0;
 | 
			
		||||
             $currentRowTransposeMatrix < $this->_columnCount;
 | 
			
		||||
             $currentRowTransposeMatrix++)
 | 
			
		||||
@@ -69,7 +88,7 @@ class Matrix
 | 
			
		||||
                 $currentColumnTransposeMatrix++)
 | 
			
		||||
            {
 | 
			
		||||
                $transposeMatrix[$currentRowTransposeMatrix][$currentColumnTransposeMatrix] =
 | 
			
		||||
                    $this->_matrixRowData[$currentColumnTransposeMatrix][$currentRowTransposeMatrix];
 | 
			
		||||
                    $rowMatrixData[$currentColumnTransposeMatrix][$currentRowTransposeMatrix];
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -92,7 +111,7 @@ class Matrix
 | 
			
		||||
        if ($this->_rowCount == 1)
 | 
			
		||||
        {
 | 
			
		||||
            // Really happy path :)
 | 
			
		||||
            return $this->_matrixRowValues[0][0];
 | 
			
		||||
            return $this->_matrixRowData[0][0];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($this->_rowCount == 2)
 | 
			
		||||
@@ -356,7 +375,12 @@ class Vector extends Matrix
 | 
			
		||||
{
 | 
			
		||||
    public function __construct(array $vectorValues)
 | 
			
		||||
    {
 | 
			
		||||
        parent::__construct(count($vectorValues), 1, array($vectorValues));
 | 
			
		||||
        $columnValues = array();
 | 
			
		||||
        foreach($vectorValues as $currentVectorValue)
 | 
			
		||||
        {
 | 
			
		||||
            $columnValues[] = array($currentVectorValue);
 | 
			
		||||
        }
 | 
			
		||||
        parent::__construct(count($vectorValues), 1, $columnValues);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -406,11 +430,7 @@ class DiagonalMatrix extends Matrix
 | 
			
		||||
                    $this->setValue($currentRow, $currentCol, 0);
 | 
			
		||||
                }                
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        for($i = 0; $i < $diagonalCount; $i++)
 | 
			
		||||
        {
 | 
			
		||||
            $this->setValue($i, $i, $diagonalValues[$i]);
 | 
			
		||||
        }        
 | 
			
		||||
        }             
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -103,11 +103,11 @@ class FactorGraphTrueSkillCalculator extends SkillCalculator
 | 
			
		||||
    private static function getPlayerMeansVector(array &$teamAssignmentsList)
 | 
			
		||||
    {
 | 
			
		||||
        // A simple vector of all the player means.
 | 
			
		||||
        return new Vector($this->getPlayerRatingValues($teamAssignmentsList,
 | 
			
		||||
                                                       function($rating) 
 | 
			
		||||
                                                       { 
 | 
			
		||||
                                                            return $rating->getMean();
 | 
			
		||||
                                                       }));
 | 
			
		||||
        return new Vector(self::getPlayerRatingValues($teamAssignmentsList,
 | 
			
		||||
                                                      function($rating) 
 | 
			
		||||
                                                      { 
 | 
			
		||||
                                                           return $rating->getMean();
 | 
			
		||||
                                                      }));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static function getPlayerCovarianceMatrix(array &$teamAssignmentsList)
 | 
			
		||||
@@ -115,11 +115,11 @@ class FactorGraphTrueSkillCalculator extends SkillCalculator
 | 
			
		||||
        // This is a square matrix whose diagonal values represent the variance (square of standard deviation) of all
 | 
			
		||||
        // players.
 | 
			
		||||
        return new DiagonalMatrix(
 | 
			
		||||
                        $this->getPlayerRatingValues($teamAssignmentsList,
 | 
			
		||||
                                                     function($rating)
 | 
			
		||||
                                                     {
 | 
			
		||||
                                                        return square($rating->getStandardDeviation());
 | 
			
		||||
                                                     }));
 | 
			
		||||
                        self::getPlayerRatingValues($teamAssignmentsList,
 | 
			
		||||
                                                    function($rating)
 | 
			
		||||
                                                    {
 | 
			
		||||
                                                       return square($rating->getStandardDeviation());
 | 
			
		||||
                                                    }));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Helper function that gets a list of values for all player ratings
 | 
			
		||||
@@ -130,7 +130,7 @@ class FactorGraphTrueSkillCalculator extends SkillCalculator
 | 
			
		||||
 | 
			
		||||
        foreach ($teamAssignmentsList as $currentTeam)
 | 
			
		||||
        {
 | 
			
		||||
            foreach (currentTeam.Values as $currentRating)
 | 
			
		||||
            foreach ($currentTeam->getAllRatings() as $currentRating)
 | 
			
		||||
            {
 | 
			
		||||
                $playerRatingValues[] = $playerRatingFunction($currentRating);
 | 
			
		||||
            }
 | 
			
		||||
@@ -139,7 +139,7 @@ class FactorGraphTrueSkillCalculator extends SkillCalculator
 | 
			
		||||
        return $playerRatingValues;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static function createPlayerTeamAssignmentMatrix(&$teamAssignmentsList, &$totalPlayers)
 | 
			
		||||
    private static function createPlayerTeamAssignmentMatrix(&$teamAssignmentsList, $totalPlayers)
 | 
			
		||||
    {
 | 
			
		||||
        // The team assignment matrix is often referred to as the "A" matrix. It's a matrix whose rows represent the players
 | 
			
		||||
        // and the columns represent teams. At Matrix[row, column] represents that player[row] is on team[col]
 | 
			
		||||
@@ -168,25 +168,26 @@ class FactorGraphTrueSkillCalculator extends SkillCalculator
 | 
			
		||||
 | 
			
		||||
            // Need to add in 0's for all the previous players, since they're not
 | 
			
		||||
            // on this team
 | 
			
		||||
            $currentRowValues = array();
 | 
			
		||||
            $playerAssignments[] = &$currentRowValues;
 | 
			
		||||
            $currentRowValues = array();            
 | 
			
		||||
 | 
			
		||||
            foreach ($currentTeam as $currentRating)
 | 
			
		||||
            foreach ($currentTeam->getAllPlayers() as $currentPlayer)
 | 
			
		||||
            {
 | 
			
		||||
                $currentRowValues[] = PartialPlay::getPartialPlayPercentage($currentRating->getKey());
 | 
			
		||||
                $currentRowValues[] = PartialPlay::getPartialPlayPercentage($currentPlayer);
 | 
			
		||||
                // indicates the player is on the team
 | 
			
		||||
                $totalPreviousPlayers++;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $nextTeam = $teamAssignmentsList[$i + 1];
 | 
			
		||||
            foreach ($nextTeam as $nextTeamPlayerPair)
 | 
			
		||||
            foreach ($nextTeam->getAllPlayers() as $nextTeamPlayer)
 | 
			
		||||
            {
 | 
			
		||||
                // Add a -1 * playing time to represent the difference
 | 
			
		||||
                $currentRowValues[] = -1 * PartialPlay::getPartialPlayPercentage($nextTeamPlayerPair->getKey());
 | 
			
		||||
                $currentRowValues[] = -1 * PartialPlay::getPartialPlayPercentage($nextTeamPlayer);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $playerAssignments[] = &$currentRowValues;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $playerTeamAssignmentsMatrix = new Matrix($totalPlayers, $teamAssignmentsListCount - 1, $playerAssignments);
 | 
			
		||||
        $playerTeamAssignmentsMatrix = Matrix::fromColumnValues($totalPlayers, $teamAssignmentsListCount - 1, $playerAssignments);
 | 
			
		||||
 | 
			
		||||
        return $playerTeamAssignmentsMatrix;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user