/** * 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); }
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); }