Changeset: 8ef159806acb for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8ef159806acb
Added Files:
        monetdb5/modules/mal/Tests/rapi00.mal
Modified Files:
        monetdb5/modules/mal/Tests/All
        monetdb5/modules/mal/rapi.c
        monetdb5/modules/mal/rapi.h
        monetdb5/modules/mal/rapi.mal
Branch: RIntegration
Log Message:

First wrap up
- the R interpreter is called correctly and returns
- the result set of the vector should be assigned to the BAT still
- The code should be robust against R error, e.g. using an unknown
name leads to a stacktrace and exit


diffs (277 lines):

diff --git a/monetdb5/modules/mal/Tests/All b/monetdb5/modules/mal/Tests/All
--- a/monetdb5/modules/mal/Tests/All
+++ b/monetdb5/modules/mal/Tests/All
@@ -65,6 +65,8 @@ mapi06
 mapi07
 mapi01
 
+rapi00
+
 cluster00
 tokenizer00
 zorder
diff --git a/monetdb5/modules/mal/Tests/rapi00.mal 
b/monetdb5/modules/mal/Tests/rapi00.mal
new file mode 100644
--- /dev/null
+++ b/monetdb5/modules/mal/Tests/rapi00.mal
@@ -0,0 +1,18 @@
+# Hannes Muhleissen example
+b:= bat.new(:oid,:int);
+bat.append(b,1804289383);
+bat.append(b,846930886);
+bat.append(b,1681692777);
+bat.append(b,1714636915);
+bat.append(b,1957747793);
+bat.append(b,424238335);
+bat.append(b,719885386);
+bat.append(b,1649760492);
+bat.append(b,596516649);
+bat.append(b,1189641421);
+
+io.print(b);
+
+r:bat[:oid,:dbl] := rapi.eval("ret0 <- Re(fft(arg2));",b);
+
+io.print(r);
diff --git a/monetdb5/modules/mal/rapi.c b/monetdb5/modules/mal/rapi.c
--- a/monetdb5/modules/mal/rapi.c
+++ b/monetdb5/modules/mal/rapi.c
@@ -32,13 +32,15 @@ char* R_HomeDir(void) {
     return "/usr/lib64/R";
 }
 
-// void writeConsole(const char * buf, int buflen) {
-//     THRprintf(GDKout,buf);
-// }
-// void writeConsoleEx(const char * buf, int buflen, int foo) {
-//     THRprintf(GDKout,buf);
-
-// }
+void writeConsole(const char * buf, int buflen) {
+       (void) buflen;
+       THRprintf(GDKout, "%s",buf);
+}
+void writeConsoleEx(const char * buf, int buflen, int foo) {
+       (void) buflen;
+       (void) foo;
+       THRprintf(GDKout, "%s",buf);
+}
 
 str
 RAPIprelude(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){
@@ -52,8 +54,8 @@ RAPIprelude(Client cntxt, MalBlkPtr mb, 
        MT_lock_init( &rapiLock,"rapi_lock");
     Rf_initEmbeddedR(4, rargv);
        // these globals are indicative for non-thread safe R settings.
-    // ptr_R_WriteConsole =  writeConsole;
-    // ptr_R_WriteConsoleEx = writeConsoleEx;
+    ptr_R_WriteConsole =  writeConsole;
+    ptr_R_WriteConsoleEx = writeConsoleEx;
     R_Outputfile = NULL;
     R_Consolefile = NULL;
        return MAL_SUCCEED;
@@ -71,7 +73,7 @@ RAPIpostlude(Client cntxt, MalBlkPtr mb,
 
 str
 RAPIeval(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){
-       str exprStr = *(str*) getArgReference(stk,pci,pci->retc+1);
+       str exprStr = *(str*) getArgReference(stk,pci,pci->retc);
     SEXP x;
     ParseStatus status;
        int i;
@@ -79,10 +81,12 @@ RAPIeval(Client cntxt, MalBlkPtr mb, Mal
        str *args;
        char *msg = createException(MAL,"rapi.eval","NYI");
        BAT *b;
+    char *rargv[] = { "whatever", "--quiet", "--no-save", "--vanilla" };
+    Rf_initEmbeddedR(4, rargv);
 
        (void) mb;
 
-       args = (str*) GDKmalloc(sizeof(str) * pci->argc);
+       args = (str*) GDKzalloc(sizeof(str) * pci->argc);
        if ( args == NULL)
                throw(MAL,"rapi.eval", MAL_MALLOC_FAIL);
        
@@ -94,7 +98,7 @@ RAPIeval(Client cntxt, MalBlkPtr mb, Mal
 #else
        (void) cntxt;
 #endif
-       
+
        // install the MAL variables into the R environment
        for( i = pci->retc+1; i< pci->argc; i++){
                SEXP varname;
@@ -102,7 +106,7 @@ RAPIeval(Client cntxt, MalBlkPtr mb, Mal
 
                sprintf(buf,"arg%d", i);
                args[i] = GDKstrdup(buf);
-               varname = Rf_install( GDKstrdup(buf));
+               varname = Rf_install( args[i]);
                // check for BAT or scalar first !!
                if ( isaBatType(getArgType(mb,pci,i))){
                        // hand over a BAT into a vector
@@ -110,19 +114,42 @@ RAPIeval(Client cntxt, MalBlkPtr mb, Mal
                        if ( b== NULL)
                                throw(MAL,"rapi.eval", MAL_MALLOC_FAIL);
 
-                       varvalue = NEW_LIST(BATcount(b));
-                       // seems expensive to copy all values into the list
+                       // seems expensive to copy all values 
+                       switch(ATOMstorage(getTailType(getArgType(mb,pci,i)))){
+                       case TYPE_bte:
+                               varvalue = NEW_LOGICAL(BATcount(b));
+                               memcpy((char*)(LOGICAL_POINTER(varvalue)), 
(char*) Tloc(b,BUNfirst(b)), BATcount(b) * sizeof(bte));
+                               break;
+                       case TYPE_int:
+                               varvalue = NEW_INTEGER(BATcount(b));
+                               memcpy((char*)(INTEGER_POINTER(varvalue)), 
(char*) Tloc(b,BUNfirst(b)), BATcount(b) * sizeof(int));
+                               break;
+                       case TYPE_dbl:
+                               varvalue = NEW_NUMERIC(BATcount(b));
+                               memcpy((char*)(NUMERIC_POINTER(varvalue)), 
(char*) Tloc(b,BUNfirst(b)), BATcount(b) * sizeof(dbl));
+                               break;
+                       case TYPE_str:
+                               //varvalue = NEW_CHARACTER( strlen(*(str*) 
getArgReference(stk,pci,i)));
+                               break;
+                       default:
+                               // no clue what type to consider
+                               msg = createException(MAL,"rapi.eval","unknown 
argument type");
+                               goto wrapup;
+                       }
                        BBPreleaseref(b->batCacheid);
                } else 
                switch(ATOMstorage(getTailType(getArgType(mb,pci,i)))){
                case TYPE_bte:
-                       varvalue = NEW_LOGICAL(*(int*) 
getArgReference(stk,pci,i));
+                       varvalue = NEW_LOGICAL(1);
+                       LOGICAL_POINTER(varvalue)[0] = *(int*) 
getArgReference(stk,pci,i);
                        break;
                case TYPE_int:
-                       varvalue = NEW_INTEGER(*(int*) 
getArgReference(stk,pci,i));
+                       varvalue = NEW_INTEGER(1);
+                       INTEGER_POINTER(varvalue)[0] = *(int*) 
getArgReference(stk,pci,i);
                        break;
                case TYPE_dbl:
-                       varvalue = NEW_NUMERIC(*(flt*) 
getArgReference(stk,pci,i));
+                       varvalue = NEW_NUMERIC(1);
+                       NUMERIC_POINTER(varvalue)[0]= *(flt*) 
getArgReference(stk,pci,i);
                        break;
                case TYPE_str:
                        //varvalue = NEW_CHARACTER( strlen(*(str*) 
getArgReference(stk,pci,i)));
@@ -144,6 +171,7 @@ RAPIeval(Client cntxt, MalBlkPtr mb, Mal
                goto wrapup;
        }
 
+       // why this?
     for (i = 0; i < LENGTH(x); i++) {
         eval(VECTOR_ELT(x, i), R_GlobalEnv);
     }
@@ -157,28 +185,42 @@ RAPIeval(Client cntxt, MalBlkPtr mb, Mal
                //do something with it
                if ( isaBatType(getArgType(mb,pci,i))){
                        // hand over the vector into a BAT
-                       b = BATdescriptor(*(int*) getArgReference(stk,pci,i));
-                       if ( b== NULL)
-                               throw(MAL,"rapi.eval", MAL_MALLOC_FAIL);
-                       // seems expensive to copy all values into the BAT
-                       BBPreleaseref(b->batCacheid);
+                       switch(ATOMstorage(getTailType(getArgType(mb,pci,i)))){
+                       case TYPE_bte:
+                               b = BATnew(TYPE_oid,TYPE_bte,0);
+                               // mem copy the R vector into the BAT
+                               break;
+                       case TYPE_int:
+                               b = BATnew(TYPE_oid,TYPE_int,0);
+                               // mem copy the R vector into the BAT
+                               break;
+                       case TYPE_dbl:
+                               b = BATnew(TYPE_oid,TYPE_dbl,0);
+                               // mem copy the R vector into the BAT
+                               break;
+                       default:
+                               // no clue what type to consider
+                               msg = createException(MAL,"rapi.eval","unknown 
argument type");
+                               goto wrapup;
+                       }
+                       BBPkeepref(b->batCacheid);
                } else  {
-               switch(ATOMstorage(getTailType(getArgType(mb,pci,i)))){
-               case TYPE_bte:
-                       *(bte*) getArgReference(stk,pci,i) = *LOGICAL(othervar);
-                       break;
-               case TYPE_int:
-                       *(int*) getArgReference(stk,pci,i) = *INTEGER(othervar);
-                       break;
-               case TYPE_dbl:
-                       *(dbl*) getArgReference(stk,pci,i) = *REAL(othervar);
-                       break;
-               default:
-                       // no clue what type to consider
-                       msg = createException(MAL,"rapi.eval","unknown argument 
type");
-                       goto wrapup;
+                       switch(ATOMstorage(getTailType(getArgType(mb,pci,i)))){
+                       case TYPE_bte:
+                               *(bte*) getArgReference(stk,pci,i) = 
*LOGICAL(othervar);
+                               break;
+                       case TYPE_int:
+                               *(int*) getArgReference(stk,pci,i) = 
*INTEGER(othervar);
+                               break;
+                       case TYPE_dbl:
+                               *(dbl*) getArgReference(stk,pci,i) = 
*REAL(othervar);
+                               break;
+                       default:
+                               // no clue what type to consider
+                               msg = createException(MAL,"rapi.eval","unknown 
argument type");
+                               goto wrapup;
+                       }
                }
-       }
        msg = MAL_SUCCEED;
 }
 wrapup:
diff --git a/monetdb5/modules/mal/rapi.h b/monetdb5/modules/mal/rapi.h
--- a/monetdb5/modules/mal/rapi.h
+++ b/monetdb5/modules/mal/rapi.h
@@ -48,9 +48,14 @@
 #define rapi_export extern
 #endif
 
+
+#define _RAPI_DEBUG_
+
 rapi_export str RAPIeval(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 rapi_export str RAPIprelude(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 rapi_export str RAPIpostlude(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 rapi_export char * R_HomeDir();
 
+rapi_export void writeConsole(const char * buf, int buflen);
+rapi_export void writeConsoleEx(const char * buf, int buflen, int foo);
 #endif /* _RAPI_LIB_ */
diff --git a/monetdb5/modules/mal/rapi.mal b/monetdb5/modules/mal/rapi.mal
--- a/monetdb5/modules/mal/rapi.mal
+++ b/monetdb5/modules/mal/rapi.mal
@@ -18,17 +18,17 @@
 module rapi;
 
 pattern eval(expr:str):any
-address RAPIevaluate
+address RAPIeval
 comment "Execute a simple R script returning a single value";
 
 #the generic R interface
-#pattern eval(expr:str,arg:any...):any...
-#address MDBRevaluate
-#comment "Execute a simple R script value";
-#
+pattern eval(expr:str,arg:any...):any...
+address RAPIeval
+comment "Execute a simple R script value";
+
 pattern prelude()
 address RAPIprelude;
 pattern postlude()
 address RAPIpostlude;
 
-prelude();
+rapi.prelude();
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to