Development Class Java

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