check input arguments in contr function 89/8189/5
Adeline CARNIS [Thu, 19 Jul 2012 09:36:12 +0000 (11:36 +0200)]
Change-Id: Idfbf075d6cb422ee8f4911281be1be0a887cedcc

scilab/modules/cacsd/sci_gateway/c/sci_contr.c
scilab/modules/cacsd/src/c/core_Import.def
scilab/modules/cacsd/tests/unit_tests/contr.dia.ref
scilab/modules/cacsd/tests/unit_tests/contr.tst
scilab/modules/core/includes/stack3.h

index caf2a67..9416cd2 100644 (file)
@@ -1,14 +1,15 @@
 /*
- * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) INRIA - 
- * 
- * This file must be used under the terms of the CeCILL.
- * This source file is licensed as described in the file COPYING, which
- * you should have received as part of this distribution.  The terms
- * are also available at    
- * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
- *
- */
+* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+* Copyright (C) INRIA - 
+* Copyright (C) 2012 - Scilab Enterprises - Adeline CARNIS
+* 
+* This file must be used under the terms of the CeCILL.
+* This source file is licensed as described in the file COPYING, which
+* you should have received as part of this distribution.  The terms
+* are also available at    
+* http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+*
+*/
 
 /*--------------------------------------------------------------------------*/
 #include <string.h>
 #include "Scierror.h"
 #include "core_math.h"
 #include "localization.h"
+#include "stack3.h"
 /*--------------------------------------------------------------------------*/
 extern double C2F(dlamch)(char *CMACH, unsigned long int);
 extern int C2F(ab01od)();
 /*--------------------------------------------------------------------------*/
 int intab01od(char* fname)
 {
-       int mA,nA,ptrA, mB,nB, ptrB;
-       int A,B,U,KSTAIR,V, ptrIWORK,ptrU,ptrTOL;
-       int ptrKSTAIR,ptrV,ptrDWORK,ptrJUNK,ptrNCONT;
-       int LDA, LDB, LDU, LDV, LDWORK;
-       int N, M, mtol, ntol; int un, one; int INFO, INDCON, NCONT;
-       char  *JOBU, *JOBV;
-       double theTOL;
+    int mA = 0;
+    int nA = 0;
+    int ptrA = 0;
+    int mB = 0;
+    int nB = 0;
+    int ptrB = 0;
+    int A = 0;
+    int B = 0;
+    int U = 0;
+    int KSTAIR = 0;
+    int V = 0;
+    int ptrIWORK = 0;
+    int ptrU = 0;
+    int ptrTOL = 0;
+    int ptrKSTAIR = 0;
+    int ptrV = 0;
+    int ptrDWORK = 0;
+    int ptrJUNK = 0;
+    int ptrNCONT = 0;
+    int LDA = 0;
+    int LDB = 0;
+    int LDU = 0;
+    int LDV = 0;
+    int LDWORK = 0;
+    int N = 0;
+    int M = 0;
+    int mtol = 0;
+    int ntol = 0;
+    int un = 0;
+    int one = 0;
+    int INFO = 0;
+    int INDCON = 0;
+    int NCONT = 0;
+    char  *JOBU = NULL;
+    char *JOBV = NULL;
+    double theTOL = 0;;
 
-       /*     [NCONT,U,KSTAIR,V,A,B]=ab01od(A,B,[TOL])   */
+    /*     [NCONT,U,KSTAIR,V,A,B]=ab01od(A,B,[TOL])   */
 
-       CheckRhs(2,3);  
-       CheckLhs(1,6);
-       theTOL=(double) C2F(dlamch)("e",1L);
-       GetRhsVar(1,MATRIX_OF_DOUBLE_DATATYPE,&mA,&nA,&ptrA);   
-       A=1;        /*     A */
-       N=mA;
-       theTOL=0.2*sqrt(2*theTOL)*N;
-       GetRhsVar(2,MATRIX_OF_DOUBLE_DATATYPE,&mB,&nB,&ptrB);   
-       B=2;        /*     B */
-       M=nB;
-       if (nA != mB || mA != nA )
-               { 
-                       Scierror(999,_("%s: Wrong values for input arguments #%d and #%d.\n"),fname, 1, 2);  return 0; 
-               }
-       if (Rhs == 3) {
-               /*    TOL is given:   ab01od(A,B,tol)   */
-               GetRhsVar(3,MATRIX_OF_DOUBLE_DATATYPE,&mtol,&ntol,&ptrTOL);  
-               theTOL=*stk(ptrTOL);    /*     TOL */
-               if (theTOL>1.0||theTOL<0.0) {
-                       Scierror(999,_("%s: Wrong value for input argument #%d: Must be in [%d %d].\n"), fname, 3, 0, 1);  return 0;
-               }
-       }
+    CheckRhs(2,3);  
+    CheckLhs(1,6);
 
-       /*     dimensions...    */
-       LDA=Max(1,N);  LDB=LDA;  LDU=LDA; LDV=Max(1,M);
-       LDWORK = Max(1, N*M + Max(N,M) + Max(N,3*M));
+    if(iIsComplex(1) || GetType(1) != sci_matrix)
+    {
+        Scierror(999,_("%s: Wrong type for input argument #%d: A real matrix expected.\n"), fname, 1);
+        return 0; 
+    }
 
-       /*     other parameters of AB01OD   */
-       JOBU= "N"; if (Lhs >= 2)  JOBU="I";
-       JOBV= "N"; if (Lhs >= 4)  JOBV="I";
+    if(iIsComplex(2) || GetType(2) != sci_matrix)
+    {
+        Scierror(999,_("%s: Wrong type for input argument #%d: A real matrix expected.\n"), fname, 2);
+        return 0; 
+    }
 
-       /*     creating NCONT,U,KSTAIR,V,IWORK,DWORK   */
-       CreateVar(Rhs+1,MATRIX_OF_INTEGER_DATATYPE,(un=1,&un),(un=1,&un),&ptrNCONT);  NCONT=Rhs+1;
-       CreateVar(Rhs+2,MATRIX_OF_DOUBLE_DATATYPE,&N,&N,&ptrU);  U=Rhs+2;
-       CreateVar(Rhs+3,MATRIX_OF_INTEGER_DATATYPE,(un=1,&un),&N,&ptrKSTAIR);  KSTAIR=Rhs+3;
-       CreateVar(Rhs+4,MATRIX_OF_DOUBLE_DATATYPE,&M,&M,&ptrV);  V=Rhs+4;
-       CreateVar(Rhs+5,MATRIX_OF_INTEGER_DATATYPE,(un=1,&un),&M,&ptrIWORK);
-       CreateVar(Rhs+6,MATRIX_OF_DOUBLE_DATATYPE,(un=1,&un),&LDWORK,&ptrDWORK);
-       C2F(ab01od)( "A", JOBU, JOBV, &N, &M, stk(ptrA), &LDA,
-               stk(ptrB), &LDB, stk(ptrU), &LDU, stk(ptrV), &LDV,
-               istk(ptrNCONT), &INDCON, istk(ptrKSTAIR), &theTOL,
-               istk(ptrIWORK), stk(ptrDWORK), &LDWORK, &INFO );
-       if (INFO != 0) {
-               C2F(errorinfo)("ab01od", &INFO, 6L);
-               return 0;
-       }
-       if (Lhs >= 3) {
-               /*     resizing KSTAIR      */
-               CreateVar(Rhs+7,MATRIX_OF_INTEGER_DATATYPE,(un=1,&un),&INDCON,&ptrJUNK);
-               KSTAIR=Rhs+7;
-               C2F(icopy)(&INDCON,istk(ptrKSTAIR),(un=1,&un),istk(ptrJUNK),(one=1,&one)); }
-       /*     lhs variables: [NCONT,U,KSTAIR,V,A,B]=ab01od(A,B)   */
-       LhsVar(1)=NCONT; LhsVar(2)=U;
-       LhsVar(3)=KSTAIR; LhsVar(4)=V;
-       LhsVar(5)=A; LhsVar(6)=B;
-       return 0;
+    if(Rhs == 3)
+    {
+        if(iIsComplex(3) || GetType(3) != sci_matrix)
+        {
+            Scierror(999,_("%s: Wrong type for input argument #%d: A real scalar expected.\n"), fname, 3);
+            return 0; 
+        }
+    }
+
+    theTOL=(double) C2F(dlamch)("e",1L);
+    GetRhsVar(1,MATRIX_OF_DOUBLE_DATATYPE,&mA,&nA,&ptrA);   
+    A=1;        /*     A */
+    N=mA;
+    theTOL=0.2*sqrt(2*theTOL)*N;
+    GetRhsVar(2,MATRIX_OF_DOUBLE_DATATYPE,&mB,&nB,&ptrB);   
+    B=2;        /*     B */
+    M=nB;
+
+    if (nA != mB || mA != nA )
+    { 
+        Scierror(999,_("%s: Wrong values for input arguments #%d and #%d.\n"),fname, 1, 2);  return 0; 
+    }
+    if (Rhs == 3) {
+        /*    TOL is given:   ab01od(A,B,tol)   */
+        GetRhsVar(3,MATRIX_OF_DOUBLE_DATATYPE,&mtol,&ntol,&ptrTOL);  
+        theTOL=*stk(ptrTOL);    /*     TOL */
+        if (theTOL>1.0||theTOL<0.0) {
+            Scierror(999,_("%s: Wrong value for input argument #%d: Must be in [%d %d].\n"), fname, 3, 0, 1);  return 0;
+        }
+    }
+
+    /*     dimensions...    */
+    LDA=Max(1,N);  LDB=LDA;  LDU=LDA; LDV=Max(1,M);
+    LDWORK = Max(1, N*M + Max(N,M) + Max(N,3*M));
+
+    /*     other parameters of AB01OD   */
+    JOBU= "N"; if (Lhs >= 2)  JOBU="I";
+    JOBV= "N"; if (Lhs >= 4)  JOBV="I";
+
+    /*     creating NCONT,U,KSTAIR,V,IWORK,DWORK   */
+    CreateVar(Rhs+1,MATRIX_OF_INTEGER_DATATYPE,(un=1,&un),(un=1,&un),&ptrNCONT);  NCONT=Rhs+1;
+    CreateVar(Rhs+2,MATRIX_OF_DOUBLE_DATATYPE,&N,&N,&ptrU);  U=Rhs+2;
+    CreateVar(Rhs+3,MATRIX_OF_INTEGER_DATATYPE,(un=1,&un),&N,&ptrKSTAIR);  KSTAIR=Rhs+3;
+    CreateVar(Rhs+4,MATRIX_OF_DOUBLE_DATATYPE,&M,&M,&ptrV);  V=Rhs+4;
+    CreateVar(Rhs+5,MATRIX_OF_INTEGER_DATATYPE,(un=1,&un),&M,&ptrIWORK);
+    CreateVar(Rhs+6,MATRIX_OF_DOUBLE_DATATYPE,(un=1,&un),&LDWORK,&ptrDWORK);
+    C2F(ab01od)( "A", JOBU, JOBV, &N, &M, stk(ptrA), &LDA,
+        stk(ptrB), &LDB, stk(ptrU), &LDU, stk(ptrV), &LDV,
+        istk(ptrNCONT), &INDCON, istk(ptrKSTAIR), &theTOL,
+        istk(ptrIWORK), stk(ptrDWORK), &LDWORK, &INFO );
+    if (INFO != 0) {
+        C2F(errorinfo)("ab01od", &INFO, 6L);
+        return 0;
+    }
+    if (Lhs >= 3) {
+        /*     resizing KSTAIR      */
+        CreateVar(Rhs+7,MATRIX_OF_INTEGER_DATATYPE,(un=1,&un),&INDCON,&ptrJUNK);
+        KSTAIR=Rhs+7;
+        C2F(icopy)(&INDCON,istk(ptrKSTAIR),(un=1,&un),istk(ptrJUNK),(one=1,&one)); }
+    /*     lhs variables: [NCONT,U,KSTAIR,V,A,B]=ab01od(A,B)   */
+    LhsVar(1)=NCONT; LhsVar(2)=U;
+    LhsVar(3)=KSTAIR; LhsVar(4)=V;
+    LhsVar(5)=A; LhsVar(6)=B;
+    return 0;
 }
 /*--------------------------------------------------------------------------*/
index 1115de2..dbdc85c 100644 (file)
@@ -18,3 +18,6 @@ getrhsvar_
 checklhs_
 checkrhs_
 GetData
+iIsComplex
+gettype_
+vstk_
\ No newline at end of file
index 687acc7..856cd0b 100644 (file)
@@ -1,9 +1,28 @@
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) ????-2008 - INRIA - Serge Steer
+// Copyright (C) 2012 - Scilab Enterprises - Adeline CARNIS
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
+assert_checkfalse(execstr("contr()", "errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong number of input argument(s): %d to %d expected."), "contr", 2, 3); 
+assert_checkerror("contr()", refMsg);
+A = ones(3,3) + 0 * %i;
+B = ones(3,3) * 2;
+assert_checkfalse(execstr("contr(A, B)", "errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: A real matrix expected."), "contr", 1); 
+assert_checkerror("contr(A, B)", refMsg);
+A = ones(3,3);
+assert_checkfalse(execstr("contr(A, complex(B))", "errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: A real matrix expected."), "contr", 2); 
+assert_checkerror("contr(A, complex(B))", refMsg);
+assert_checkfalse(execstr("contr(sparse(A), B)", "errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: A real matrix expected."), "contr", 1); 
+assert_checkerror("contr(sparse(A), B)", refMsg);
+assert_checkfalse(execstr("contr(A, sparse(B))", "errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: A real matrix expected."), "contr", 2); 
+assert_checkerror("contr(A, sparse(B))", refMsg);
 a = [0.8604043 , 0.0070020 , 0.6223373 , -1.356213 , -4.2301775
      0.159714 ,  0.0857791 , -0.2367751 , 0.4958580 , 0.6398817
      -4.3054931 , -0.0365878 , 2.1784911 , 0.0314793 , 2.3728994
@@ -18,16 +37,21 @@ c = [2 , 7 , -2 , 5 , 1
      0 , -1 , 3 , 0 , 2];
 d = [1 , 0 , 0
      0 , 0 , 0];
-if contr(a,b)<>4 then bugmes();quit;end
+assert_checkequal(contr(a, b), 4);
 [n,U]=contr(a,b);a1=U'*a*U;
-if abs(spec(a1(n+1:$,n+1:$)))>1d-7 then bugmes();quit;end
+assert_checkalmostequal(abs(spec(a1(n+1:$,n+1:$))), 0, [], 1e-7);
 [n,U,ind,V,Ac,Bc]=contr(a,b);
-if n<>4|norm(U'*U-eye())>1d-14|norm(V'*V-eye())>1d-14|or(ind<>[3 1]) then bugmes();quit;end
-if norm(Ac(n+1:$,:),1)>1d-7 then bugmes();quit;end
-if norm(U'*a*U-Ac,1)>1d-6 then bugmes();quit;end
-if norm(U'*b*V-Bc)>1d-10 then bugmes();quit;end
-if contr(a',c',0.0001)<>3 then bugmes();quit;end
-if execstr('contr(a)','errcatch')<>77 then bugmes();quit;end
-if execstr('contr(a,1)','errcatch')<>999 then bugmes();quit;end
-if execstr('contr(a,b,''ee'')','errcatch')<>246 then bugmes();quit;end
-if execstr('contr(a+%s,b)','errcatch')<>246 then bugmes();quit;end
+assert_checkequal(n, 4);
+assert_checkalmostequal(norm(Ac(n+1:$,:),1), 0, [], 1e-7);
+assert_checkalmostequal(norm(U'*a*U-Ac,1), 0, [], 1e-6);
+assert_checkalmostequal(norm(U'*b*V-Bc), 0, [], 1e-10);
+assert_checkfalse(execstr("contr(a,1)", "errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong values for input arguments #%d and #%d.\n"), "contr", 1, 2); 
+assert_checkerror("contr(a,1)", refMsg);
+assert_checkfalse(execstr("contr(a+%s,b)", "errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: A real matrix expected."), "contr", 1); 
+assert_checkerror("contr(a+%s,b)", refMsg);
+assert_checkfalse(execstr("contr(a,b,''ee'')", "errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: A real scalar expected.\n"), "contr", 3); 
+assert_checkerror("contr(a,b,''ee'')", refMsg);
+assert_checkequal(contr(a',c',0.0001), 3);
index a2928f4..23c016e 100644 (file)
@@ -1,36 +1,69 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) ????-2008 - INRIA - Serge Steer
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-a = [0.8604043 , 0.0070020 , 0.6223373 , -1.356213 , -4.2301775
-     0.159714 ,  0.0857791 , -0.2367751 , 0.4958580 , 0.6398817
-     -4.3054931 , -0.0365878 , 2.1784911 , 0.0314793 , 2.3728994
-     -3.7115779 , -0.5370809 , 2.4291716 , -0.6352663 , 2.6972781
-     6.3580966 , 0.1377712 , -4.0461243 , -0.5192899 , -4.0394083];
-b = [-0.0532544 , -0.1494083 , -0.0098619
-     -0.0355030 , -0.0162722 , 0.1045365
-     -0.1301775 , 0.1736686 , -0.0611440
-     0.1834320 , 0.1757396 , -0.5956607
-     0.1775148 , -0.1186391 , 0.1439842];
-c = [2 , 7 , -2 , 5 , 1
-     0 , -1 , 3 , 0 , 2];
-d = [1 , 0 , 0
-     0 , 0 , 0];
-
-if contr(a,b)<>4 then pause,end
-[n,U]=contr(a,b);a1=U'*a*U;
-if abs(spec(a1(n+1:$,n+1:$)))>1d-7 then pause,end
-[n,U,ind,V,Ac,Bc]=contr(a,b);
-if n<>4|norm(U'*U-eye())>1d-14|norm(V'*V-eye())>1d-14|or(ind<>[3 1]) then pause,end
-if norm(Ac(n+1:$,:),1)>1d-7 then pause,end
-if norm(U'*a*U-Ac,1)>1d-6 then pause,end
-if norm(U'*b*V-Bc)>1d-10 then pause,end
-
-
-if contr(a',c',0.0001)<>3 then pause,end
-if execstr('contr(a)','errcatch')<>77 then pause,end
-if execstr('contr(a,1)','errcatch')<>999 then pause,end
-if execstr('contr(a,b,''ee'')','errcatch')<>246 then pause,end
-if execstr('contr(a+%s,b)','errcatch')<>246 then pause,end
+// =============================================================================\r
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
+// Copyright (C) ????-2008 - INRIA - Serge Steer\r
+// Copyright (C) 2012 - Scilab Enterprises - Adeline CARNIS\r
+//\r
+//  This file is distributed under the same license as the Scilab package.\r
+// =============================================================================\r
+assert_checkfalse(execstr("contr()", "errcatch") == 0);\r
+refMsg = msprintf(_("%s: Wrong number of input argument(s): %d to %d expected."), "contr", 2, 3); \r
+assert_checkerror("contr()", refMsg);\r
+\r
+A = ones(3,3) + 0 * %i;\r
+B = ones(3,3) * 2;\r
+assert_checkfalse(execstr("contr(A, B)", "errcatch") == 0);\r
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: A real matrix expected."), "contr", 1); \r
+assert_checkerror("contr(A, B)", refMsg);\r
+\r
+A = ones(3,3);\r
+assert_checkfalse(execstr("contr(A, complex(B))", "errcatch") == 0);\r
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: A real matrix expected."), "contr", 2); \r
+assert_checkerror("contr(A, complex(B))", refMsg);\r
+\r
+assert_checkfalse(execstr("contr(sparse(A), B)", "errcatch") == 0);\r
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: A real matrix expected."), "contr", 1); \r
+assert_checkerror("contr(sparse(A), B)", refMsg);\r
+\r
+assert_checkfalse(execstr("contr(A, sparse(B))", "errcatch") == 0);\r
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: A real matrix expected."), "contr", 2); \r
+assert_checkerror("contr(A, sparse(B))", refMsg);\r
+\r
+a = [0.8604043 , 0.0070020 , 0.6223373 , -1.356213 , -4.2301775\r
+     0.159714 ,  0.0857791 , -0.2367751 , 0.4958580 , 0.6398817\r
+     -4.3054931 , -0.0365878 , 2.1784911 , 0.0314793 , 2.3728994\r
+     -3.7115779 , -0.5370809 , 2.4291716 , -0.6352663 , 2.6972781\r
+     6.3580966 , 0.1377712 , -4.0461243 , -0.5192899 , -4.0394083];\r
+b = [-0.0532544 , -0.1494083 , -0.0098619\r
+     -0.0355030 , -0.0162722 , 0.1045365\r
+     -0.1301775 , 0.1736686 , -0.0611440\r
+     0.1834320 , 0.1757396 , -0.5956607\r
+     0.1775148 , -0.1186391 , 0.1439842];\r
+c = [2 , 7 , -2 , 5 , 1\r
+     0 , -1 , 3 , 0 , 2];\r
+d = [1 , 0 , 0\r
+     0 , 0 , 0];\r
+\r
+assert_checkequal(contr(a, b), 4);\r
+\r
+[n,U]=contr(a,b);a1=U'*a*U;\r
+assert_checkalmostequal(abs(spec(a1(n+1:$,n+1:$))), 0, [], 1e-7);\r
+\r
+[n,U,ind,V,Ac,Bc]=contr(a,b);\r
+assert_checkequal(n, 4);\r
+assert_checkalmostequal(norm(Ac(n+1:$,:),1), 0, [], 1e-7);\r
+assert_checkalmostequal(norm(U'*a*U-Ac,1), 0, [], 1e-6);\r
+assert_checkalmostequal(norm(U'*b*V-Bc), 0, [], 1e-10);\r
+\r
+assert_checkfalse(execstr("contr(a,1)", "errcatch") == 0);\r
+refMsg = msprintf(_("%s: Wrong values for input arguments #%d and #%d.\n"), "contr", 1, 2); \r
+assert_checkerror("contr(a,1)", refMsg);\r
+\r
+assert_checkfalse(execstr("contr(a+%s,b)", "errcatch") == 0);\r
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: A real matrix expected."), "contr", 1); \r
+assert_checkerror("contr(a+%s,b)", refMsg);\r
+\r
+assert_checkfalse(execstr("contr(a,b,''ee'')", "errcatch") == 0);\r
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: A real scalar expected.\n"), "contr", 3); \r
+assert_checkerror("contr(a,b,''ee'')", refMsg);\r
+\r
+assert_checkequal(contr(a',c',0.0001), 3);\r\r
index b57dda8..257ca9d 100644 (file)
@@ -47,7 +47,7 @@ int C2F(putvar) (int *number, char *namex, unsigned long name_len );
  * @param _iVar the matrix
  * @return 1 if is complex 0 otherwise
  */
-/* int iIsComplex(int _iVar); */
+int iIsComplex(int _iVar);
 void GetRhsPolyVar(int _iVarNum, int** _piVarName, int* _piRows, int* _piCols, int* _piPow, int* _piReal);
 void GetRhsCPolyVar(int _iVarNum, int** _piVarName, int* _piRows, int* _piCols, int* _piPow, int* _piReal, int *_piImg);
 void GetRhsSparseVar(int _iVarNum, int* _piRows, int* _piCols, int* _piTotalElem, int* _piElemByRow, int* _piColByRow, int* _piReal);