[sparse] now sparse([]) is sparse 27/20727/6
St├ęphane Mottelet [Wed, 23 Jan 2019 11:00:01 +0000 (12:00 +0100)]
Note: also fixes other cases when [] was created instead of a
(0,0) sparse matrix.

Change-Id: I2f5eb43cafab1da1888c7d8cd5fea0d5cbc863b9

scilab/modules/api_scilab/src/cpp/api_stack_sparse.cpp
scilab/modules/elementary_functions/macros/resize_matrix.sci
scilab/modules/hdf5/tests/unit_tests/loadhdf5data_v1.dia.ref
scilab/modules/hdf5/tests/unit_tests/loadhdf5data_v1.tst
scilab/modules/matio/tests/unit_tests/loadmatfile.dia.ref
scilab/modules/matio/tests/unit_tests/loadmatfile.tst
scilab/modules/sparse/sci_gateway/cpp/sci_sparse.cpp

index d141863..a15f476 100644 (file)
@@ -228,29 +228,25 @@ SciErr createCommonSparseMatrix(void* _pvCtx, int _iVar, int _iComplex, int _iRo
 {
     SciErr sciErr = sciErrInit();
 
-    if (_iRows == 0 && _iCols == 0)
-    {
-        double dblReal = 0;
-        sciErr = createMatrixOfDouble(_pvCtx, _iVar, 0, 0, &dblReal);
-        if (sciErr.iErr)
-        {
-            addErrorMessage(&sciErr, API_ERROR_CREATE_EMPTY_MATRIX, _("%s: Unable to create variable in Scilab memory"), "createEmptyMatrix");
-        }
-        return sciErr;
-    }
-
     types::GatewayStruct* pStr = (types::GatewayStruct*)_pvCtx;
     types::InternalType** out = pStr->m_pOut;
-
-    int iTotalSize = 0;
     types::Sparse* pSparse = NULL;
-    sciErr = fillCommonSparseMatrix(_pvCtx, (int**)&pSparse, _iComplex, _iRows, _iCols, _iNbItem, _piNbItemRow, _piColPos, _pdblReal, _pdblImg, &iTotalSize);
-    if (pSparse == NULL)
+
+    if (_iRows == 0 && _iCols == 0)
     {
-        addErrorMessage(&sciErr, API_ERROR_CREATE_NAMED_SPARSE, _("%s: Unable to create variable in Scilab memory"), _iComplex ? "createComplexSparseMatrix" : "createSparseMatrix");
-        return sciErr;
+        pSparse = new types::Sparse(0,0,false);
     }
-
+    else
+    {
+        int iTotalSize = 0;
+        sciErr = fillCommonSparseMatrix(_pvCtx, (int**)&pSparse, _iComplex, _iRows, _iCols, _iNbItem, _piNbItemRow, _piColPos, _pdblReal, _pdblImg, &iTotalSize);
+        if (pSparse == NULL)
+        {
+            addErrorMessage(&sciErr, API_ERROR_CREATE_NAMED_SPARSE, _("%s: Unable to create variable in Scilab memory"), _iComplex ? "createComplexSparseMatrix" : "createSparseMatrix");
+            return sciErr;
+        }
+    }
+    
     int rhs = _iVar - *getNbInputArgument(_pvCtx);
     out[rhs - 1] = pSparse;
 
index 6df0252..e1c0054 100644 (file)
@@ -190,7 +190,7 @@ function mat = resize_matrix(mat, varargin)
     // TRIMMING
     // --------
     if or(newsizes==0) then
-        mat = []
+        mat(:) = []
         return
     end
     k = (newsizes>0 & newsizes<oldsizes)
index 5116f4e..ba58002 100644 (file)
@@ -37,7 +37,7 @@ assert_checkequal(bmm,[%t,%f; %f, %t]);
 load(SCI+"/modules/hdf5/tests/sample_scilab_data/sparsematrix_v1.sod");
 assert_checkequal(sp,sparse([1,2;4,5;3,10],[1,2,3]));
 load(SCI+"/modules/hdf5/tests/sample_scilab_data/emptysparse_v1.sod");
-assert_checkequal(emptysparse,sparse([]));
+assert_checkequal(emptysparse,[]);
 // boolean sparse
 dense=[%F, %F, %T, %F, %F
 %T, %F, %F, %F, %F
index b92e1e9..8713a55 100644 (file)
@@ -54,7 +54,7 @@ load(SCI+"/modules/hdf5/tests/sample_scilab_data/sparsematrix_v1.sod");
 assert_checkequal(sp,sparse([1,2;4,5;3,10],[1,2,3]));
 
 load(SCI+"/modules/hdf5/tests/sample_scilab_data/emptysparse_v1.sod");
-assert_checkequal(emptysparse,sparse([]));
+assert_checkequal(emptysparse,[]);
 
 // boolean sparse
 dense=[%F, %F, %T, %F, %F
index 4402dce..9d1ff04 100644 (file)
@@ -102,8 +102,8 @@ for formatIndex = 1:size(binFormats, "*")
     //
     // TESTS FOR SPARSE MATRICES
     //
-    if binFormats(formatIndex) <> "-v4" then // Integers can not be stored in Matlab 4 binary files
-        assert_checkequal(emptysparse , []);
+    if binFormats(formatIndex) <> "-v4" then // Sparse can not be stored in Matlab 4 binary files
+        assert_checkequal(emptysparse , sparse([]));
         assert_checkequal(realscalarsparse , sparse(1.23));
         //assert_checkequal(cplxscalarsparse , sparse(1.23 + 4.56i));
         assert_checkequal(realrowvectorsparse , sparse([1.23 0 7.89]));
index b493fe2..fe1f1b3 100644 (file)
@@ -136,8 +136,8 @@ for formatIndex = 1:size(binFormats, "*")
     // TESTS FOR SPARSE MATRICES
     //
 
-    if binFormats(formatIndex) <> "-v4" then // Integers can not be stored in Matlab 4 binary files
-        assert_checkequal(emptysparse , []);
+    if binFormats(formatIndex) <> "-v4" then // Sparse can not be stored in Matlab 4 binary files
+        assert_checkequal(emptysparse , sparse([]));
 
         assert_checkequal(realscalarsparse , sparse(1.23));
         //assert_checkequal(cplxscalarsparse , sparse(1.23 + 4.56i));
index 1069478..1dfead1 100644 (file)
@@ -47,7 +47,7 @@ types::Function::ReturnValue sci_sparse(types::typed_list &in, int _piRetCount,
             case types::InternalType::ScilabBool :
             case types::InternalType::ScilabSparseBool :
             {
-                isValid = (i == (in.size() > 1 ? 1 : 0));
+                isValid = (i == (in.size() > 1) ? 1 : 0);
             }
             case types::InternalType::ScilabDouble :
             case types::InternalType::ScilabSparse :
@@ -88,8 +88,8 @@ types::Function::ReturnValue sci_sparse(types::typed_list &in, int _piRetCount,
             {
                 if (in[0]->getAs<types::Double>()->isEmpty())
                 {
-                    out.push_back(types::Double::Empty());
-                    return types::Function::OK;
+                    pRetVal = new types::Sparse(0,0,false);
+                    break;
                 }
 
                 if (in[0]->getAs<types::Double>()->isIdentity())