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

Reply via email to