def _updateHelper(self, weights, weightsSquared, messages, variables): message0 = deepcopy(messages[0].value) marginal0 = deepcopy(variables[0].value) inverseOfNewPrecisionSum = Decimal(0.0) anotherInverseOfNewPrecisionSum = Decimal(0.0) weightedMeanSum = Decimal(0.0) anotherWeightedMeanSum = Decimal(0.0) for i in range(len(weightsSquared)): inverseOfNewPrecisionSum += Decimal(weightsSquared[i])/(variables[i + 1].value.precision - messages[i + 1].value.precision) diff = (variables[i + 1].value/messages[i + 1].value) anotherInverseOfNewPrecisionSum += Decimal(weightsSquared[i])/diff.precision weightedMeanSum += Decimal(weights[i]) * (variables[i + 1].value.precisionMean - messages[i + 1].value.precisionMean) / (variables[i + 1].value.precision - messages[i + 1].value.precision) anotherWeightedMeanSum += Decimal(weights[i]) * diff.precisionMean/diff.precision newPrecision = Decimal(1.0)/inverseOfNewPrecisionSum newPrecisionMean = newPrecision*weightedMeanSum newMessage = fromPrecisionMean(newPrecisionMean, newPrecision) oldMarginalWithoutMessage = marginal0/message0 newMarginal = oldMarginalWithoutMessage*newMessage messages[0].value = newMessage variables[0].value = newMarginal return newMarginal - marginal0
def _updateMessageInternal(self, message, variable): oldMarginal = deepcopy(variable.value) oldMessage = message newMarginal = fromPrecisionMean(oldMarginal.precisionMean + self._newMessage.precisionMean - oldMessage.value.precisionMean, oldMarginal.precision + self._newMessage.precision - oldMessage.value.precision) variable.value = newMarginal message.value = self._newMessage return oldMarginal - newMarginal
def partialUpdate(prior, fullPosterior, updatePercentage): priorGaussian = fromRating(prior) posteriorGaussian = fromRating(fullPosterior) precisionMeanDifference = posteriorGaussian.precisionMean - priorGaussian.precisionMean partialPrecisionMeanDifference = updatePercentage*precisionMeanDifference partialPosteriorGaussian = fromPrecisionMean(priorGaussian.precisionMean + partialPrecisionMeanDifference, priorGaussian.precision + partialPrecisionMeanDifference) return Rating(partialPosteriorGaussian.mean, partialPosteriorGaussian.standardDeviation, prior.conservativeStandardDeviationMultiplier)
def __init__(self, gameInfo, teams, teamRanks): self._priorLayer = PlayerPriorValuesToSkillsLayer(self, teams) self._gameInfo = gameInfo self._variableFactory = VariableFactory(lambda: fromPrecisionMean(0, 0)) self._layers = [self._priorLayer, PlayerSkillsToPerformancesLayer(self), PlayerPerformancesToTeamPerformancesLayer(self), IteratedTeamDifferencesInnerLayer( self, TeamPerformancesToTeamPerformancesDifferencesLayer(self), TeamDifferencesComparisonLayer(self, teamRanks) ) ]
def _updateHelper(self, message1, message2, variable1, variable2): message1Value = deepcopy(message1.value) message2Value = deepcopy(message2.value) marginal1 = deepcopy(variable1.value) marginal2 = deepcopy(variable2.value) a = self._precision/(self._precision + marginal2.precision - message2Value.precision) newMessage = fromPrecisionMean(a * (marginal2.precisionMean - message2Value.precisionMean), a*(marginal2.precision - message2Value.precision)) oldMarginalWithoutMessage = marginal1/message1Value newMarginal = oldMarginalWithoutMessage*newMessage message1.value = newMessage variable1.value = newMarginal return newMarginal - marginal1
def _updateMessageInternal(self, message, variable): oldMarginal = deepcopy(variable.value) oldMessage = deepcopy(message.value) messageFromVar = oldMarginal/oldMessage c = messageFromVar.precision d = messageFromVar.precisionMean sqrtC = sqrt(c) dOnSqrtC = d/sqrtC epsilonTimesSqrtC = self._epsilon*sqrtC denom = 1.0 - wExceedsMargin(dOnSqrtC, epsilonTimesSqrtC) newPrecision = c/denom newPrecisionMean = (d + sqrtC*vExceedsMargin(dOnSqrtC, epsilonTimesSqrtC))/denom newMarginal = fromPrecisionMean(newPrecisionMean, newPrecision) newMessage = oldMessage*newMarginal/oldMarginal message.value = newMessage variable.value = newMarginal return newMarginal - oldMarginal
def updateMessage(self, message, variable): oldMarginal = deepcopy(variable.value) oldMessage = deepcopy(message.value) messageFromVariable = oldMarginal/oldMessage c = messageFromVariable.precision d = messageFromVariable.precisionMean sqrtC = sqrt(c) dOnSqrtC = d/sqrt(c) epsilonTimesSqrtC = self._epsilon*sqrtC denominator = 1.0 - wWithinMargin(dOnSqrtC, epsilonTimesSqrtC) newPrecision = c/denominator newPrecisionMean = (d + sqrtC * vWithinMargin(dOnSqrtC, epsilonTimesSqrtC))/denominator newMarginal = fromPrecisionMean(newPrecisionMean, newPrecision) newMessage = oldMessage*newMarginal/oldMarginal message.value = newMessage variable.value = newMarginal return newMarginal - oldMarginal
def createVariableToMessageBinding(self, variable): message = Message(fromPrecisionMean(0, 0), "message from %s to %s" % (self, variable)) return self._createVariableToMessageBindingInternal(variable, message)