* Bug 14460 fixed: sparse boolean indices are supported again 94/19994/7
St├ęphane Mottelet [Wed, 2 May 2018 14:06:27 +0000 (16:06 +0200)]
http://bugzilla.scilab.org/14460

Change-Id: I6a4608ce85886b88bd1ee326c3d13f465e5c19de

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

index 8a1f229..a867982 100644 (file)
@@ -405,6 +405,7 @@ Known issues
 * [#13778](http://bugzilla.scilab.org/show_bug.cgi?id=13778): The size of `repmat([], [1 1 3])` was [0 0 3] instead of [0 0].
 * [#13915](http://bugzilla.scilab.org/show_bug.cgi?id=13915): On Windows, reinstalling an ATOMS toolbox with an archive already present failed.
 * [#14010](http://bugzilla.scilab.org/show_bug.cgi?id=14010): Browsevar was not displaying dimensions > 2 of hypermatrix
+* [#14460](http://bugzilla.scilab.org/show_bug.cgi?id=14460): sparse boolean indices were not supported.
 * [#14521](http://bugzilla.scilab.org/show_bug.cgi?id=14521): For the CONVERT Xcos block, types codes 2, 6, 7, and 8 were not documented.
 * [#14704](http://bugzilla.scilab.org/show_bug.cgi?id=14704): In Scinotes, URL for the `https://`, `ftp://`, `ftps://`, and `file://` protocols were no longer hyperlinked.
 * [#14897](http://bugzilla.scilab.org/show_bug.cgi?id=14897): `xinfo` is poor and useless. It is declared obsolete.
index 4b94580..840a255 100644 (file)
@@ -694,6 +694,26 @@ int checkIndexesArguments(InternalType* _pRef, typed_list* _pArgsIn, typed_list*
             }
             pCurrentArg = pDbl;
         }
+        else if (pIT->isSparseBool())
+        {
+            types::SparseBool* pSb = pIT->getAs<types::SparseBool>();
+            int iItemCount = static_cast<int>(pSb->nbTrue());
+            int iRows = pSb->getRows();
+            int *pCoord = new int[iItemCount * 2];
+
+            //get (r,c) positions of True Elements
+            pSb->outputRowCol(pCoord);
+            int* pY = pCoord + iItemCount;
+            //allow new Double index variable
+            Double* pDbl = new Double(1, iItemCount);
+            double* pdbl = pDbl->getReal();
+            for (int i = 0; i < iItemCount; ++i)
+            {
+                pdbl[i] = pCoord[i] + (pY[i] - 1) * iRows;
+            }
+
+            pCurrentArg = pDbl;
+        }
         else if (pIT->isInt())
         {
             switch (pIT->getType())
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14460.tst b/scilab/modules/ast/tests/nonreg_tests/bug_14460.tst
new file mode 100644 (file)
index 0000000..345b477
--- /dev/null
@@ -0,0 +1,29 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2018 - 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 14460 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=14460
+//
+// <-- Short Description -->
+// sparse boolean indices were not supported any more
+
+s=speye(2,2);
+assert_checkequal(s(s==1),sparse([1;1]) );
+I=eye(2,2);
+assert_checkequal(I(s==1),[1;1]);
+k=(s==0);
+s(k)=1;
+assert_checkequal(s,sparse([1 1;1 1]));
+I(k)=1;
+assert_checkequal(I,[1 1;1 1]);
+
+