getLInfNorm() uses wrong formula in both ArrayRealVector and OpenMapRealVector 
(in different ways)
--------------------------------------------------------------------------------------------------

                 Key: MATH-326
                 URL: https://issues.apache.org/jira/browse/MATH-326
             Project: Commons Math
          Issue Type: Bug
    Affects Versions: 2.0
         Environment: all
            Reporter: Jake Mannix


the L_infinity norm of a finite dimensional vector is just the max of the 
absolute value of its entries.

The current implementation in ArrayRealVector has a typo:

{code}
    public double getLInfNorm() {
        double max = 0;
        for (double a : data) {
            max += Math.max(max, Math.abs(a));
        }
        return max;
    }
{code}

the += should just be an =.

There is sadly a unit test assuring us that this is the correct behavior 
(effectively a regression-only test, not a test for correctness).

Worse, the implementation in OpenMapRealVector is not even positive 
semi-definite:

{code}   
    public double getLInfNorm() {
        double max = 0;
        Iterator iter = entries.iterator();
        while (iter.hasNext()) {
            iter.advance();
            max += iter.value();
        }
        return max;
    }
{code}

I would suggest that this method be moved up to the AbstractRealVector 
superclass and implemented using the sparseIterator():

{code}
  public double getLInfNorm() {
    double norm = 0;
    Iterator<Entry> it = sparseIterator();
    Entry e;
    while(it.hasNext() && (e = it.next()) != null) {
      norm = Math.max(norm, Math.abs(e.getValue()));
    }
    return norm;
  }
{code}

Unit tests with negative valued vectors would be helpful to check for this kind 
of thing in the future.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to