using Moserware.Numerics; using Moserware.Skills.FactorGraphs; namespace Moserware.Skills.TrueSkill.Factors { public abstract class GaussianFactor : Factor { protected GaussianFactor(string name) : base(name) { } /// Sends the factor-graph message with and returns the log-normalization constant protected override double SendMessage(Message message, Variable variable) { GaussianDistribution marginal = variable.Value; GaussianDistribution messageValue = message.Value; double logZ = GaussianDistribution.LogProductNormalization(marginal, messageValue); variable.Value = marginal*messageValue; return logZ; } public override Message CreateVariableToMessageBinding( Variable variable) { return CreateVariableToMessageBinding(variable, new Message( GaussianDistribution.FromPrecisionMean(0, 0), "message from {0} to {1}", this, variable)); } } }