* Bug 16152 fixed: after s=spzeros(2,3), s([]) returns sparse(0,0) 74/21074/3
St├ęphane MOTTELET [Mon, 26 Aug 2019 15:52:44 +0000 (17:52 +0200)]
http://bugzilla.scilab.org/show_bug.cgi?id=16152

Also fixed the same bug with for boolean sparse and improved
display of type and emptyness.

Change-Id: I4cbac3a984cdac981806a69e1078abae74b8c68c

scilab/CHANGES.md
scilab/modules/ast/src/cpp/types/sparse.cpp
scilab/modules/ast/tests/nonreg_tests/bug_16152.tst [new file with mode: 0644]

index 9e0be3e..bb31aec 100644 (file)
@@ -192,6 +192,7 @@ Bug Fixes
 * [#16111](http://bugzilla.scilab.org/show_bug.cgi?id=16111): `isglobal` was not supporting non-scalar array of strings as input.
 * [#16118](http://bugzilla.scilab.org/show_bug.cgi?id=16118): `%s <> (1+%s)` returned %F.
 * [#16144](http://bugzilla.scilab.org/show_bug.cgi?id=16144): Addition of sparse matrices gave incorrect results.
+* [#16152](http://bugzilla.scilab.org/show_bug.cgi?id=16152): For sparse or boolean sparse matrix `s`, `s([])` returned `[]` instead of `sparse([])`.
 * [#16174](http://bugzilla.scilab.org/show_bug.cgi?id=16174): `libraryinfo` yielded 0x0 matrix of strings for libs without macro
 * [#16208](http://bugzilla.scilab.org/show_bug.cgi?id=16208): Using 3D string matrix with old C-api gateways may crash Scilab.
 * [#16209](http://bugzilla.scilab.org/show_bug.cgi?id=16209): grand() causes a freeze after several consecutive calls when using default base generator.
index d42a3ea..06769c5 100644 (file)
@@ -69,12 +69,23 @@ struct Printer
     {
     }
     template<typename T>
+    std::wstring typeName( /* */) const
+    {
+        return L"sparse";
+    }
+
+    template<typename T>
     std::wstring emptyName( /* */) const
     {
-        return L" zero";
+        return L"empty";
     }
 
     template<typename T>
+    std::wstring allZeroName( /* */) const
+    {
+        return L"zero";
+    }
+    template<typename T>
     std::wstring operator()(T const& t) const
     {
         //never call ?
@@ -121,11 +132,22 @@ std::wstring Printer::operator()(std::complex<double > const& c) const
 }
 
 template<>
-std::wstring Printer::emptyName<bool>() const
+std::wstring Printer::typeName<bool>() const
+{
+    return L"sparse boolean";
+}
+
+template<>
+std::wstring Printer::allZeroName<bool>() const
 {
     return L"False";
 }
 
+template<>
+std::wstring Printer::emptyName<bool>() const
+{
+    return L"empty";
+}
 
 template<typename T> std::wstring toString(T const& m, int precision)
 {
@@ -143,11 +165,15 @@ template<typename T> std::wstring toString(T const& m, int precision)
     ostr << L")";
 
     Printer p(precision);
-    if (!m.nonZeros())
+    if (m.rows()*m.cols() ==0)
     {
         ostr << (p.emptyName<typename Eigen::internal::traits<T>::Scalar>());
     }
-    ostr << L" sparse matrix\n\n";
+    else if (!m.nonZeros())
+    {
+        ostr << (p.allZeroName<typename Eigen::internal::traits<T>::Scalar>());
+    }
+    ostr << " " << p.typeName<typename Eigen::internal::traits<T>::Scalar>() << L" matrix\n\n";
 
     auto * pIColPos      = m.innerIndexPtr();
     auto * pINbItemByRow = m.outerIndexPtr();
@@ -2006,7 +2032,7 @@ GenericType* Sparse::extract(typed_list* _pArgs)
             delete[] piCountDim;
             //free pArg content
             cleanIndexesArguments(_pArgs, &pArg);
-            return Double::Empty();
+            return new types::Sparse(0,0,false);
         }
     }
 
@@ -4026,7 +4052,7 @@ GenericType* SparseBool::extract(typed_list* _pArgs)
             delete[] piMaxDim;
             delete[] piCountDim;
             //a([])
-            return Double::Empty();
+            return new types::SparseBool(0,0);
         }
     }
 
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_16152.tst b/scilab/modules/ast/tests/nonreg_tests/bug_16152.tst
new file mode 100644 (file)
index 0000000..66cd4b9
--- /dev/null
@@ -0,0 +1,28 @@
+// =============================================================================
+// 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 16152 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/16152
+//
+// <-- Short Description -->
+//after s = spzeros(2,3), s([]) returns [] instead of sparse([])
+
+s = sprand(5,5,0.5);
+sEmpty = s([]);
+assert_checkequal(sEmpty, sparse([]));
+
+sb = s > 0;
+sbEmpty = sb([]);
+assert_checkequal(typeof(sbEmpty), "boolean sparse");
+assert_checkequal(size(sbEmpty), [0,0]);
+
+