protected function updateMessageVariable(Message $message, Variable $variable) { $oldMarginal = clone $variable->getValue(); $oldMessage = clone $message->getValue(); $messageFromVar = GaussianDistribution::divide($oldMarginal, $oldMessage); $c = $messageFromVar->getPrecision(); $d = $messageFromVar->getPrecisionMean(); $sqrtC = sqrt($c); $dOnSqrtC = $d / $sqrtC; $epsilsonTimesSqrtC = $this->_epsilon * $sqrtC; $d = $messageFromVar->getPrecisionMean(); $denom = 1.0 - TruncatedGaussianCorrectionFunctions::wExceedsMargin($dOnSqrtC, $epsilsonTimesSqrtC); $newPrecision = $c / $denom; $newPrecisionMean = ($d + $sqrtC * TruncatedGaussianCorrectionFunctions::vExceedsMargin($dOnSqrtC, $epsilsonTimesSqrtC)) / $denom; $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); }