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