Adding mxGetNzmax function 78/19378/8
Siddhartha Gairola [Tue, 15 Aug 2017 13:24:24 +0000 (18:24 +0530)]
Change-Id: Ibb731b57a322580f2ba174703c8015383d989c31

scilab/modules/mexlib/src/cpp/mexlib.cpp
scilab/modules/mexlib/tests/unit_tests/mxGetNzmax.dia.ref [new file with mode: 0644]
scilab/modules/mexlib/tests/unit_tests/mxGetNzmax.tst [new file with mode: 0644]

index 0419fe3..3ba3655 100644 (file)
@@ -1595,8 +1595,22 @@ void mxSetCell(mxArray *array_ptr, int lindex, mxArray *value)
 
 int mxGetNzmax(const mxArray *ptr)
 {
-    // TODO
-    return 0;
+    if (mxIsSparse(ptr) == 0)
+    {
+        return 0;
+    }
+
+    types::InternalType *pIT = (types::InternalType *)ptr->ptr;
+    if (pIT == NULL || pIT->isGenericType() == false)
+    {
+        return 0;
+    }
+    
+    types::GenericType *pGT = pIT->getAs<types::GenericType>();
+
+    int nzmax = ((types::Sparse *)pGT)->nonZeros();
+    
+    return nzmax;
 }
 
 void mxSetNzmax(mxArray *array_ptr, int nzmax)
diff --git a/scilab/modules/mexlib/tests/unit_tests/mxGetNzmax.dia.ref b/scilab/modules/mexlib/tests/unit_tests/mxGetNzmax.dia.ref
new file mode 100644 (file)
index 0000000..b77da3b
--- /dev/null
@@ -0,0 +1,33 @@
+// ============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017-2017 - Gsoc 2017 - Siddhartha Gairola
+//
+//  This file is distributed under the same license as the Scilab package.
+// ============================================================================
+
+// <-- CLI SHELL MODE -->
+// ============================================================================
+// Unitary tests for mxGetNzmax mex function
+// ============================================================================
+cd(TMPDIR);
+ilib_verbose(0);
+mputl([ "#include ""mex.h""";
+"void mexFunction(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])";
+"{";
+"   int nonzeros = 0;";
+"   mxArray* pOut = NULL;";
+"   nonzeros = mxGetNzmax(prhs[0]);";
+"   pOut = mxCreateDoubleScalar((double)nonzeros);";
+"   plhs[0] = pOut;";
+"}"],"mexGetNzmax.c");
+ilib_mex_build("libmextest",["getNz","mexGetNzmax","cmex"], "mexGetNzmax.c",[]);
+exec("loader.sce");
+sp = sparse([1 2 3]);
+sp2 = sparse([1 2 3; 4 5 6]);
+not_sp = [1 2 3];
+res1 = getNz(sp);
+res2 = getNz(not_sp);
+res3 = getNz(sp2);
+assert_checkequal(res1, 3);
+assert_checkequal(res2, 0);
+assert_checkequal(res3, 6);
diff --git a/scilab/modules/mexlib/tests/unit_tests/mxGetNzmax.tst b/scilab/modules/mexlib/tests/unit_tests/mxGetNzmax.tst
new file mode 100644 (file)
index 0000000..bf8f6c5
--- /dev/null
@@ -0,0 +1,36 @@
+// ============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017-2017 - Gsoc 2017 - Siddhartha Gairola
+//
+//  This file is distributed under the same license as the Scilab package.
+// ============================================================================
+
+// <-- CLI SHELL MODE -->
+// ============================================================================
+// Unitary tests for mxGetNzmax mex function
+// ============================================================================
+
+cd(TMPDIR);
+ilib_verbose(0);
+mputl([ "#include ""mex.h""";
+"void mexFunction(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])";
+"{";
+"   int nonzeros = 0;";
+"   mxArray* pOut = NULL;";
+"   nonzeros = mxGetNzmax(prhs[0]);";
+"   pOut = mxCreateDoubleScalar((double)nonzeros);";
+"   plhs[0] = pOut;";
+"}"],"mexGetNzmax.c");
+ilib_mex_build("libmextest",["getNz","mexGetNzmax","cmex"], "mexGetNzmax.c",[]);
+exec("loader.sce");
+
+sp = sparse([1 2 3]);
+sp2 = sparse([1 2 3; 4 5 6]);
+not_sp = [1 2 3];
+res1 = getNz(sp);
+res2 = getNz(not_sp);
+res3 = getNz(sp2);
+
+assert_checkequal(res1, 3);
+assert_checkequal(res2, 0);
+assert_checkequal(res3, 6);