Пример #1
0
/* -------------------------------------------------------------------------- */
int intzgemm(char* fname)
{
    int lalfa = 0, m1 = 0, n1 = 0, m = 0, n = 0, k = 0;
    int mA = 0, nA = 0, lA = 0, mB = 0, nB = 0, lB = 0;
    int m4 = 0, n4 = 0, lbeta = 0, mC = 0, nC = 0, lC = 0;

    int minlhs = 1, minrhs = 5, maxlhs = 1, maxrhs = 5;

    CheckRhs(minrhs, maxrhs) ;
    CheckLhs(minlhs, maxlhs) ;

    GetRhsVar(1, MATRIX_OF_COMPLEX_DATATYPE, &m1, &n1, &lalfa); /*      alpha */
    CheckScalar(1, m1, n1);

    GetRhsVar(2, MATRIX_OF_COMPLEX_DATATYPE, &mA, &nA, &lA);   /*      A     */
    GetRhsVar(3, MATRIX_OF_COMPLEX_DATATYPE, &mB, &nB, &lB);   /*      B     */

    GetRhsVar(4, MATRIX_OF_COMPLEX_DATATYPE, &m4, &n4, &lbeta); /*      betha */
    CheckScalar(4, m4, n4);

    GetRhsVar(5, MATRIX_OF_COMPLEX_DATATYPE, &mC, &nC, &lC);   /*      C     */

    m = mA;
    n = nB;
    if (nA != mB || mA != mC || nB != nC )
    {
        Scierror(999, "%f: invalid matrix dims\n", fname);
    }

    k = nA;
    C2F(zgemm)("n", "n", &m , &n , &k, zstk(lalfa),
               zstk(lA), &mA , zstk(lB), &mB , zstk(lbeta) , zstk(lC), &mC);
    /*      Return C (#5) */
    LhsVar(1) = 5;
    return(0);
}
Пример #2
0
/*--------------------------------------------------------------------------*/
int sci_xpause(char *fname, unsigned long fname_len)
{
    int m1 = 0, n1 = 0, l1 = 0, sec = 0;

    CheckLhs(0, 1);
    CheckRhs(1, 1);
    if (Rhs == 1)
    {
        GetRhsVar(1, MATRIX_OF_DOUBLE_DATATYPE, &m1, &n1, &l1);
        CheckScalar(1, m1, n1);
        sec = (int)  * stk(l1);
        if (sec <= 0)
        {
            Scierror(999, _("%s: Wrong values for input argument #%d: Non-negative integers expected.\n"), fname, 1);
            return 0;
        }

#ifdef _MSC_VER
        {
            int ms = (sec) / 1000; /** time is specified in milliseconds in scilab**/
            if (ms > 0)
            {
                Sleep(ms);    /* Number of milliseconds to sleep. */
            }
        }
#else
        {
            unsigned useconds;
            useconds = (unsigned) sec;
            if (useconds != 0)
#ifdef HAVE_USLEEP
            {
                usleep(useconds);
            }
#else
#ifdef HAVE_SLEEP
            {
                sleep(useconds);
            }
#endif
#endif
        }
#endif
    }
    LhsVar(1) = 0;
    PutLhsVar();
    return 0;
}
Пример #3
0
/*--------------------------------------------------------------------------*/
int sci_xarc(char *fname,unsigned long fname_len)
{
    char* psubwinUID = NULL;
    int m1,n1,l1,l2,l3,l4,l5,l6;
    long hdl;
    int curcolor = 0;
    int *piCurColor = &curcolor;
    double angle1 = 0.0;
    double angle2 = 0.0;


    CheckRhs(6,6);
    GetRhsVar(1,MATRIX_OF_DOUBLE_DATATYPE,&m1,&n1,&l1);CheckScalar(1,m1,n1);
    GetRhsVar(2,MATRIX_OF_DOUBLE_DATATYPE,&m1,&n1,&l2);CheckScalar(2,m1,n1);
    GetRhsVar(3,MATRIX_OF_DOUBLE_DATATYPE,&m1,&n1,&l3);CheckScalar(3,m1,n1);
    GetRhsVar(4,MATRIX_OF_DOUBLE_DATATYPE,&m1,&n1,&l4);CheckScalar(4,m1,n1);
    GetRhsVar(5,MATRIX_OF_INTEGER_DATATYPE,&m1,&n1,&l5);CheckScalar(5,m1,n1);
    GetRhsVar(6,MATRIX_OF_INTEGER_DATATYPE,&m1,&n1,&l6);CheckScalar(6,m1,n1);

    angle1 = DEG2RAD(*istk(l5) / 64.0); /* convert to radian */
    angle2 = DEG2RAD(*istk(l6) / 64.0);

    psubwinUID = getOrCreateDefaultSubwin();

    getGraphicObjectProperty(psubwinUID, __GO_LINE_COLOR__, jni_int, &piCurColor);

    if ( strcmp(fname,"xarc") == 0 )
    {
        Objarc (&angle1,&angle2,stk(l1),stk(l2),stk(l3),stk(l4),&curcolor,NULL,FALSE,TRUE,&hdl);
    }
    else /* xfarc case */
    {
        Objarc (&angle1,&angle2,stk(l1),stk(l2),stk(l3),stk(l4),NULL,&curcolor,TRUE,FALSE,&hdl);
    }

    LhsVar(1)=0;
    PutLhsVar();
    return 0;
}
Пример #4
0
/*--------------------------------------------------------------------------*/
int C2F(intbdiagr)(char *fname, long unsigned int fname_len)
{
    int ix1, ix2;
    double dx1;
    int fail;
    double rMax;
    int ix, j, k, m, n;
    double t;
    int nbloc, lrMax;
    int m1, n1, la, le, lj, it;
    int lw, lx ;
    int lai, lib, lbs, lxi, lxr;

    CheckRhs(1, 2);
    CheckLhs(1, 3);

    GetRhsCVar(1, MATRIX_OF_DOUBLE_DATATYPE, &it, &m, &n, &la, &lai);
    CheckSquare(1, m, n);

    if (n == 0)
    {
        CreateVar(2, MATRIX_OF_DOUBLE_DATATYPE, &cx0, &cx0, &lx);
        CreateVar(3, MATRIX_OF_DOUBLE_DATATYPE, &cx0, &cx0, &lbs);
        LhsVar(1) = 1;
        LhsVar(2) = 2;
        LhsVar(3) = 3;
        return 0;
    }
    ix1 = (it + 1) * m * n;
    if (C2F(vfinite)(&ix1, stk(la )) == 0)
    {
        Err = 1;
        SciError(264);
        return 0;
    }
    if (Rhs == 2)
    {
        GetRhsVar(2, MATRIX_OF_DOUBLE_DATATYPE, &n1, &m1, &lrMax);
        CheckScalar(2, n1, m1);
        rMax = *stk(lrMax );
    }
    else
    {
        rMax = 1.;
        lj = la - 1;
        ix1 = n;
        for (j = 1; j <= ix1; ++j)
        {
            t = 0.;
            ix2 = n;
            for (ix = 1; ix <= ix2; ++ix)
            {
                t += (dx1 = *stk(lj + ix ), Abs(dx1));
            }
            if (t > rMax)
            {
                rMax = t;
            }
            lj += n;
        }
    }
    CreateCVar(2, MATRIX_OF_DOUBLE_DATATYPE, &it, &n, &n, &lxr, &lxi);
    ix1 = n << 1;
    CreateVar(3, MATRIX_OF_DOUBLE_DATATYPE, &cx1, &ix1, &le);
    CreateVar(4, MATRIX_OF_INTEGER_DATATYPE, &cx1, &n, &lib);
    CreateVar(5, MATRIX_OF_DOUBLE_DATATYPE, &cx1, &n, &lw);
    if (it == 0)
    {
        /*     subroutine bdiag(lda,n,a,epsshr,rMax,er,ei,bs,x,xi,scale,job,fail) */
        C2F(bdiag)(&n, &n, stk(la ), &c_b40, &rMax, stk(le ), stk(le + n ),
                   istk(lib ), stk(lxr ), stk(lxi ), stk(lw ), &cx0, &fail);
    }
    else
    {
        C2F(wbdiag)(&n, &n, stk(la ), stk(la + n * n ), &rMax, stk(le ),
                    stk(le + n ), istk(lib ), stk(lxr ), stk(lxi ), &t, &t, stk(lw ), &cx0, &fail);
    }

    if (fail)
    {
        Scierror(24, _("%s: Non convergence in QR steps.\n"), fname);
        return 0;
    }
    if (Lhs == 3)
    {
        nbloc = 0;
        for (k = 1; k <= n; ++k)
            if (*istk(lib + k - 2 + 1) >= 0)
            {
                ++nbloc;
            }
        CreateVar(6, MATRIX_OF_DOUBLE_DATATYPE, &nbloc, &cx1, &lbs);
        ix = 0;
        for (k = 1; k <= n; ++k)
        {
            if (*istk(lib + k - 2 + 1) >= 0)
            {
                *stk(lbs + ix ) = (double) * istk(lib + k - 2 + 1);
                ++ix;
            }
        }
    }
    LhsVar(1) = 1;
    LhsVar(2) = 2;
    LhsVar(3) = 6;
    return 0;
} /* intbdiagr_ */
Пример #5
0
/*--------------------------------------------------------------------------*/
int sci_xtitle( char * fname, unsigned long fname_len )
{
    int  narg;
    int  nbLabels; /* number of modified labels */
    int  box = 0;
    BOOL isBoxSpecified = FALSE;
    char * psubwinUID = NULL;
    static rhs_opts opts[] = { {-1,"boxed","i" ,0,0,0},
    {-1,NULL   ,NULL,0,0,0} };

    if (Rhs <= 0)
    {
        sci_demo(fname, fname_len);
        return 0;
    }

    CheckRhs(1,5);


    nbLabels = Rhs;

    /* get the given options from the name in opts */
    if ( !get_optionals(fname,opts) )
    {
        /* error */
        return 0;
    }

    /* compatibility with previous version in which box was put */
    /* at the fourth position */

    if ( Rhs == 4 )
    {
        int type = GetType(4);
        if ( type == 1 || type == 8 )/* double or int */
        {
            int n,m;
            int boxPtr   = -1 ; /* pointer of box on the stack */
            GetRhsVar(4,MATRIX_OF_INTEGER_DATATYPE,&m,&n,&boxPtr);
            CheckScalar(4,m,n);
            box = *istk( boxPtr );
            nbLabels--; /* it is not a label text */
            isBoxSpecified = TRUE;
        }
    }

    if ( opts[0].position != -1 && !isBoxSpecified )
    {
        /* check if "box" is in the options */
        box = *istk(opts[0].l) ;
        if ( opts[0].m * opts[0].n != 1 )
        {
            /* check size */
            Scierror( 999, _("%s: Wrong type for input argument: Scalar expected.\n"), fname );
            return 1;
        }
        nbLabels--; /* it is not a label text */
    }

    psubwinUID = getOrCreateDefaultSubwin();

    for ( narg = 1 ; narg <= nbLabels ; narg++)
    {
        int m,n;
        char **Str;
        char * modifiedLabel = NULL;

        GetRhsVar(narg,MATRIX_OF_STRING_DATATYPE,&m,&n,&Str);
        if ( m*n == 0 )
        {
            continue;
        }

        switch(narg)
        {
            case 1:
                getGraphicObjectProperty(psubwinUID, __GO_TITLE__, jni_string, &modifiedLabel);
                break;
            case 2:
                getGraphicObjectProperty(psubwinUID, __GO_X_AXIS_LABEL__, jni_string, &modifiedLabel);
            break;
            case 3:
                getGraphicObjectProperty(psubwinUID, __GO_Y_AXIS_LABEL__, jni_string, &modifiedLabel);
                break;
            case 4:
                getGraphicObjectProperty(psubwinUID, __GO_Z_AXIS_LABEL__, jni_string, &modifiedLabel);
                break;
            default:
                break;
        }

#if 0
        startFigureDataWriting(pFigure);
#endif

        sciSetText(modifiedLabel, Str, m, n);

        setGraphicObjectProperty(modifiedLabel, __GO_FILL_MODE__, &box, jni_bool, 1);

#if 0
        endFigureDataWriting(pFigure);
#endif

        freeArrayOfString(Str,m*n);
    }

    setCurrentObject(psubwinUID);
#if 0
    sciDrawObj(pFigure);
#endif

    LhsVar(1)=0;
    C2F(putlhsvar)();
    return 0;
}
Пример #6
0
/*--------------------------------------------------------------------------*/
int sci_qp_solve(char *fname, unsigned long fname_len)
{
    static int un = 1, deux = 2;
    // n : first dimension of Q
    // nbis : second dimension of Q (nbis is expected to be equal to n)
    static int Q = 0, n = 0, nbis = 0;
    static int p = 0, unbis = 0;
    static int C = 0, m = 0;
    static int b = 0, mbis = 0;
    static int me = 0, pipo = 0;
    static int x = 0, iter = 0, iact = 0, nact = 0, crval = 0, ierr = 0;
    int r = 0;
    static int lw = 0,  k = 0;
    static SciSparse Sp;
    static int issparse = 0;
    double *work = NULL;

    /*   Check rhs and lhs   */
    CheckRhs(5, 5) ;
    CheckLhs(1, 4) ;

    /*Warning this interface does not support arguments passed by reference */

    /* RhsVar: qp_solve(Q,p,C,b,me) */
    /*                1,2,3,4,5   */

    /*   Variable 1 (Q)   */
    GetRhsVar(1, MATRIX_OF_DOUBLE_DATATYPE, &n, &nbis, &Q);
    CheckSquare(1, n, nbis);

    /*   Variable 2 (p)   */
    GetRhsVar(2, MATRIX_OF_DOUBLE_DATATYPE, &nbis, &unbis, &p);
    CheckLength(2, nbis * unbis, n);

    /*   Variable 3 (C)   */
    issparse =  (GetType(3) == 5);
    if (!issparse)
    {
        GetRhsVar(3, MATRIX_OF_DOUBLE_DATATYPE, &nbis, &m, &C);
    }
    else
    {
        GetRhsVar(3, SPARSE_MATRIX_DATATYPE, &nbis, &m, &Sp);
    }

    if ( nbis != n ) // car C est passee en transposee dans la macro qpsolve
    {
        Scierror(999, _("%s: Wrong size for input argument #%d: %d column(s) expected for matrix %s.\n"), fname, 3, n, "C");
        return 0;
    }

    /*   Variable 4 (b)   */
    GetRhsVar(4, MATRIX_OF_DOUBLE_DATATYPE, &mbis, &unbis, &b);
    CheckLength(4, mbis * unbis, m);

    /*   Variable 5 (me)   */
    GetRhsVar(5, MATRIX_OF_INTEGER_DATATYPE, &pipo, &unbis, &me);
    CheckScalar(5, pipo, unbis);
    if ((*istk(me) < 0) || (*istk(me) > n))
    {
        Scierror(999, _("%s: Wrong value for input argument #%d: %s must be an integer in the range 0 to %d.\n"), fname, 5, "me", n);
        return 0;
    }

    /* Lhs variables: x, iact, iter, crval */
    CreateVar(Rhs + 1, MATRIX_OF_DOUBLE_DATATYPE, &n, &un, &x);
    CreateVar(Rhs + 2, MATRIX_OF_INTEGER_DATATYPE, &m, &un, &iact);
    CreateVar(Rhs + 3, MATRIX_OF_INTEGER_DATATYPE, &deux, &un, &iter);
    CreateVar(Rhs + 4, MATRIX_OF_DOUBLE_DATATYPE, &un, &un, &crval);

    r = Min(n, m);
    lw =  2 * n + r * (r + 5) / 2 + 2 * m + 1;
    if ((work = (double *)MALLOC(lw * sizeof(double))) == NULL)
    {
        Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
    }
    /* change the sign of  C and b.*/
    ierr = 0;
    if (!issparse)
    {
        /* linear constraints matrix is stored full */
        C2F(qpgen2)(stk(Q), stk(p), &n, &n,  stk(x), stk(crval), stk(C),
                    stk(b), &n, &m, istk(me), istk(iact), &nact, istk(iter), work,
                    &ierr);
    }
    else
    {
        /* linear constraints matrix is a sparse matrix */
        /* Change the linear constraints matrix representation:
        qpgen1sci requires column-compressed sparse matrix internal
        representation while Scilab sparse matrices are row-compressed */
        double *R = NULL, *I = NULL;
        int *ind = NULL;

        if ((R = (double *)MALLOC(Sp.nel * sizeof(double))) == NULL)
        {
            FREE(work);
            work = NULL;
            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
        }
        if ((ind = (int *)MALLOC((m + Sp.nel) * sizeof(int))) == NULL)
        {
            FREE(work);
            work = NULL;
            FREE(R);
            R = NULL;
            Scierror(999, _("%s: Cannot allocate more memory.\n"), fname);
        }

        // Transpose the sparse matrix A
        C2F(spt)(&n, &m, &(Sp.nel) ,  &(Sp.it), (int *)work,
                 Sp.R,  Sp.I,  Sp.mnel,  Sp.icol, R, I, ind, ind + m);

        C2F(qpgen1sci)(stk(Q), stk(p), &n, &n,  stk(x), stk(crval),
                       ind, ind + m,  R,
                       stk(b), &m, istk(me), istk(iact), &nact, istk(iter),
                       work, &ierr);
        FREE(work);
        work = NULL;
        FREE(R);
        R = NULL;
        FREE(ind);
        ind = NULL;
    }
    for (k = nact; k < m; k++) istk(iact)[k] = 0;
    /* LhsVar: [x, iact, iter, f] = qp_solve(...) */

    if (ierr == 0)
    {
        for (k = 0; k < Lhs; k++) LhsVar(1 + k) = Rhs + 1 + k;
        PutLhsVar();
    }
    else if (ierr == 1)
    {
        Scierror(999, _("%s: The minimization problem has no solution.\n"), fname);
    }
    else if (ierr == 2)
    {
        Scierror(999, _("%s: Q is not symmetric positive definite.\n"), fname);
    }
    return 0;
}
Пример #7
0
/*--------------------------------------------------------------------------*/
int sci_xrect( char *fname, unsigned long fname_len )
{
    long hdl = 0;
    int m1 = 0,n1 = 0,l1 = 0,m2 = 0,n2 = 0,l2 = 0,m3 = 0,n3 = 0,l3 = 0,m4 = 0,n4 = 0,l4 = 0;
    char* psubwinUID = NULL;

    int foreground = 0;
    int *piForeground = &foreground;

    CheckRhs(1,4);

    psubwinUID = (char*)getOrCreateDefaultSubwin();

    switch( Rhs )
    {
    case 1 :
        GetRhsVar(1,MATRIX_OF_DOUBLE_DATATYPE,&m1,&n1,&l1);
        CheckLength(1,m1*n1,4);

        getGraphicObjectProperty(psubwinUID, __GO_LINE_COLOR__, jni_int, (void**)&piForeground);

        if (strcmp(fname,"xrect")==0)
        {
            Objrect (stk(l1),stk(l1+1),stk(l1+2),stk(l1+3),
                     &foreground,NULL,FALSE,TRUE,&hdl);
        }
        else
        { /* xfrect case */
            Objrect (stk(l1),stk(l1+1),stk(l1+2),stk(l1+3),
                     NULL,&foreground,TRUE,FALSE,&hdl);
        }

        if ( hdl < 0 )
        {
            break;
        }

        break;
    case 4 :
        getGraphicObjectProperty(psubwinUID, __GO_LINE_COLOR__, jni_int, (void**)&piForeground);

        GetRhsVar(1,MATRIX_OF_DOUBLE_DATATYPE,&m1,&n1,&l1); CheckScalar(1,m1,n1);
        GetRhsVar(2,MATRIX_OF_DOUBLE_DATATYPE,&m2,&n2,&l2); CheckScalar(2,m2,n2);
        GetRhsVar(3,MATRIX_OF_DOUBLE_DATATYPE,&m3,&n3,&l3); CheckScalar(3,m3,n3);
        GetRhsVar(4,MATRIX_OF_DOUBLE_DATATYPE,&m4,&n4,&l4); CheckScalar(4,m4,n4);

        if (strcmp(fname,"xrect")==0)
        {
            Objrect (stk(l1),stk(l2),stk(l3),stk(l4),
                     &foreground,NULL,FALSE,TRUE,&hdl);
        }
        else
        {
            Objrect (stk(l1),stk(l2),stk(l3),stk(l4),
                     NULL,&foreground,TRUE,FALSE,&hdl);
        }

        if ( hdl < 0 )
        {
            break;
        }

        break;
    default :
        Scierror(999,_("%s: Wrong number of input argument(s): %d or %d expected.\n"),fname, 1,4);
        break ;
    }

    if ( hdl > 0 )
    {
        setGraphicObjectRelationship(psubwinUID, getObjectFromHandle(hdl));
        LhsVar(1)=0;
        PutLhsVar();
    }
    return 0;
}