using Moserware.Numerics; using Moserware.Skills.FactorGraphs; using Moserware.Skills.TrueSkill.Factors; namespace Moserware.Skills.TrueSkill.Layers { internal class TeamPerformancesToTeamPerformanceDifferencesLayer : TrueSkillFactorGraphLayer , GaussianWeightedSumFactor, Variable> { public TeamPerformancesToTeamPerformanceDifferencesLayer(TrueSkillFactorGraph parentGraph) : base(parentGraph) { } public override void BuildLayer() { for (int i = 0; i < InputVariablesGroups.Count - 1; i++) { Variable strongerTeam = InputVariablesGroups[i][0]; Variable weakerTeam = InputVariablesGroups[i + 1][0]; Variable currentDifference = CreateOutputVariable(); AddLayerFactor(CreateTeamPerformanceToDifferenceFactor(strongerTeam, weakerTeam, currentDifference)); // REVIEW: Does it make sense to have groups of one? OutputVariablesGroups.Add(new[] {currentDifference}); } } private GaussianWeightedSumFactor CreateTeamPerformanceToDifferenceFactor( Variable strongerTeam, Variable weakerTeam, Variable output) { return new GaussianWeightedSumFactor(output, new[] {strongerTeam, weakerTeam}, new[] {1.0, -1.0}); } private Variable CreateOutputVariable() { return ParentFactorGraph.VariableFactory.CreateBasicVariable("Team performance difference"); } } }