Changeset: c215ef801708 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c215ef801708
Added Files:
        monetdb5/extras/rapi/Tests/rapi02.mal
Modified Files:
        monetdb5/extras/rapi/rapi.c
Branch: RIntegration
Log Message:

R API, Input BAT conversions and test case


diffs (253 lines):

diff --git a/monetdb5/extras/rapi/Tests/rapi02.mal 
b/monetdb5/extras/rapi/Tests/rapi02.mal
new file mode 100644
--- /dev/null
+++ b/monetdb5/extras/rapi/Tests/rapi02.mal
@@ -0,0 +1,79 @@
+# input types testing
+
+# inty types
+
+bbit:= bat.new(:oid,:bit);
+bat.append(bbit,1:bit);
+bat.append(bbit,0:bit);
+bat.append(bbit,1:bit);
+bat.append(bbit,0:bit);
+bat.append(bbit,nil:bit);
+rbit:bat[:oid,:dbl] := rapi.eval("Re(fft(na.omit(arg1)))",bbit);
+io.print(rbit);
+
+bbte:= bat.new(:oid,:bte);
+bat.append(bbte,42:bte);
+bat.append(bbte,84:bte);
+bat.append(bbte,254:bte);
+bat.append(bbte,0:bte);
+bat.append(bbte,nil:bte);
+rbte:bat[:oid,:dbl] := rapi.eval("Re(fft(na.omit(arg1)))",bbte);
+io.print(rbte);
+
+bsht:= bat.new(:oid,:sht);
+bat.append(bsht,42:sht);
+bat.append(bsht,82:sht);
+bat.append(bsht,0:sht);
+bat.append(bsht,3276:sht);
+bat.append(bsht,nil:sht);
+rsht:bat[:oid,:dbl] := rapi.eval("Re(fft(na.omit(arg1)))",bsht);
+io.print(rsht);
+
+bint:= bat.new(:oid,:int);
+bat.append(bint,1804289383:int);
+bat.append(bint,846930886:int);
+bat.append(bint,1681692777:int);
+bat.append(bint,1714636915:int);
+bat.append(bint,nil:int);
+rint:bat[:oid,:dbl] := rapi.eval("Re(fft(na.omit(arg1)))",bint);
+io.print(rint);
+
+bwrd:= bat.new(:oid,:wrd);
+bat.append(bwrd,1804289383:wrd);
+bat.append(bwrd,846930886:wrd);
+bat.append(bwrd,1681692777:wrd);
+bat.append(bwrd,1714636915:wrd);
+rwrd:bat[:oid,:dbl] := rapi.eval("Re(fft(na.omit(arg1)))",bwrd);
+io.print(rwrd);
+
+blng:= bat.new(:oid,:lng);
+bat.append(blng,1804289383L);
+bat.append(blng,846930886L);
+bat.append(blng,1681692777L);
+bat.append(blng,1714636915L);
+rlng:bat[:oid,:dbl] := rapi.eval("Re(fft(na.omit(arg1)))",blng);
+io.print(rlng);
+
+
+# floating point
+
+bflt:= bat.new(:oid,:flt);
+bat.append(bflt,18042.89383:flt);
+bat.append(bflt,846.930886:flt);
+bat.append(bflt,16.81692777:flt);
+bat.append(bflt,1714636.915:flt);
+rflt:bat[:oid,:dbl] := rapi.eval("Re(fft(na.omit(arg1)))",bflt);
+io.print(rflt);
+
+bdbl:= bat.new(:oid,:dbl);
+bat.append(bdbl,180428.9383:dbl);
+bat.append(bdbl,84.6930886:dbl);
+bat.append(bdbl,168169.2777:dbl);
+bat.append(bdbl,17146369.15:dbl);
+bat.append(bdbl,nil:dbl);
+rdbl:bat[:oid,:dbl] := rapi.eval("Re(fft(na.omit(arg1)))",bdbl);
+io.print(rdbl);
+
+
+
+
diff --git a/monetdb5/extras/rapi/rapi.c b/monetdb5/extras/rapi/rapi.c
--- a/monetdb5/extras/rapi/rapi.c
+++ b/monetdb5/extras/rapi/rapi.c
@@ -23,12 +23,38 @@
  */
 #include "monetdb_config.h"
 #include "rapi.h"
+#include <string.h>
 
-#include <string.h>
+#define BAT_TO_INTSXP(bat,tpe,retsxp) { \
+       tpe v;  size_t j; \
+       retsxp = NEW_INTEGER(BATcount(bat)); \
+       for (j = 0; j < BATcount(bat); j++) { \
+               v = ((tpe*) Tloc(bat, BUNfirst(bat)))[j]; \
+               if ( v == tpe##_nil) \
+                       INTEGER_POINTER(retsxp)[j] =    NA_INTEGER; \
+               else \
+                       INTEGER_POINTER(retsxp)[j] =    (int)v; \
+       }\
+}
+
+#define BAT_TO_REALSXP(bat,tpe,retsxp) { \
+       tpe v;  size_t j; \
+       retsxp = NEW_NUMERIC(BATcount(bat)); \
+       for (j = 0; j < BATcount(bat); j++) { \
+               v = ((tpe*) Tloc(bat, BUNfirst(bat)))[j]; \
+               if ( v == tpe##_nil) \
+                       NUMERIC_POINTER(retsxp)[j] =    NA_REAL; \
+               else \
+                       NUMERIC_POINTER(retsxp)[j] =    (double)v; \
+       }\
+}
+
+
+
 
 // The R-environment should be single threaded, calling for some protective 
measures.
 static MT_Lock rapiLock;
-static int rapiInitialized;
+static int rapiInitialized = FALSE;
 
 char* R_HomeDir(void) {
        // FIXME this won't work in general
@@ -48,7 +74,6 @@ void writeConsoleEx(const char * buf, in
 static void RAPIinitialize(void)
 {
        char *rargv[] = { "whatever", "--quiet", "--no-save", "--vanilla" };
-
        MT_lock_init(&rapiLock, "rapi_lock");
        Rf_initEmbeddedR(4, rargv);
        // these globals are indicative for non-thread safe R settings.
@@ -59,27 +84,6 @@ static void RAPIinitialize(void)
        rapiInitialized++;
 }
 
-str RAPIprelude(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) {
-       (void) cntxt;
-       (void) mb;
-       (void) stk;
-       (void) pci;
-
-       if ( rapiInitialized)
-               return MAL_SUCCEED;
-       RAPIinitialize();
-       return MAL_SUCCEED;
-}
-
-str RAPIpostlude(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) {
-       (void) cntxt;
-       (void) mb;
-       (void) stk;
-       (void) pci;
-       Rf_endEmbeddedR(0);
-       return MAL_SUCCEED;
-}
-
 str RAPIeval(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) {
        str exprStr = *(str*) getArgReference(stk, pci, pci->retc);
        SEXP x, env,retval;
@@ -96,7 +100,9 @@ str RAPIeval(Client cntxt, MalBlkPtr mb,
        BAT *b;
        BUN cnt;
 
-       RAPIinitialize();
+       /* startup internal R environment */
+       if (!rapiInitialized)
+               RAPIinitialize();
 
        rcall = malloc(strlen(exprStr) + sizeof(argnames) + 100);
        if (rcall==NULL) {
@@ -121,10 +127,10 @@ str RAPIeval(Client cntxt, MalBlkPtr mb,
        env = eval(lang1(install("new.env")),R_GlobalEnv);
 
        // install the MAL variables into the R environment
+       // we can basically map values to int ("INTEGER") or double ("REAL")
        for (i = pci->retc + 1; i < pci->argc; i++) {
                SEXP varname = R_NilValue;
                SEXP varvalue = R_NilValue;
-               size_t j;
 
                sprintf(buf, "arg%d", i - 1);
                args[i] = GDKstrdup(buf);
@@ -136,33 +142,25 @@ str RAPIeval(Client cntxt, MalBlkPtr mb,
                        if (b == NULL)
                                throw(MAL, "rapi.eval", MAL_MALLOC_FAIL);
 
-                       // seems expensive to copy all values 
                        switch (ATOMstorage(getTailType(getArgType(mb,pci,i)))) 
{
-
+                       case TYPE_bte:
+                               BAT_TO_INTSXP(b,bte,varvalue);
+                               break;
+                       case TYPE_sht:
+                               BAT_TO_INTSXP(b,sht,varvalue);
+                               break;
                        case TYPE_int:
-                       { int v;
-                               varvalue = NEW_INTEGER(BATcount(b));
-                               for (j = 0; j < BATcount(b); j++) {
-                                       v = ((int*) Tloc(b, BUNfirst(b)))[j];
-                                       if ( v == int_nil)
-                                               ; // TOBEFIXED 
INTEGER_POINTER(varvalue)[j] =   (int) NULL_USER_OBJECT;
-                                       else
-                                               INTEGER_POINTER(varvalue)[j] =  
v;
-                               }
+                               BAT_TO_INTSXP(b,int,varvalue);
                                break;
-                       }
+                       case TYPE_flt:
+                               BAT_TO_REALSXP(b,flt,varvalue);
+                               break;
                        case TYPE_dbl:
-                       { dbl v;
-                               varvalue = NEW_NUMERIC(BATcount(b));
-                               for (j = 0; j < BATcount(b); j++) {
-                                       v = ((int*) Tloc(b, BUNfirst(b)))[j];
-                                       if ( v == dbl_nil)
-                                               ; // TOBEFIXED 
NUMERIC_POINTER(varvalue)[j] =   (flt) NULL_USER_OBJECT;
-                                       else
-                                               NUMERIC_POINTER(varvalue)[j] =  
v;
-                               }
+                               BAT_TO_REALSXP(b,dbl,varvalue);
                                break;
-                       }
+                       case TYPE_lng: /* R's integers are stored as int, so we 
cannot be sure long will fit */
+                               BAT_TO_REALSXP(b,lng,varvalue);
+                               break;
                        case TYPE_str:
                                //varvalue = NEW_CHARACTER( strlen(*(str*) 
getArgReference(stk,pci,i)));
                                break;
@@ -228,6 +226,8 @@ str RAPIeval(Client cntxt, MalBlkPtr mb,
 
                cnt = (BUN)ret_rows;
 
+               printf("return col %d\n",i);
+
                //do something with it
                if (isaBatType(getArgType(mb,pci,i))) {
                        // hand over the vector into a BAT
@@ -331,6 +331,7 @@ str RAPIeval(Client cntxt, MalBlkPtr mb,
        // free all names variables introduced so far.
        // Beware, they still live in the R  context
        GDKfree(args);
-       // TODO: destroy R temp environment
+       // TODO: destroy R temp environment and call gc
+
        return msg;
 }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to