mirror of
https://github.com/furyfire/trueskill.git
synced 2025-01-16 09:57:40 +00:00
63 lines
2.5 KiB
C#
63 lines
2.5 KiB
C#
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using Moserware.Numerics;
|
|||
|
using Moserware.Skills.FactorGraphs;
|
|||
|
using Moserware.Skills.TrueSkill.Factors;
|
|||
|
|
|||
|
namespace Moserware.Skills.TrueSkill.Layers
|
|||
|
{
|
|||
|
// We intentionally have no Posterior schedule since the only purpose here is to
|
|||
|
internal class PlayerPriorValuesToSkillsLayer<TPlayer> :
|
|||
|
TrueSkillFactorGraphLayer
|
|||
|
<TPlayer, DefaultVariable<GaussianDistribution>, GaussianPriorFactor,
|
|||
|
KeyedVariable<TPlayer, GaussianDistribution>>
|
|||
|
{
|
|||
|
private readonly IEnumerable<IDictionary<TPlayer, Rating>> _Teams;
|
|||
|
|
|||
|
public PlayerPriorValuesToSkillsLayer(TrueSkillFactorGraph<TPlayer> parentGraph,
|
|||
|
IEnumerable<IDictionary<TPlayer, Rating>> teams)
|
|||
|
: base(parentGraph)
|
|||
|
{
|
|||
|
_Teams = teams;
|
|||
|
}
|
|||
|
|
|||
|
public override void BuildLayer()
|
|||
|
{
|
|||
|
foreach (var currentTeam in _Teams)
|
|||
|
{
|
|||
|
var currentTeamSkills = new List<KeyedVariable<TPlayer, GaussianDistribution>>();
|
|||
|
|
|||
|
foreach (var currentTeamPlayer in currentTeam)
|
|||
|
{
|
|||
|
KeyedVariable<TPlayer, GaussianDistribution> playerSkill =
|
|||
|
CreateSkillOutputVariable(currentTeamPlayer.Key);
|
|||
|
AddLayerFactor(CreatePriorFactor(currentTeamPlayer.Key, currentTeamPlayer.Value, playerSkill));
|
|||
|
currentTeamSkills.Add(playerSkill);
|
|||
|
}
|
|||
|
|
|||
|
OutputVariablesGroups.Add(currentTeamSkills);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override Schedule<GaussianDistribution> CreatePriorSchedule()
|
|||
|
{
|
|||
|
return ScheduleSequence(
|
|||
|
from prior in LocalFactors
|
|||
|
select new ScheduleStep<GaussianDistribution>("Prior to Skill Step", prior, 0),
|
|||
|
"All priors");
|
|||
|
}
|
|||
|
|
|||
|
private GaussianPriorFactor CreatePriorFactor(TPlayer player, Rating priorRating,
|
|||
|
Variable<GaussianDistribution> skillsVariable)
|
|||
|
{
|
|||
|
return new GaussianPriorFactor(priorRating.Mean,
|
|||
|
Square(priorRating.StandardDeviation) +
|
|||
|
Square(ParentFactorGraph.GameInfo.DynamicsFactor), skillsVariable);
|
|||
|
}
|
|||
|
|
|||
|
private KeyedVariable<TPlayer, GaussianDistribution> CreateSkillOutputVariable(TPlayer key)
|
|||
|
{
|
|||
|
return ParentFactorGraph.VariableFactory.CreateKeyedVariable(key, "{0}'s skill", key);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|