Author: tn Date: Fri May 4 21:42:16 2012 New Revision: 1334198 URL: http://svn.apache.org/viewvc?rev=1334198&view=rev Log: [MATH-627] avoid superfluous null checks in (Array)RealVector, thanks to Arno Ploese.
Modified: commons/proper/math/trunk/src/changes/changes.xml commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/ArrayRealVector.java commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/RealVector.java Modified: commons/proper/math/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/changes/changes.xml?rev=1334198&r1=1334197&r2=1334198&view=diff ============================================================================== --- commons/proper/math/trunk/src/changes/changes.xml (original) +++ commons/proper/math/trunk/src/changes/changes.xml Fri May 4 21:42:16 2012 @@ -52,6 +52,9 @@ If the output is not quite correct, chec <body> <release version="3.1" date="TBD" description=" "> + <action dev="tn" type="fix" issue="MATH-627" due-to="Arne Plöse"> + Avoid superfluous null check when using iterators in RealVector and ArrayRealVector. + </action> <action dev="tn" type="fix" issue="MATH-781" due-to="Scheiber ErnÅ"> Use epsilon instead of ulp in floating-point comparison when dropping columns after phase 1 in SimplexSolver. </action> Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/ArrayRealVector.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/ArrayRealVector.java?rev=1334198&r1=1334197&r2=1334198&view=diff ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/ArrayRealVector.java (original) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/ArrayRealVector.java Fri May 4 21:42:16 2012 @@ -302,8 +302,8 @@ public class ArrayRealVector extends Rea checkVectorDimensions(v); double[] out = data.clone(); Iterator<Entry> it = v.sparseIterator(); - Entry e; - while (it.hasNext() && (e = it.next()) != null) { + while (it.hasNext()) { + final Entry e = it.next(); out[e.getIndex()] += e.getValue(); } return new ArrayRealVector(out, false); @@ -327,8 +327,8 @@ public class ArrayRealVector extends Rea checkVectorDimensions(v); double[] out = data.clone(); Iterator<Entry> it = v.sparseIterator(); - Entry e; - while(it.hasNext() && (e = it.next()) != null) { + while (it.hasNext()) { + final Entry e = it.next(); out[e.getIndex()] -= e.getValue(); } return new ArrayRealVector(out, false); @@ -457,8 +457,8 @@ public class ArrayRealVector extends Rea checkVectorDimensions(v); double dot = 0; Iterator<Entry> it = v.sparseIterator(); - Entry e; - while(it.hasNext() && (e = it.next()) != null) { + while (it.hasNext()) { + final Entry e = it.next(); dot += data[e.getIndex()] * e.getValue(); } return dot; Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/RealVector.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/RealVector.java?rev=1334198&r1=1334197&r2=1334198&view=diff ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/RealVector.java (original) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/RealVector.java Fri May 4 21:42:16 2012 @@ -202,8 +202,8 @@ public abstract class RealVector { public RealVector add(RealVector v) { RealVector result = v.copy(); Iterator<Entry> it = sparseIterator(); - Entry e; - while (it.hasNext() && (e = it.next()) != null) { + while (it.hasNext()) { + final Entry e = it.next(); final int index = e.getIndex(); result.setEntry(index, e.getValue() + result.getEntry(index)); } @@ -222,8 +222,8 @@ public abstract class RealVector { public RealVector subtract(RealVector v) { RealVector result = v.copy(); Iterator<Entry> it = sparseIterator(); - Entry e; - while (it.hasNext() && (e = it.next()) != null) { + while (it.hasNext()) { + final Entry e = it.next(); final int index = e.getIndex(); result.setEntry(index, e.getValue() - result.getEntry(index)); } @@ -274,8 +274,8 @@ public abstract class RealVector { checkVectorDimensions(v); double d = 0; Iterator<Entry> it = sparseIterator(); - Entry e; - while (it.hasNext() && (e = it.next()) != null) { + while (it.hasNext()) { + final Entry e = it.next(); d += e.getValue() * v.getEntry(e.getIndex()); } return d; @@ -337,8 +337,8 @@ public abstract class RealVector { checkVectorDimensions(v); double d = 0; Iterator<Entry> it = iterator(); - Entry e; - while (it.hasNext() && (e = it.next()) != null) { + while (it.hasNext()) { + final Entry e = it.next(); final double diff = e.getValue() - v.getEntry(e.getIndex()); d += diff * diff; } @@ -358,8 +358,8 @@ public abstract class RealVector { public double getNorm() { double sum = 0; Iterator<Entry> it = sparseIterator(); - Entry e; - while (it.hasNext() && (e = it.next()) != null) { + while (it.hasNext()) { + final Entry e = it.next(); final double value = e.getValue(); sum += value * value; } @@ -379,8 +379,8 @@ public abstract class RealVector { public double getL1Norm() { double norm = 0; Iterator<Entry> it = sparseIterator(); - Entry e; - while (it.hasNext() && (e = it.next()) != null) { + while (it.hasNext()) { + final Entry e = it.next(); norm += FastMath.abs(e.getValue()); } return norm; @@ -399,8 +399,8 @@ public abstract class RealVector { public double getLInfNorm() { double norm = 0; Iterator<Entry> it = sparseIterator(); - Entry e; - while (it.hasNext() && (e = it.next()) != null) { + while (it.hasNext()) { + final Entry e = it.next(); norm = FastMath.max(norm, FastMath.abs(e.getValue())); } return norm; @@ -421,8 +421,8 @@ public abstract class RealVector { checkVectorDimensions(v); double d = 0; Iterator<Entry> it = iterator(); - Entry e; - while (it.hasNext() && (e = it.next()) != null) { + while (it.hasNext()) { + final Entry e = it.next(); d += FastMath.abs(e.getValue() - v.getEntry(e.getIndex())); } return d; @@ -446,8 +446,8 @@ public abstract class RealVector { checkVectorDimensions(v); double d = 0; Iterator<Entry> it = iterator(); - Entry e; - while (it.hasNext() && (e = it.next()) != null) { + while (it.hasNext()) { + final Entry e = it.next(); d = FastMath.max(FastMath.abs(e.getValue() - v.getEntry(e.getIndex())), d); } return d; @@ -598,11 +598,11 @@ public abstract class RealVector { v.getDimension()); } Iterator<Entry> thisIt = sparseIterator(); - Entry thisE = null; - while (thisIt.hasNext() && (thisE = thisIt.next()) != null) { + while (thisIt.hasNext()) { + final Entry thisE = thisIt.next(); Iterator<Entry> otherIt = v.sparseIterator(); - Entry otherE = null; - while (otherIt.hasNext() && (otherE = otherIt.next()) != null) { + while (otherIt.hasNext()) { + final Entry otherE = otherIt.next(); product.setEntry(thisE.getIndex(), otherE.getIndex(), thisE.getValue() * otherE.getValue()); } @@ -629,8 +629,8 @@ public abstract class RealVector { */ public void set(double value) { Iterator<Entry> it = iterator(); - Entry e = null; - while (it.hasNext() && (e = it.next()) != null) { + while (it.hasNext()) { + final Entry e = it.next(); e.setValue(value); } } @@ -684,6 +684,10 @@ public abstract class RealVector { * In dense implementations, this method will often delegate to * {@link #iterator()}. * + * <p>Note: derived classes are required to return an {@link Iterator} that + * returns non-null {@link Entry} objects as long as {@link Iterator#hasNext()} + * returns {@code true}.</p> + * * @return a sparse iterator. */ public Iterator<Entry> sparseIterator() { @@ -694,6 +698,10 @@ public abstract class RealVector { * Generic dense iterator. Iteration is in increasing order * of the vector index. * + * <p>Note: derived classes are required to return an {@link Iterator} that + * returns non-null {@link Entry} objects as long as {@link Iterator#hasNext()} + * returns {@code true}.</p> + * * @return a dense iterator. */ public Iterator<Entry> iterator() { @@ -753,8 +761,8 @@ public abstract class RealVector { */ public RealVector mapToSelf(UnivariateFunction function) { Iterator<Entry> it = (function.value(0) == 0) ? sparseIterator() : iterator(); - Entry e; - while (it.hasNext() && (e = it.next()) != null) { + while (it.hasNext()) { + final Entry e = it.next(); e.setValue(function.value(e.getValue())); } return this;