2010-09-18 11:11:44 -04:00
|
|
|
<?php
|
|
|
|
namespace Moserware\Skills\FactorGraphs;
|
|
|
|
|
2010-09-25 10:15:51 -04:00
|
|
|
require_once(dirname(__FILE__) . "/../Guard.php");
|
|
|
|
require_once(dirname(__FILE__) . "/../HashMap.php");
|
|
|
|
require_once(dirname(__FILE__) . "/Message.php");
|
|
|
|
require_once(dirname(__FILE__) . "/Variable.php");
|
2010-09-18 11:11:44 -04:00
|
|
|
|
|
|
|
use Moserware\Skills\Guard;
|
|
|
|
use Moserware\Skills\HashMap;
|
|
|
|
|
2010-09-23 22:14:56 -04:00
|
|
|
abstract class Factor
|
2010-09-18 11:11:44 -04:00
|
|
|
{
|
|
|
|
private $_messages = array();
|
|
|
|
private $_messageToVariableBinding;
|
|
|
|
|
|
|
|
private $_name;
|
|
|
|
private $_variables = array();
|
|
|
|
|
|
|
|
protected function __construct($name)
|
|
|
|
{
|
|
|
|
$this->_name = "Factor[" . $name . "]";
|
2010-09-25 18:25:56 -04:00
|
|
|
$this->_messageToVariableBinding = new HashMap();
|
2010-09-18 11:11:44 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns the log-normalization constant of that factor
|
|
|
|
public function getLogNormalization()
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns the number of messages that the factor has
|
|
|
|
public function getNumberOfMessages()
|
|
|
|
{
|
|
|
|
return count($this->_messages);
|
|
|
|
}
|
|
|
|
|
2010-09-25 15:46:23 -04:00
|
|
|
protected function &getVariables()
|
2010-09-18 11:11:44 -04:00
|
|
|
{
|
|
|
|
return $this->_variables;
|
|
|
|
}
|
|
|
|
|
2010-09-25 15:46:23 -04:00
|
|
|
protected function &getMessages()
|
2010-09-18 11:11:44 -04:00
|
|
|
{
|
|
|
|
return $this->_messages;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Update the message and marginal of the i-th variable that the factor is connected to
|
|
|
|
public function updateMessageIndex($messageIndex)
|
|
|
|
{
|
|
|
|
Guard::argumentIsValidIndex($messageIndex, count($this->_messages), "messageIndex");
|
2010-09-30 07:07:05 -04:00
|
|
|
$message = &$this->_messages[$messageIndex];
|
2010-09-30 08:25:31 -04:00
|
|
|
$variable = &$this->_messageToVariableBinding->getValue($message);
|
2010-09-28 08:12:06 -04:00
|
|
|
return $this->updateMessageVariable($message, $variable);
|
2010-09-18 11:11:44 -04:00
|
|
|
}
|
|
|
|
|
2010-09-25 10:15:51 -04:00
|
|
|
protected function updateMessageVariable(Message $message, Variable $variable)
|
2010-09-18 11:11:44 -04:00
|
|
|
{
|
|
|
|
throw new Exception();
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Resets the marginal of the variables a factor is connected to
|
|
|
|
public function resetMarginals()
|
|
|
|
{
|
2010-09-30 08:25:31 -04:00
|
|
|
$allValues = &$this->_messageToVariableBinding->getAllValues();
|
2010-10-02 14:17:48 -04:00
|
|
|
foreach ($allValues as &$currentVariable)
|
2010-09-18 11:11:44 -04:00
|
|
|
{
|
|
|
|
$currentVariable->resetToPrior();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Sends the ith message to the marginal and returns the log-normalization constant
|
|
|
|
public function sendMessageIndex($messageIndex)
|
|
|
|
{
|
2010-09-28 08:12:06 -04:00
|
|
|
Guard::argumentIsValidIndex($messageIndex, count($this->_messages), "messageIndex");
|
2010-09-18 11:11:44 -04:00
|
|
|
|
2010-09-30 08:25:31 -04:00
|
|
|
$message = &$this->_messages[$messageIndex];
|
|
|
|
$variable = &$this->_messageToVariableBinding->getValue($message);
|
2010-09-18 11:11:44 -04:00
|
|
|
return $this->sendMessageVariable($message, $variable);
|
|
|
|
}
|
|
|
|
|
2010-09-25 15:46:23 -04:00
|
|
|
protected abstract function sendMessageVariable(Message &$message, Variable &$variable);
|
2010-09-18 11:11:44 -04:00
|
|
|
|
2010-09-30 08:25:31 -04:00
|
|
|
public abstract function &createVariableToMessageBinding(Variable &$variable);
|
2010-09-18 11:11:44 -04:00
|
|
|
|
2010-09-30 08:25:31 -04:00
|
|
|
protected function &createVariableToMessageBindingWithMessage(Variable &$variable, Message &$message)
|
2010-09-18 11:11:44 -04:00
|
|
|
{
|
|
|
|
$index = count($this->_messages);
|
2010-09-30 08:25:31 -04:00
|
|
|
$this->_messages[] = &$message;
|
2010-09-23 22:14:56 -04:00
|
|
|
$this->_messageToVariableBinding->setValue($message, $variable);
|
2010-09-30 08:25:31 -04:00
|
|
|
$this->_variables[] = &$variable;
|
2010-09-18 11:11:44 -04:00
|
|
|
return $message;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function __toString()
|
|
|
|
{
|
|
|
|
return ($this->_name != null) ? $this->_name : base::__toString();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
?>
|