Sums an array of numbers log(x1)...log(xn) : Array « Collections Data Structure « Java

Sums an array of numbers log(x1)...log(xn)

/* Copyright (C) 2003 Univ. of Massachusetts Amherst, Computer Science Dept.
   This file is part of "MALLET" (MAchine Learning for LanguagE Toolkit).
   This software is provided under the terms of the Common Public License,
   version 1.0, as published by  For further
   information, see the file `LICENSE' included with this distribution. */

//package cc.mallet.util;

 * @author <a href="">Charles Sutton</a>
 * @version $Id:,v 1.1 2007/10/22 21:37:40 mccallum Exp $
public class Util {
    private static final double LOGTOLERANCE = 30.0;
     * Sums an array of numbers log(x1)...log(xn).  This saves some of
     *  the unnecessary calls to Math.log in the two-argument version.
     * <p>
     * Note that this implementation IGNORES elements of the input
     *  array that are more than LOGTOLERANCE (currently 30.0) less
     *  than the maximum element.
     * <p>
     * Cursory testing makes me wonder if this is actually much faster than
     *  repeated use of the 2-argument version, however -cas.
     * @param vals An array log(x1), log(x2), ..., log(xn)
     * @return log(x1+x2+...+xn)
    public static double sumLogProb (double[] vals)
      double max = Double.NEGATIVE_INFINITY;
      int len = vals.length;
      int maxidx = 0;

      for (int i = 0; i < len; i++) {
        if (vals[i] > max) {
          max = vals[i];
          maxidx = i;

      boolean anyAdded = false;
      double intermediate = 0.0;
      double cutoff = max - LOGTOLERANCE;

      for (int i = 0; i < maxidx; i++) {
        if (vals[i] >= cutoff) {
          anyAdded = true;
          intermediate += Math.exp(vals[i] - max);
      for (int i = maxidx + 1; i < len; i++) {
        if (vals[i] >= cutoff) {
          anyAdded = true;
          intermediate += Math.exp(vals[i] - max);

      if (anyAdded) {
        return max + Math.log(1.0 + intermediate);
      } else {
        return max;



Related examples in the same category

1.Initialize a static array
2.Initialization and re-assignment of arraysInitialization and re-assignment of arrays
3.Doubling the size of an arrayDoubling the size of an array
4.Timing array loop performance
5.Array 2DArray 2D
6.Can you change the .length of an array
7.Show Two-Dimensional Array of Objects
8.ArrayListDemo done over using an ArrayList
9.Array Hunt game
10.Multi Dimension Array
11.Clone Array
12.Associates keys with valuesAssociates keys with values
13.Arrays of primitives
14.Creating arrays with new
15.Array initialization
16.Creating an array of nonprimitive objects
17.Create multidimension arraysCreate multidimension arrays
18.Initializing Array ValuesInitializing Array Values
19.Creating a Two-Dimensional Array
20.Initializing a Two Dimensional ArrayInitializing a Two Dimensional Array
21.Using the length VariableUsing the length Variable
22.Triangular array
23.Grow arrayGrow array
24.Define array for class Define array for class
25.String array and output to consoleString array and output to console
26.Multiply two matrices
27.Array Of Arrays Demo 2Array Of Arrays Demo 2
28.Array Copy DemoArray Copy Demo
29.Copying Elements from One Array to Another
30.Java program to demonstrate multidimensional arraysJava program to demonstrate multidimensional arrays
31.Extend the size of an array
32.Copy an array
33.Initialize multidimensional array
34.Get array upperbound
35.To get the number of dimensions
36.Resize an array, System.arraycopy()
37.Dump array content: Convert the array to a List and then convert to String provides ways to dump the content of an array.
39.Dump multi-dimensional arrays
40.Use the new shorthand notation to iterate through an array
41.Create a repeated sequence of character
42.Reverse array elements order
43.Convert array of primitives into array of objects
44.Array Initializers
45.Reinitializes a byte array
46.Reinitializes an int array
47.Sum all elements in the array
48.A class to iterate over all permutations of an array.
49.Palidrome Array
50.Set of utilities used to manipulate arrays.
51.ArrayUtils provides static methods for manipulating arrays when using a tool such as java.util.ArrayList is inconvenient.
52.Array Util
53.clone two dimensional array