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