public void UpdateLogProbability(int index)
{
if (this.IsLeaf(index))
{
this.Nodes[index].LogProbability = this.Nodes[index].LogKt;
}
else
{
double logChildProbability = 0;
int lchild = this.Nodes[index].Child1 ;
if (lchild != -1) {
logChildProbability += this.Nodes[lchild].LogProbability;
}
int rchild = this.Nodes[index].Child0;
if (rchild != -1)
{
logChildProbability += this.Nodes[rchild].LogProbability;
}
//for better numerical results
double a = Math.Max(this.Nodes[index].LogKt, logChildProbability);
double b = Math.Min(this.Nodes[index].LogKt, logChildProbability);
this.Nodes[index].LogProbability = Math.Log(0.5) + a + Utils.Log1P(Math.Exp(b - a));
//todo: is it fast enough to compute Math.Log(0.5) every time. Joel has it cached.
}
}