From c22683ab33fa36790d04732a30fcff530d6f9fc2 Mon Sep 17 00:00:00 2001 From: Jeff Moser Date: Sat, 2 Oct 2010 14:17:48 -0400 Subject: [PATCH] Fixed an array size issue because of ignored 0 value --- PHPSkills/FactorGraphs/Factor.php | 2 +- PHPSkills/FactorGraphs/Schedule.php | 3 ++- .../Factors/GaussianWeightedSumFactor.php | 21 +++++++++---------- .../IteratedTeamDifferencesInnerLayer.php | 7 +++++-- ...yerPerformancesToTeamPerformancesLayer.php | 5 +++-- .../PlayerSkillsToPerformancesLayer.php | 5 +++-- PHPSkills/TrueSkill/TrueSkillFactorGraph.php | 2 +- 7 files changed, 25 insertions(+), 20 deletions(-) diff --git a/PHPSkills/FactorGraphs/Factor.php b/PHPSkills/FactorGraphs/Factor.php index f7e3157..0ca2e46 100644 --- a/PHPSkills/FactorGraphs/Factor.php +++ b/PHPSkills/FactorGraphs/Factor.php @@ -63,7 +63,7 @@ abstract class Factor public function resetMarginals() { $allValues = &$this->_messageToVariableBinding->getAllValues(); - foreach ($allValues as $currentVariable) + foreach ($allValues as &$currentVariable) { $currentVariable->resetToPrior(); } diff --git a/PHPSkills/FactorGraphs/Schedule.php b/PHPSkills/FactorGraphs/Schedule.php index a144ef8..34157d1 100644 --- a/PHPSkills/FactorGraphs/Schedule.php +++ b/PHPSkills/FactorGraphs/Schedule.php @@ -56,7 +56,8 @@ class ScheduleSequence extends Schedule $schedules = &$this->_schedules; foreach ($schedules as &$currentSchedule) { - $maxDelta = max($currentSchedule->visit($depth + 1, $maxDepth), $maxDelta); + $currentVisit = $currentSchedule->visit($depth + 1, $maxDepth); + $maxDelta = max($currentVisit, $maxDelta); } return $maxDelta; diff --git a/PHPSkills/TrueSkill/Factors/GaussianWeightedSumFactor.php b/PHPSkills/TrueSkill/Factors/GaussianWeightedSumFactor.php index d4921b8..62cd7ea 100644 --- a/PHPSkills/TrueSkill/Factors/GaussianWeightedSumFactor.php +++ b/PHPSkills/TrueSkill/Factors/GaussianWeightedSumFactor.php @@ -34,10 +34,9 @@ class GaussianWeightedSumFactor extends GaussianFactor // The first weights are a straightforward copy // v_0 = a_1*v_1 + a_2*v_2 + ... + a_n * v_n - $this->_weights[0] = array(); - $variableWeightsLength = count($variableWeights); - + $this->_weights[0] = \array_fill(0, count($variableWeights), 0); + for($i = 0; $i < $variableWeightsLength; $i++) { $weight = &$variableWeights[$i]; @@ -53,7 +52,9 @@ class GaussianWeightedSumFactor extends GaussianFactor { $this->_variableIndexOrdersForWeights[0][] = $i; } - + + $variableWeightsLength = count($variableWeights); + // The rest move the variables around and divide out the constant. // For example: // v_1 = (-a_2 / a_1) * v_2 + (-a3/a1) * v_3 + ... + (1.0 / a_1) * v_0 @@ -61,19 +62,17 @@ class GaussianWeightedSumFactor extends GaussianFactor $weightsLength = $variableWeightsLength + 1; for ($weightsIndex = 1; $weightsIndex < $weightsLength; $weightsIndex++) - { - $currentWeights = array(); + { + $currentWeights = \array_fill(0, $variableWeightsLength, 0); - $variableIndices = array(); + $variableIndices = \array_fill(0, $variableWeightsLength + 1, 0); $variableIndices[0] = $weightsIndex; - $currentWeightsSquared = array(); + $currentWeightsSquared = \array_fill(0, $variableWeightsLength, 0); // 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; - - $variableWeightsLength = count($variableWeights); + $currentDestinationWeightIndex = 0; for ($currentWeightSourceIndex = 0; $currentWeightSourceIndex < $variableWeightsLength; diff --git a/PHPSkills/TrueSkill/Layers/IteratedTeamDifferencesInnerLayer.php b/PHPSkills/TrueSkill/Layers/IteratedTeamDifferencesInnerLayer.php index 15ffc22..49eb424 100644 --- a/PHPSkills/TrueSkill/Layers/IteratedTeamDifferencesInnerLayer.php +++ b/PHPSkills/TrueSkill/Layers/IteratedTeamDifferencesInnerLayer.php @@ -59,16 +59,19 @@ class IteratedTeamDifferencesInnerLayer extends TrueSkillFactorGraphLayer $totalTeams = $totalTeamDifferences + 1; $localFactors = &$this->_TeamPerformancesToTeamPerformanceDifferencesLayer->getLocalFactors(); + + $firstDifferencesFactor = &$localFactors[0]; + $lastDifferencesFactor = &$localFactors[$totalTeamDifferences - 1]; $innerSchedule = new ScheduleSequence( "inner schedule", array( $loop, new ScheduleStep( "teamPerformanceToPerformanceDifferenceFactors[0] @ 1", - &$localFactors[0], 1), + $firstDifferencesFactor, 1), new ScheduleStep( sprintf("teamPerformanceToPerformanceDifferenceFactors[teamTeamDifferences = %d - 1] @ 2", $totalTeamDifferences), - &$localFactors[$totalTeamDifferences - 1], 2) + $lastDifferencesFactor, 2) ) ); diff --git a/PHPSkills/TrueSkill/Layers/PlayerPerformancesToTeamPerformancesLayer.php b/PHPSkills/TrueSkill/Layers/PlayerPerformancesToTeamPerformancesLayer.php index 90c8fb0..b2757ed 100644 --- a/PHPSkills/TrueSkill/Layers/PlayerPerformancesToTeamPerformancesLayer.php +++ b/PHPSkills/TrueSkill/Layers/PlayerPerformancesToTeamPerformancesLayer.php @@ -25,9 +25,10 @@ class PlayerPerformancesToTeamPerformancesLayer extends TrueSkillFactorGraphLaye public function buildLayer() { - foreach ($this->getInputVariablesGroups() as $currentTeam) + $inputVariablesGroups = &$this->getInputVariablesGroups(); + foreach ($inputVariablesGroups as &$currentTeam) { - $teamPerformance = $this->createOutputVariable($currentTeam); + $teamPerformance = &$this->createOutputVariable($currentTeam); $newSumFactor = $this->createPlayerToTeamSumFactor($currentTeam, $teamPerformance); $this->addLayerFactor($newSumFactor); diff --git a/PHPSkills/TrueSkill/Layers/PlayerSkillsToPerformancesLayer.php b/PHPSkills/TrueSkill/Layers/PlayerSkillsToPerformancesLayer.php index 19adef9..8497e55 100644 --- a/PHPSkills/TrueSkill/Layers/PlayerSkillsToPerformancesLayer.php +++ b/PHPSkills/TrueSkill/Layers/PlayerSkillsToPerformancesLayer.php @@ -29,9 +29,10 @@ class PlayerSkillsToPerformancesLayer extends TrueSkillFactorGraphLayer { $currentTeamPlayerPerformances = array(); - foreach ($currentTeam as $playerSkillVariable) + foreach ($currentTeam as &$playerSkillVariable) { - $playerPerformance = $this->createOutputVariable($playerSkillVariable->getKey()); + $currentPlayer = &$playerSkillVariable->getKey(); + $playerPerformance = $this->createOutputVariable($currentPlayer); $newLikelihoodFactor = $this->createLikelihood($playerSkillVariable, $playerPerformance); $this->addLayerFactor($newLikelihoodFactor); $currentTeamPlayerPerformances[] = $playerPerformance; diff --git a/PHPSkills/TrueSkill/TrueSkillFactorGraph.php b/PHPSkills/TrueSkill/TrueSkillFactorGraph.php index b000ef0..88f7340 100644 --- a/PHPSkills/TrueSkill/TrueSkillFactorGraph.php +++ b/PHPSkills/TrueSkill/TrueSkillFactorGraph.php @@ -78,7 +78,7 @@ class TrueSkillFactorGraph extends FactorGraph $currentLayer->buildLayer(); - $lastOutput = &$currentLayer->getOutputVariablesGroups(); + $lastOutput = &$currentLayer->getOutputVariablesGroups(); } }