Author: echatellier Date: 2012-08-25 08:34:12 +0200 (Sat, 25 Aug 2012) New Revision: 437 Url: http://nuiton.org/repositories/revision/nuiton-matrix/437 Log: Imporve equals code (for performances reason) Modified: trunk/nuiton-matrix/src/main/java/org/nuiton/math/matrix/AbstractMatrixND.java trunk/nuiton-matrix/src/main/java/org/nuiton/math/matrix/DoubleVector.java trunk/nuiton-matrix/src/main/java/org/nuiton/math/matrix/MatrixNDImpl.java Modified: trunk/nuiton-matrix/src/main/java/org/nuiton/math/matrix/AbstractMatrixND.java =================================================================== --- trunk/nuiton-matrix/src/main/java/org/nuiton/math/matrix/AbstractMatrixND.java 2012-08-14 18:55:09 UTC (rev 436) +++ trunk/nuiton-matrix/src/main/java/org/nuiton/math/matrix/AbstractMatrixND.java 2012-08-25 06:34:12 UTC (rev 437) @@ -445,37 +445,44 @@ } public boolean equals(MatrixND mat) { + boolean result = true; - // le nom doit être le même - result = result && getName().equals(mat.getName()); - - result = result && equalsValues(mat); - - // les sémantiques doivent-être identique - for (int i = 0; result && i < getDimCount(); i++) { - String dimName1 = getDimensionName(i); - String dimName2 = mat.getDimensionName(i); - result = ObjectUtils.equals(dimName1, dimName2); - if (log.isTraceEnabled()) { - log.trace("dimName1(" + dimName1 + ")==dimName2(" + dimName2 - + ")=" + result); + + if (mat != this) { + // le nom doit être le même + result = result && getName().equals(mat.getName()); + + result = result && equalsValues(mat); + + if (result) { + // les sémantiques doivent-être identique + for (int i = 0; result && i < getDimCount(); i++) { + String dimName1 = getDimensionName(i); + String dimName2 = mat.getDimensionName(i); + result = ObjectUtils.equals(dimName1, dimName2); + if (log.isTraceEnabled()) { + log.trace("dimName1(" + dimName1 + ")==dimName2(" + dimName2 + + ")=" + result); + } + // System.out.println("dimName1("+dimName1+")==dimName2("+dimName2+ + // ")="+result); + + List<?> sem1 = getSemantic(i); + List<?> sem2 = mat.getSemantic(i); + result = result && ObjectUtils.equals(sem1, sem2); + if (log.isTraceEnabled()) { + log.trace("sem1(" + sem1 + ")==sem2(" + sem2 + ")=" + result); + } + // System.out.println("sem1("+sem1+")==sem1("+sem2+ ")="+result); + } } - // System.out.println("dimName1("+dimName1+")==dimName2("+dimName2+ - // ")="+result); - - List<?> sem1 = getSemantic(i); - List<?> sem2 = mat.getSemantic(i); - result = result && ObjectUtils.equals(sem1, sem2); + if (log.isTraceEnabled()) { - log.trace("sem1(" + sem1 + ")==sem2(" + sem2 + ")=" + result); + log.trace("result=" + result); } - // System.out.println("sem1("+sem1+")==sem1("+sem2+ ")="+result); + // System.out.println("result="+result); } - if (log.isTraceEnabled()) { - log.trace("result=" + result); - } - // System.out.println("result="+result); return result; } @@ -492,13 +499,15 @@ // les dimensions doivent-être identique result = result && MatrixHelper.sameDimension(getDim(), mat.getDim()); - // toutes les données doivent être identique - for (MatrixIterator i = mat.iterator(); result && i.next();) { - double v1 = i.getValue(); - double v2 = getValue(i.getCoordinates()); - result = v1 == v2; - if (log.isTraceEnabled()) { - log.trace("v1(" + v1 + ")==v2(" + v2 + ")=" + result); + if (result) { + // toutes les données doivent être identique + for (MatrixIterator i = mat.iterator(); result && i.next();) { + double v1 = i.getValue(); + double v2 = getValue(i.getCoordinates()); + result = v1 == v2; + if (log.isTraceEnabled()) { + log.trace("v1(" + v1 + ")==v2(" + v2 + ")=" + result); + } } } Modified: trunk/nuiton-matrix/src/main/java/org/nuiton/math/matrix/DoubleVector.java =================================================================== --- trunk/nuiton-matrix/src/main/java/org/nuiton/math/matrix/DoubleVector.java 2012-08-14 18:55:09 UTC (rev 436) +++ trunk/nuiton-matrix/src/main/java/org/nuiton/math/matrix/DoubleVector.java 2012-08-25 06:34:12 UTC (rev 437) @@ -183,11 +183,12 @@ @Override public boolean equals(Object o) { boolean result = false; - if (o instanceof DoubleVector) { + if (o instanceof DoubleVector && defaultValue == ((DoubleVector)o).defaultValue) { DoubleVector other = (DoubleVector) o; result = Arrays.equals(this.position, other.position) && data.equals(other.data); - } else if (o instanceof Vector) { + } else + if (o instanceof Vector) { Vector other = (Vector) o; result = true; for (int i = 0; i < size() && result; i++) { Modified: trunk/nuiton-matrix/src/main/java/org/nuiton/math/matrix/MatrixNDImpl.java =================================================================== --- trunk/nuiton-matrix/src/main/java/org/nuiton/math/matrix/MatrixNDImpl.java 2012-08-14 18:55:09 UTC (rev 436) +++ trunk/nuiton-matrix/src/main/java/org/nuiton/math/matrix/MatrixNDImpl.java 2012-08-25 06:34:12 UTC (rev 437) @@ -87,6 +87,17 @@ } @Override + public boolean equalsValues(MatrixND mat) { + boolean result; + if (mat instanceof MatrixNDImpl) { + result = matrix.equals(((MatrixNDImpl)mat).matrix); + } else { + result = super.equalsValues(mat); + } + return result; + } + + @Override public MatrixIterator iterator() { return new MatrixIteratorImpl(matrix.iterator(), getSemantics()); }