[ 
https://issues.apache.org/jira/browse/MATH-553?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Sai Zhang updated MATH-553:
---------------------------

    Comment: was deleted

(was: Hi Luc:

(sorry for the late reply. I thought my previous email was sent out, but found 
it 
still lies in my draft box)

I agree that  it does not make sense to compare 2 NaNs. However,  I think
two Java objects can still be compared, and the code maybe improved to
avoid violation of  the Java specification.

For the problem revealed in the test case, I suggest to fix this bug by adding 
a comparison to 
*this* object itself. Doing so will avoid   "var.equals(var)" returns false. 
and prevent Java containers becoming unstable, when they are containing a Dfp 
object.

A suggested fix is:

{code}
Class: org.apache.commons.math.dfp.Dfp

@Override
    public boolean equals(final Object other) {
          if(this == other) {
               return true;
          }
          ....// all existing code goes here
   }
{code}


For the other case, when comparing RealVector { 1, 0, 1 }  and {1, -0, 1},  it 
seems that
the equals method uses "numeric comparison" to conclude that  0 == -0. However,
when computing their hashcodes, the code implicitly treats "0" as an object, 
and use 
Arrays.hashcode to get the results (0, -0 are 2 different objects).

Therefore, I suggest to use a *consistent* way for comparison and computing 
hashcodes. It is
completely feasible to fix the above problem. Here are 2 possible fixes:

1.  change the ArrayRealVector#equals, lines 1207 - 1211

{code}
for (int i = 0; i < data.length; ++i) {
        if (data[i] != rhs.getEntry(i)) {      //do not use numeric comparison, 
convert both sides
          return false;                               //into Double type, and 
use Double.equals to compare
        }
      }
{code}

2.  change the ways to compute hashcode in: ArrayRealVector#hashCode
    
Do not use {code}Arrays.hashCode(value);{code} to get hashcode, since it will 
implicitly
boxes each primitive values. Instead, use a method like below to compute 
hashcode numerically:

{code}
public static int hash(double[] value) {
        int retHashCode = 0;
        for(double v : value) {
             retHashCode +=  retHashCode*3 + 17*v;
        }
       return retHashCode;
    }
{code}

I think either way above will fix this problem (though it may be not that 
important), and keep
the code behavior consistent!

Thanks

-Sai)

> Bug in class# org.apache.commons.math.dfp.Dfp / 
> org.apache.commons.math.linear.RealVectorwith reproducible JUnit test
> ---------------------------------------------------------------------------------------------------------------------
>
>                 Key: MATH-553
>                 URL: https://issues.apache.org/jira/browse/MATH-553
>             Project: Commons Math
>          Issue Type: Bug
>    Affects Versions: 2.2
>         Environment: jdk 1.6
>            Reporter: Sai Zhang
>         Attachments: ApacheMath_Documented_Test.java
>
>
> Hi all:
> I am writing an automated bug finding tool, and using
> Apache Commons Math as an experimental subject
> for evaluation.
> The tool creates executable JUnit tests as well as
> explanatory code comments. I attached one bug-revealing
> test as follows. Could you please kindly check it, to
> see if it is a real bug or not?
> Also, it would be tremendous helpful if you could give
> some feedback and suggestion on the quality of generated code comments?
> From the perspective of developers who are familiar with the code,
> is the automatically-inferred comment useful in understanding
> the generated test? is the comment helpful in bug fixing from the
> perspective of developers?
> Particularly when the automatically-generated tests
> are often long.
> Your suggestion will help us improve the tool.
> Please see attachment for the failed test.
> The comment appears in the form of:
> //Tests pass if .... (it gives some small change to the test which can make 
> the failed test pass)
> For example:
> //Test passes if var10 is: (double)<0
> java.lang.Double var10 = new java.lang.Double(0.0d);
> means if you change var10 to a double value which is < 0 (e.g., -1d), the 
> failed test will pass

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to