* Bug 16362 fixed: now sparse([]) can be concatenated 18/21518/3
mottelet [Wed, 1 Jul 2020 14:12:34 +0000 (16:12 +0200)]
http://bugzilla.scilab.org/show_bug.cgi?id=16362

Change-Id: Iac41cef877b114d9b6c24d344c0e09f4fa58acfd

scilab/CHANGES.md
scilab/modules/ast/src/cpp/ast/run_MatrixExp.hpp
scilab/modules/ast/tests/nonreg_tests/bug_16362.tst [new file with mode: 0644]

index af6e926..b1c467b 100644 (file)
@@ -308,6 +308,7 @@ Bug Fixes
 * [#16342](https://bugzilla.scilab.org/16342): `strcat()` was much slower in Scilab 6.0.2.
 * [#16350](https://bugzilla.scilab.org/16350): in if/while conditions, the empty sparse boolean was considered as TRUE.
 * [#16358](https://bugzilla.scilab.org/16358): `isdef([],..)` yielded an error instead of returning [].
+* [#16362](https://bugzilla.scilab.org/16362): sparse empty matrix could no be concatenated.
 * [#16365](https://bugzilla.scilab.org/16365): `median(m,"r")` and `median(m,"c")` yielded wrong results (6.1.0 regression)
 * [#16366](https://bugzilla.scilab.org/16366): `plot([0 1], ":")` plotted a dash-dotted curve instead of a dotted one.
 * [#16369](https://bugzilla.scilab.org/16369): Right divisions / involving one or two sparse numerical matrices were no longer supported.
index 1babc57..8d5eacd 100644 (file)
@@ -215,7 +215,7 @@ void RunVisitorT<T>::visitprivate(const MatrixExp &e)
                 types::GenericType* pGTResult = poRow->getAs<types::GenericType>();
 
                 //check dimension
-                if (pGT->getDims() != 2 || pGT->getRows() != pGTResult->getRows())
+                if (pGT->getDims() != 2 || ( (pGT->getRows() != pGTResult->getRows()) && pGT->getRows() != 0 && pGTResult->getRows() != 0) )
                 {
                     poRow->killMe();
                     if (poRow != pGT)
@@ -274,7 +274,7 @@ void RunVisitorT<T>::visitprivate(const MatrixExp &e)
                     delete[] piRank;
                 }
 
-                types::InternalType *pNewSize = AddElementToVariable(NULL, poRow, pGTResult->getRows(), pGTResult->getCols() + pGT->getCols());
+                types::InternalType *pNewSize = AddElementToVariable(NULL, poRow, std::max(pGTResult->getRows(),pGT->getRows()), pGTResult->getCols() + pGT->getCols());
                 types::InternalType* p = AddElementToVariable(pNewSize, pGT, 0, pGTResult->getCols());
                 if (p != pNewSize)
                 {
@@ -363,7 +363,7 @@ void RunVisitorT<T>::visitprivate(const MatrixExp &e)
             }
 
             //check dimension
-            if (pGT->getCols() != pGTResult->getCols())
+            if ((pGT->getCols() != pGTResult->getCols()) && pGT->getCols() != 0 &&  pGTResult->getCols() != 0)
             {
                 poRow->killMe();
                 if (poResult)
@@ -390,7 +390,7 @@ void RunVisitorT<T>::visitprivate(const MatrixExp &e)
                 pGTResult = poResult->getAs<types::GenericType>();
             }
 
-            types::InternalType* pNewSize = AddElementToVariable(NULL, poResult, pGTResult->getRows() + pGT->getRows(), pGT->getCols());
+            types::InternalType* pNewSize = AddElementToVariable(NULL, poResult, pGTResult->getRows() + pGT->getRows(), std::max(pGT->getCols(),pGTResult->getCols()));
             types::InternalType* p = AddElementToVariable(pNewSize, pGT, pGTResult->getRows(), 0);
             if (p != pNewSize)
             {
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_16362.tst b/scilab/modules/ast/tests/nonreg_tests/bug_16362.tst
new file mode 100644 (file)
index 0000000..08c9a0e
--- /dev/null
@@ -0,0 +1,31 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - 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 16362 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/16362
+//
+// <-- Short Description -->
+// sparse([]) can no longer be concatenated
+
+esp = sparse([]);
+a = [1 2;3 4];
+asp = sparse(a);
+
+assert_checkequal([a, esp], asp);
+assert_checkequal([esp, a], asp);
+assert_checkequal([a; esp], asp);
+assert_checkequal([esp; a], asp);
+
+assert_checkequal([asp, esp], asp);
+assert_checkequal([esp, asp], asp);
+assert_checkequal([asp; esp], asp);
+assert_checkequal([esp; asp], asp);
\ No newline at end of file