/* Copyright (C) 2003 Univ. of Massachusetts Amherst, Computer Science Dept.
This file is part of "MALLET" (MAchine Learning for LanguagE Toolkit).
http://www.cs.umass.edu/~mccallum/mallet
This software is provided under the terms of the Common Public License,
version 1.0, as published by http://www.opensource.org. For further
information, see the file `LICENSE' included with this distribution. */
//package cc.mallet.util;
/**
*
*
* @author Charles Sutton
* @version $Id: ArrayUtils.java,v 1.1 2007/10/22 21:37:40 mccallum Exp $
*/
public class Util {
/**
* Returns the sum of two doubles expressed in log space,
* that is,
*
* sumLogProb = log (e^a + e^b)
* = log e^a(1 + e^(b-a))
* = a + log (1 + e^(b-a))
*
*
* By exponentiating b-a, we obtain better numerical precision than
* we would if we calculated e^a or e^b directly.
*
* Note: This function is just like
* {@link cc.mallet.fst.Transducer#sumNegLogProb sumNegLogProb}
* in Transducer,
* except that the logs aren't negated.
*/
public static double sumLogProb (double a, double b)
{
if (a == Double.NEGATIVE_INFINITY)
return b;
else if (b == Double.NEGATIVE_INFINITY)
return a;
else if (b < a)
return a + Math.log (1 + Math.exp(b-a));
else
return b + Math.log (1 + Math.exp(a-b));
}
}