* Bug 16144 fixed: addition of sparse matrices gave incorrect results 32/21032/5
St├ęphane MOTTELET [Wed, 10 Jul 2019 11:50:18 +0000 (13:50 +0200)]
http://bugzilla.scilab.org/show_bug.cgi?id=16144

Change-Id: I45b06e55ccae711d1add233e9d0692b36f82c76d

scilab/CHANGES.md
scilab/modules/ast/src/cpp/operations/types_addition.cpp
scilab/modules/ast/tests/nonreg_tests/bug_16144.tst [new file with mode: 0644]

index c62fbec..0b2f115 100644 (file)
@@ -181,5 +181,6 @@ Bug Fixes
 * [#16085](http://bugzilla.scilab.org/show_bug.cgi?id=16085): insertion in an empty struct was broken.
 * [#16087](http://bugzilla.scilab.org/show_bug.cgi?id=16087): Insertion of struct() in a non-empty struct crashed Scilab.
 * [#16111](http://bugzilla.scilab.org/show_bug.cgi?id=16111): `isglobal` was not supporting non-scalar array of strings as input.
+* [#16144](http://bugzilla.scilab.org/show_bug.cgi?id=16144): Addition of sparse matrices gave incorrect results.
 
 
index a9846c7..2efe2c2 100644 (file)
@@ -2427,66 +2427,23 @@ template<> InternalType* add_I_M<Double, Polynom, Polynom>(Double* _pL, Polynom*
 //sp + sp
 template<> InternalType* add_M_M<Sparse, Sparse, Sparse>(Sparse* _pL, Sparse* _pR)
 {
-    Sparse* pOut = NULL;
-
     //check scalar hidden in a sparse ;)
-    /* if (_pL->getRows() == 1 && _pL->getCols() == 1)
-     {
-         //do scalar + sp
-         Double* pDbl = NULL;
-         if (_pL->isComplex())
-         {
-             std::complex<double> dbl = _pL->getImg(0, 0);
-             pDbl = new Double(dbl.real(), dbl.imag());
-         }
-         else
-         {
-             pDbl = new Double(_pL->get(0, 0));
-         }
-
-         AddSparseToDouble(_pR, pDbl, (GenericType**)pOut);
-         delete pDbl;
-         return pOut;
-     }
-
-     if (_pR->getRows() == 1 && _pR->getCols() == 1)
-     {
-         //do sp + scalar
-         Double* pDbl = NULL;
-         if (_pR->isComplex())
-         {
-             std::complex<double> dbl = _pR->getImg(0, 0);
-             pDbl = new Double(dbl.real(), dbl.imag());
-         }
-         else
-         {
-             pDbl = new Double(_pR->get(0, 0));
-         }
-
-         AddSparseToDouble(_pL, pDbl, (GenericType**)pOut);
-         delete pDbl;
-         return 0;
-     }
-
-     if (_pL->getRows() != _pR->getRows() || _pL->getCols() != _pR->getCols())
-     {
-         //dimensions not match
-         throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
-     }
-
-     if (_pL->nonZeros() == 0)
-     {
-         //sp([]) + sp
-         return _pR;
-     }
-
-     if (_pR->nonZeros() == 0)
-     {
-         //sp + sp([])
-         return _pL;
-     }*/
-
-    return _pL->add(*_pR);
+    if (_pL->isScalar() || _pR->isScalar())
+    {
+        // scalar + sp  or  sp + scalar
+        // call Overload
+        return NULL;
+    }
+
+    if (_pL->getRows() != _pR->getRows() || _pL->getCols() != _pR->getCols())
+    {
+        //dimensions not match
+        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+    }
+
+    types::Sparse* pOut = _pL->add(*_pR);
+    pOut->finalize();
+    return pOut;
 }
 
 //d + sp
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_16144.tst b/scilab/modules/ast/tests/nonreg_tests/bug_16144.tst
new file mode 100644 (file)
index 0000000..59ba5d9
--- /dev/null
@@ -0,0 +1,22 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2019 - St├ęphane MOTTELET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 16144 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/16144
+//
+// <-- Short Description -->
+// Addition of sparse matrices gives incorrect results
+
+message = msprintf(_("Inconsistent row/column dimensions.\n"));
+assert_checkerror("sparse([3,4],9) + sparse([1,2],5)",message);
+assert_checkequal(sparse([3,4],9,[4 4]) + sparse([1,2],5,[4,4]), sparse([3,4;1,2],[9,5],[4 4]))
+