Mikkel Meyer Andersen a écrit : > 2010/1/29 Luc Maisonobe <luc.maison...@free.fr>: >> Bill Barker a écrit : >>> >>> -------------------------------------------------- >>> From: "Luc Maisonobe" <luc.maison...@free.fr> >>> Sent: Friday, January 29, 2010 12:49 AM >>> To: "Commons Developers List" <dev@commons.apache.org> >>> Subject: Re: svn commit: r904231 - in >>> /commons/proper/math/trunk/src:main/java/org/apache/commons/math/linear/AbstractRealVector.javasite/xdoc/changes.xml >>> test/java/org/apache/commons/math/linear/ArrayRealVectorTest.java >>> >>>> Bill Barker a écrit : >>>>> >>>>> -------------------------------------------------- >>>>> From: "Luc Maisonobe" <luc.maison...@free.fr> >>>>> Sent: Thursday, January 28, 2010 12:14 PM >>>>> To: "Commons Developers List" <dev@commons.apache.org> >>>>> Subject: Re: svn commit: r904231 - in >>>>> /commons/proper/math/trunk/src:main/java/org/apache/commons/math/linear/AbstractRealVector.javasite/xdoc/changes.xml >>>>> >>>>> test/java/org/apache/commons/math/linear/ArrayRealVectorTest.java >>>>> >>>>>> Mikkel Meyer Andersen a écrit : >>>>>>> Hi. >>>>>>> >>>>>>> Thanks! >>>>>>> >>>>>>> Why use an iterator instead of just a simple for-loop? And what about >>>>>>> saving >>>>>>> the values until the vector invalidates - I see pros and cons for both >>>>>>> approaches, so it's more to hear what your thoughts were? >>>>>> It is because there already are several implementations of the class >>>>>> and >>>>>> they may use different strategies to access elements. Such iterators >>>>>> have been introduced by recent changes so I thought it was better to >>>>>> stick with them now. >>>>>> >>>>> +1 >>>>> There is a case for using the sparseIterator, but that probably makes >>>>> the methods overly complicated (since zero values have to be handled >>>>> specially). >>>> I did hesitate to add this. I thought adding special getSparseMinIndex >>>> and so on, that would explicitely ignore non-zeros. We can add them too >>>> if you think ignoring zeros is the right thing to do. In that case, we >>>> simply copy the methods and change iterator into sparse iterator, that's >>>> all. >>>> >>> I personally have no interest in getSparseMinIndex. Granted, the >>> iterator for OpenMapRealVector is slightly expensive (does a map lookup >>> for each index), but the more I think about it the less I like using >>> sparseIterator here. This would involve something like: >>> if(minValue > 0) { >>> //repeat loop with iterator to find a zero value >>> } >>> possibly traversing the vector twice. >>> >>> For 2.1 I'd just go with this addition, and deal with any user >>> complaints in a later version. >> I agree. >> >> Luc >> >>>> Luc >>>> >>>>>> As for saving the values, we cannot be sure when the vector changes. >>>>>> Users may do this several ways and we simply did not implement any >>>>>> control on that. >>>>>> >>>>>> Luc >>>>>> >>>>>>> Cheers, Mikkel. >>>>>>> >>>>>>> On 28/01/2010 8:42 PM, <l...@apache.org> wrote: >>>>>>> >>>>>>> Author: luc >>>>>>> Date: Thu Jan 28 19:42:31 2010 >>>>>>> New Revision: 904231 >>>>>>> >>>>>>> URL: http://svn.apache.org/viewvc?rev=904231&view=rev >>>>>>> Log: >>>>>>> added min/max getters for real vectors >>>>>>> For compatibility reasons, these methods have been put in the topmost >>>>>>> abstract class but not in the interface yet. It could be pushed to the >>>>>>> interface when next major version will be released. >>>>>>> JIRA: MATH-334 >>>>>>> >>>>>>> Modified: >>>>>>> >>>>>>> >>>>>>> commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java >>>>>>> >>>>>>> >>>>>>> commons/proper/math/trunk/src/site/xdoc/changes.xml >>>>>>> >>>>>>> >>>>>>> commons/proper/math/trunk/src/test/java/org/apache/commons/math/linear/ArrayRealVectorTest.java >>>>>>> >>>>>>> >>>>>>> >>>>>>> Modified: >>>>>>> commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java >>>>>>> >>>>>>> >>>>>>> URL: >>>>>>> http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java?rev=904231&r1=904230&r2=904231&view=diff >>>>>>> >>>>>>> >>>>>>> ============================================================================== >>>>>>> >>>>>>> >>>>>>> --- >>>>>>> commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java >>>>>>> >>>>>>> >>>>>>> (original) >>>>>>> +++ >>>>>>> commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/AbstractRealVector.java >>>>>>> >>>>>>> >>>>>>> Thu Jan 28 19:42:31 2010 >>>>>>> @@ -292,6 +292,58 @@ >>>>>>> return d; >>>>>>> } >>>>>>> >>>>>>> + /** Get the index of the minimum entry. >>>>>>> + * @return index of the minimum entry or -1 if vector length is 0 >>>>>>> + * or all entries are NaN >>>>>>> + */ >>>>>>> + public int getMinIndex() { >>>>>>> + int minIndex = -1; >>>>>>> + double minValue = Double.POSITIVE_INFINITY; >>>>>>> + Iterator<Entry> iterator = iterator(); >>>>>>> + while (iterator.hasNext()) { >>>>>>> + final Entry entry = iterator.next(); >>>>>>> + if (entry.getValue() <= minValue) { >>>>>>> + minIndex = entry.getIndex(); >>>>>>> + minValue = entry.getValue(); >>>>>>> + } >>>>>>> + } >>>>>>> + return minIndex; >>>>>>> + } >>>>>>> + >>>>>>> + /** Get the value of the minimum entry. >>>>>>> + * @return value of the minimum entry or NaN if all entries >>>>>>> are NaN >>>>>>> + */ >>>>>>> + public double getMinValue() { >>>>>>> + final int minIndex = getMinIndex(); >>>>>>> + return minIndex < 0 ? Double.NaN : getEntry(minIndex); >>>>>>> + } >>>>>>> + >>>>>>> + /** Get the index of the maximum entry. >>>>>>> + * @return index of the maximum entry or -1 if vector length is 0 >>>>>>> + * or all entries are NaN >>>>>>> + */ >>>>>>> + public int getMaxIndex() { >>>>>>> + int maxIndex = -1; >>>>>>> + double maxValue = Double.NEGATIVE_INFINITY; >>>>>>> + Iterator<Entry> iterator = iterator(); >>>>>>> + while (iterator.hasNext()) { >>>>>>> + final Entry entry = iterator.next(); >>>>>>> + if (entry.getValue() >= maxValue) { >>>>>>> + maxIndex = entry.getIndex(); >>>>>>> + maxValue = entry.getValue(); >>>>>>> + } >>>>>>> + } >>>>>>> + return maxIndex; >>>>>>> + } >>>>>>> + >>>>>>> + /** Get the value of the maximum entry. >>>>>>> + * @return value of the maximum entry or NaN if all entries >>>>>>> are NaN >>>>>>> + */ >>>>>>> + public double getMaxValue() { >>>>>>> + final int maxIndex = getMaxIndex(); >>>>>>> + return maxIndex < 0 ? Double.NaN : getEntry(maxIndex); >>>>>>> + } >>>>>>> + >>>>>>> /** {...@inheritdoc} */ >>>>>>> public RealVector mapAbs() { >>>>>>> return copy().mapAbsToSelf(); >>>>>>> >>>>>>> Modified: commons/proper/math/trunk/src/site/xdoc/changes.xml >>>>>>> URL: >>>>>>> http://svn.apache.org/viewvc/commons/proper/math/trunk/src/site/xdoc/changes.xml?rev=904231&r1=904230&r2=904231&view=diff >>>>>>> >>>>>>> >>>>>>> ============================================================================== >>>>>>> >>>>>>> >>>>>>> --- commons/proper/math/trunk/src/site/xdoc/changes.xml (original) >>>>>>> +++ commons/proper/math/trunk/src/site/xdoc/changes.xml Thu Jan 28 >>>>>>> 19:42:31 >>>>>>> 2010 >>>>>>> @@ -39,6 +39,10 @@ >>>>>>> </properties> >>>>>>> <body> >>>>>>> <release version="2.1" date="TBD" description="TBD"> >>>>>>> + <action dev="luc" type="add" issue="MATH-334" > >>>>>>> + Added min/max getters for real vectors (not yet in the >>>>>>> RealVector >>>>>>> interface for >>>>>>> + compatibility purposes, but in the AbstractRealVector >>>>>>> abstract >>>>>>> class). >>>>>>> + </action> >>>>>>> <action dev="luc" type="fix" issue="MATH-338" due-to="Vincent >>>>>>> Morand"> >>>>>>> Fixed automatic step initialization in embedded Runge-Kutta >>>>>>> integrators. >>>>>>> The relative tolerance setting was never used, only the >>>>>>> absolute >>>>>>> tolerance >>>>>>> >>>>>>> Modified: >>>>>>> commons/proper/math/trunk/src/test/java/org/apache/commons/math/linear/ArrayRealVectorTest.java >>>>>>> >>>>>>> >>>>>>> URL: >>>>>>> http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/linear/ArrayRealVectorTest.java?rev=904231&r1=904230&r2=904231&view=diff >>>>>>> >>>>>>> >>>>>>> ============================================================================== >>>>>>> >>>>>>> >>>>>>> --- >>>>>>> commons/proper/math/trunk/src/test/java/org/apache/commons/math/linear/ArrayRealVectorTest.java >>>>>>> >>>>>>> >>>>>>> (original) >>>>>>> +++ >>>>>>> commons/proper/math/trunk/src/test/java/org/apache/commons/math/linear/ArrayRealVectorTest.java >>>>>>> >>>>>>> >>>>>>> Thu Jan 28 19:42:31 2010 >>>>>>> @@ -1308,6 +1308,30 @@ >>>>>>> } >>>>>>> >>>>>>> >>>>>>> + public void testMinMax() { >>>>>>> + ArrayRealVector v1 = new ArrayRealVector(new double[] { 0, >>>>>>> -6, 4, >>>>>>> 12, 7 }); >>>>>>> + assertEquals(1, v1.getMinIndex()); >>>>>>> + assertEquals(-6, v1.getMinValue(), 1.0e-12); >>>>>>> + assertEquals(3, v1.getMaxIndex()); >>>>>>> + assertEquals(12, v1.getMaxValue(), 1.0e-12); >>>>>>> + ArrayRealVector v2 = new ArrayRealVector(new double[] { >>>>>>> Double.NaN, >>>>>>> 3, Double.NaN, -2 }); >>>>>>> + assertEquals(3, v2.getMinIndex()); >>>>>>> + assertEquals(-2, v2.getMinValue(), 1.0e-12); >>>>>>> + assertEquals(1, v2.getMaxIndex()); >>>>>>> + assertEquals(3, v2.getMaxValue(), 1.0e-12); >>>>>>> + ArrayRealVector v3 = new ArrayRealVector(new double[] { >>>>>>> Double.NaN, >>>>>>> Double.NaN }); >>>>>>> + assertEquals(-1, v3.getMinIndex()); >>>>>>> + assertTrue(Double.isNaN(v3.getMinValue())); >>>>>>> + assertEquals(-1, v3.getMaxIndex()); >>>>>>> + assertTrue(Double.isNaN(v3.getMaxValue())); >>>>>>> + ArrayRealVector v4 = new ArrayRealVector(new double[0]); >>>>>>> + assertEquals(-1, v4.getMinIndex()); >>>>>>> + assertTrue(Double.isNaN(v4.getMinValue())); >>>>>>> + assertEquals(-1, v4.getMaxIndex()); >>>>>>> + assertTrue(Double.isNaN(v4.getMaxValue())); >>>>>>> + } >>>>>>> + >>>>>>> + >>>>>>> /** verifies that two vectors are close (sup norm) */ >>>>>>> protected void assertClose(String msg, double[] m, double[] n, >>>>>>> double tolerance) { >>>>>>> >>>>>> >>>>>> --------------------------------------------------------------------- >>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >>>>>> For additional commands, e-mail: dev-h...@commons.apache.org >>>>>> >>>>> --------------------------------------------------------------------- >>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >>>>> For additional commands, e-mail: dev-h...@commons.apache.org >>>>> >>>>> >>>> >>>> --------------------------------------------------------------------- >>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >>>> For additional commands, e-mail: dev-h...@commons.apache.org >>>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >>> For additional commands, e-mail: dev-h...@commons.apache.org >>> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >> For additional commands, e-mail: dev-h...@commons.apache.org >> >> > > Good point. I agree, too. If a user really wants to check if a zero > exist, she must do it herself. But I think it's a point worth > mentioning quite clearly in the docs.
If we keep the simple iterator and don't introduce sparse iterator yet, there is no special handling for zeroes. Luc > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > For additional commands, e-mail: dev-h...@commons.apache.org > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org