<?php

namespace Moserware\Skills\TrueSkill\Factors;

require_once(dirname(__FILE__) . "/../../FactorGraphs/Factor.php");
require_once(dirname(__FILE__) . "/../../FactorGraphs/Message.php");
require_once(dirname(__FILE__) . "/../../FactorGraphs/Variable.php");
require_once(dirname(__FILE__) . "/../../Numerics/GaussianDistribution.php");

use Moserware\Numerics\GaussianDistribution;
use Moserware\Skills\FactorGraphs\Factor;
use Moserware\Skills\FactorGraphs\Message;
use Moserware\Skills\FactorGraphs\Variable;

abstract class GaussianFactor extends Factor
{
    protected function __construct($name)
    {
        parent::__construct($name);
    }

    /// Sends the factor-graph message with and returns the log-normalization constant
    protected function sendMessageVariable(Message &$message, Variable &$variable)
    {
        $marginal = &$variable->getValue();
        $messageValue = &$message->getValue();
        $logZ = GaussianDistribution::logProductNormalization($marginal, $messageValue);
        $variable->setValue($marginal*$messageValue);
        return $logZ;
    }

    public function createVariableToMessageBinding(Variable &$variable)
    {
        return parent::createVariableToMessageBindingWithMessage($variable,
                                                      new Message(
                                                          GaussianDistribution::fromPrecisionMean(0, 0),
                                                          "message from {0} to {1}", $this));
    }
}

?>