package edu.berkeley.nlp.math; public class LogAdder { boolean inited = false; double sum; boolean superSloppy; public LogAdder(boolean superSloppy) { super(); this.superSloppy = superSloppy; } public LogAdder() { this(false); } public void logAdd(double logProb) { if (inited) { sum = sloppyLogAdd(sum, logProb); // sum += logProb; } else { inited = true; sum = logProb; } } public double sloppyLogAdd(double lx, double ly) { double max, negDiff; if (lx > ly) { max = lx; negDiff = ly - lx; } else { max = ly; negDiff = lx - ly; } if (max == Double.NEGATIVE_INFINITY) { return max; } else if (negDiff < -SloppyMath.LOGTOLERANCE) { return max; } else { if (superSloppy) { return max + SloppyMath.approxLog(1.0 + SloppyMath.approxExp(negDiff)); } return max + Math.log(1.0 + Math.exp(negDiff)); } } public double getSum() { return inited ? sum : Double.NEGATIVE_INFINITY; } }