getInputVariablesGroups(); foreach ($inputVariablesGroups as $currentTeam) { $localCurrentTeam = $currentTeam; $teamPerformance = $this->createOutputVariable($localCurrentTeam); $newSumFactor = $this->createPlayerToTeamSumFactor($localCurrentTeam, $teamPerformance); $this->addLayerFactor($newSumFactor); // REVIEW: Does it make sense to have groups of one? $outputVariablesGroups = &$this->getOutputVariablesGroups(); $outputVariablesGroups[] = array($teamPerformance); } } public function createPriorSchedule() { $localFactors = $this->getLocalFactors(); $sequence = $this->scheduleSequence( array_map( function ($weightedSumFactor) { return new ScheduleStep("Perf to Team Perf Step", $weightedSumFactor, 0); }, $localFactors), "all player perf to team perf schedule"); return $sequence; } protected function createPlayerToTeamSumFactor($teamMembers, $sumVariable) { $weights = array_map( function ($v) { $player = $v->getKey(); return PartialPlay::getPartialPlayPercentage($player); }, $teamMembers); return new GaussianWeightedSumFactor( $sumVariable, $teamMembers, $weights); } public function createPosteriorSchedule() { $allFactors = array(); $localFactors = $this->getLocalFactors(); foreach ($localFactors as $currentFactor) { $localCurrentFactor = $currentFactor; $numberOfMessages = $localCurrentFactor->getNumberOfMessages(); for ($currentIteration = 1; $currentIteration < $numberOfMessages; $currentIteration++) { $allFactors[] = new ScheduleStep("team sum perf @" . $currentIteration, $localCurrentFactor, $currentIteration); } } return $this->scheduleSequence($allFactors, "all of the team's sum iterations"); } private function createOutputVariable($team) { $memberNames = array_map(function ($currentPlayer) { return (string)($currentPlayer->getKey()); }, $team); $teamMemberNames = \join(", ", $memberNames); $outputVariable = $this->getParentFactorGraph()->getVariableFactory()->createBasicVariable("Team[" . $teamMemberNames . "]'s performance"); return $outputVariable; } }