Example #1
0
 /**
  * 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(GaussianDistribution::multiply($marginal, $messageValue));
     return $logZ;
 }
 protected function updateMessageVariable(Message $message, Variable $variable)
 {
     $oldMarginal = clone $variable->getValue();
     $oldMessage = $message;
     $newMarginal = GaussianDistribution::fromPrecisionMean($oldMarginal->getPrecisionMean() + $this->_newMessage->getPrecisionMean() - $oldMessage->getValue()->getPrecisionMean(), $oldMarginal->getPrecision() + $this->_newMessage->getPrecision() - $oldMessage->getValue()->getPrecision());
     $variable->setValue($newMarginal);
     $newMessage = $this->_newMessage;
     $message->setValue($newMessage);
     return GaussianDistribution::subtract($oldMarginal, $newMarginal);
 }
 private function updateHelper(Message $message1, Message $message2, Variable $variable1, Variable $variable2)
 {
     $message1Value = clone $message1->getValue();
     $message2Value = clone $message2->getValue();
     $marginal1 = clone $variable1->getValue();
     $marginal2 = clone $variable2->getValue();
     $a = $this->_precision / ($this->_precision + $marginal2->getPrecision() - $message2Value->getPrecision());
     $newMessage = GaussianDistribution::fromPrecisionMean($a * ($marginal2->getPrecisionMean() - $message2Value->getPrecisionMean()), $a * ($marginal2->getPrecision() - $message2Value->getPrecision()));
     $oldMarginalWithoutMessage = GaussianDistribution::divide($marginal1, $message1Value);
     $newMarginal = GaussianDistribution::multiply($oldMarginalWithoutMessage, $newMessage);
     // Update the message and marginal
     $message1->setValue($newMessage);
     $variable1->setValue($newMarginal);
     // Return the difference in the new marginal
     return GaussianDistribution::subtract($newMarginal, $marginal1);
 }
Example #4
0
 protected function updateMessageVariable(Message &$message, Variable &$variable)
 {
     $oldMarginal = clone $variable->getValue();
     $oldMessage = clone $message->getValue();
     $messageFromVariable = GaussianDistribution::divide($oldMarginal, $oldMessage);
     $c = $messageFromVariable->getPrecision();
     $d = $messageFromVariable->getPrecisionMean();
     $sqrtC = sqrt($c);
     $dOnSqrtC = $d / $sqrtC;
     $epsilonTimesSqrtC = $this->_epsilon * $sqrtC;
     $d = $messageFromVariable->getPrecisionMean();
     $denominator = 1.0 - TruncatedGaussianCorrectionFunctions::wWithinMargin($dOnSqrtC, $epsilonTimesSqrtC);
     $newPrecision = $c / $denominator;
     $newPrecisionMean = ($d + $sqrtC * TruncatedGaussianCorrectionFunctions::vWithinMargin($dOnSqrtC, $epsilonTimesSqrtC)) / $denominator;
     $newMarginal = GaussianDistribution::fromPrecisionMean($newPrecisionMean, $newPrecision);
     $newMessage = GaussianDistribution::divide(GaussianDistribution::multiply($oldMessage, $newMarginal), $oldMarginal);
     // Update the message and marginal
     $message->setValue($newMessage);
     $variable->setValue($newMarginal);
     // Return the difference in the new marginal
     return GaussianDistribution::subtract($newMarginal, $oldMarginal);
 }