Changeset: 64236bddd072 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=64236bddd072 Added Files: monetdb5/extras/pyapi/Tests/pyapi00.stable.err monetdb5/extras/pyapi/Tests/pyapi00.stable.out monetdb5/extras/pyapi/Tests/pyapi02.malC Modified Files: monetdb5/extras/pyapi/Tests/All monetdb5/extras/pyapi/pyapi.c Branch: pyapi Log Message:
Python API: More types diffs (truncated from 424 to 300 lines): diff --git a/monetdb5/extras/pyapi/Tests/All b/monetdb5/extras/pyapi/Tests/All --- a/monetdb5/extras/pyapi/Tests/All +++ b/monetdb5/extras/pyapi/Tests/All @@ -1,1 +1,2 @@ HAVE_LIBPY?pyapi00 +HAVE_LIBPY?pyapi02 diff --git a/monetdb5/extras/pyapi/Tests/pyapi00.stable.err b/monetdb5/extras/pyapi/Tests/pyapi00.stable.err new file mode 100644 --- /dev/null +++ b/monetdb5/extras/pyapi/Tests/pyapi00.stable.err @@ -0,0 +1,38 @@ +stderr of test 'pyapi00` in directory 'monetdb5/extras/pyapi` itself: + + +# 09:54:28 > +# 09:54:28 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=33990" "--set" "mapi_usock=/var/tmp/mtest-8422/.s.monetdb.33990" "--set" "monet_prompt=" "--forcemito" "--set" "mal_listing=2" "--dbpath=/Users/hannes/monetdb-install/var/MonetDB/mTests_monetdb5_extras_pyapi" "--set" "mal_listing=2" "--set" "embedded_r=true" "--set" "embedded_py=true" +# 09:54:28 > + +# builtin opt gdk_dbpath = /Users/hannes/monetdb-install/var/monetdb5/dbfarm/demo +# builtin opt gdk_debug = 0 +# builtin opt gdk_vmtrim = no +# builtin opt monet_prompt = > +# builtin opt monet_daemon = no +# builtin opt mapi_port = 50000 +# builtin opt mapi_open = false +# builtin opt mapi_autosense = false +# builtin opt sql_optimizer = default_pipe +# builtin opt sql_debug = 0 +# cmdline opt gdk_nr_threads = 0 +# cmdline opt mapi_open = true +# cmdline opt mapi_port = 33990 +# cmdline opt mapi_usock = /var/tmp/mtest-8422/.s.monetdb.33990 +# cmdline opt monet_prompt = +# cmdline opt mal_listing = 2 +# cmdline opt gdk_dbpath = /Users/hannes/monetdb-install/var/MonetDB/mTests_monetdb5_extras_pyapi +# cmdline opt mal_listing = 2 +# cmdline opt embedded_r = true +# cmdline opt embedded_py = true +# cmdline opt gdk_debug = 536870922 + +# 09:54:29 > +# 09:54:29 > "mclient" "-lmal" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-8422" "--port=33990" +# 09:54:29 > + + +# 09:54:29 > +# 09:54:29 > "Done." +# 09:54:29 > + diff --git a/monetdb5/extras/pyapi/Tests/pyapi00.stable.out b/monetdb5/extras/pyapi/Tests/pyapi00.stable.out new file mode 100644 --- /dev/null +++ b/monetdb5/extras/pyapi/Tests/pyapi00.stable.out @@ -0,0 +1,63 @@ +stdout of test 'pyapi00` in directory 'monetdb5/extras/pyapi` itself: + + +# 09:54:28 > +# 09:54:28 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=33990" "--set" "mapi_usock=/var/tmp/mtest-8422/.s.monetdb.33990" "--set" "monet_prompt=" "--forcemito" "--set" "mal_listing=2" "--dbpath=/Users/hannes/monetdb-install/var/MonetDB/mTests_monetdb5_extras_pyapi" "--set" "mal_listing=2" "--set" "embedded_r=true" "--set" "embedded_py=true" +# 09:54:28 > + +# MonetDB 5 server v11.20.0 +# This is an unreleased version +# Serving database 'mTests_monetdb5_extras_pyapi', using 4 threads +# Compiled for x86_64-apple-darwin14.1.0/64bit with 64bit OIDs and 128bit integers dynamically linked +# Found 16.000 GiB available main-memory. +# Copyright (c) 1993-July 2008 CWI. +# Copyright (c) August 2008-2015 MonetDB B.V., all rights reserved +# Visit http://www.monetdb.org/ for further information +# Listening for connection requests on mapi:monetdb://dakar.da.cwi.nl:33990/ +# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-8422/.s.monetdb.33990 +# MonetDB/GIS module loaded +# MonetDB/SQL module loaded +# MonetDB/Python module loaded +# MonetDB/R module loaded + +Ready. + +# 10:48:46 > +# 10:48:46 > "mclient" "-lmal" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-11109" "--port=36417" +# 10:48:46 > + +#io.print(b); +#--------------------------# +# h t # name +# void int # type +#--------------------------# +[ 0@0, 42 ] +[ 1@0, 43 ] +[ 2@0, 44 ] +[ 3@0, 45 ] +[ 4@0, 46 ] +[ 5@0, 47 ] +[ 6@0, 48 ] +[ 7@0, 49 ] +[ 8@0, 50 ] +[ 9@0, 51 ] +#io.print(r); +#--------------------------# +# h t # name +# void int # type +#--------------------------# +[ 0@0, 43 ] +[ 1@0, 44 ] +[ 2@0, 45 ] +[ 3@0, 46 ] +[ 4@0, 47 ] +[ 5@0, 48 ] +[ 6@0, 49 ] +[ 7@0, 50 ] +[ 8@0, 51 ] +[ 9@0, 52 ] + +# 09:54:29 > +# 09:54:29 > "Done." +# 09:54:29 > + diff --git a/monetdb5/extras/pyapi/Tests/pyapi02.malC b/monetdb5/extras/pyapi/Tests/pyapi02.malC new file mode 100644 --- /dev/null +++ b/monetdb5/extras/pyapi/Tests/pyapi02.malC @@ -0,0 +1,128 @@ +# 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] := pyapi.eval(nil:ptr,"return([numpy.add(arg1,1)])",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] := pyapi.eval(nil:ptr,"return([numpy.add(arg1,1)])",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] := pyapi.eval(nil:ptr,"return([numpy.add(arg1,1)])",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] := pyapi.eval(nil:ptr,"return([numpy.add(arg1,1)])",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] := pyapi.eval(nil:ptr,"return([numpy.add(arg1,1)])",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] := pyapi.eval(nil:ptr,"return([numpy.add(arg1,1)])",blng); +io.print(rlng); + +# not sure what to with hge, numpy only supports 128 bits when sizeof(long)=16 +# bhge:= bat.new(:oid,:hge); +# bat.append(bhge,1804289383:hge); +# bat.append(bhge,846930886:hge); +# bat.append(bhge,1681692777:hge); +# bat.append(bhge,1714636915:hge); +# rhge:bat[:oid,:dbl] := pyapi.eval(nil:ptr,"return([numpy.add(arg1,1)])",bhge); +# io.print(rhge); + +# 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] := pyapi.eval(nil:ptr,"return([numpy.add(arg1,1)])",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] := pyapi.eval(nil:ptr,"return([numpy.add(arg1,1)])",bdbl); +io.print(rdbl); + +# strings + +bstr:= bat.new(:oid,:str); +bat.append(bstr,"asdf":str); +bat.append(bstr,"sd asd asd asd asd a":str); +bat.append(bstr,"":str); +bat.append(bstr,nil:str); +rstr:bat[:oid,:int] := rapi.eval(nil:ptr,"unlist(lapply(arg1,nchar))",bstr); +io.print(rstr); + + + +# output types testing + +binto:= bat.new(:oid,:int); +bat.append(binto,1804289383:int); +bat.append(binto,846930886:int); +bat.append(binto,1681692777:int); +bat.append(binto,1714636915:int); +bat.append(binto,nil:int); + +rintbi:bat[:oid,:int] := rapi.eval(nil:ptr,"arg1",binto); +io.print(rintbi); + +rintbi2:bat[:oid,:int] := rapi.eval(nil:ptr,"as.integer(arg1)",binto); +io.print(rintbi2); + +rintbl:bat[:oid,:lng] := rapi.eval(nil:ptr,"as.integer(arg1)",binto); +io.print(rintbl); + +rintbh:bat[:oid,:hge] := rapi.eval(nil:ptr,"as.integer(arg1)",binto); +io.print(rintbh); + +rintbd:bat[:oid,:dbl] := rapi.eval(nil:ptr,"as.numeric(arg1)",binto); +io.print(rintbd); + +rintbs:bat[:oid,:str] := rapi.eval(nil:ptr,"as.character(arg1)",binto); +io.print(rintbs); + +# factors should be strings +rintbf:bat[:oid,:str] := rapi.eval(nil:ptr,"as.factor(arg1)",binto); +io.print(rintbf); + + diff --git a/monetdb5/extras/pyapi/pyapi.c b/monetdb5/extras/pyapi/pyapi.c --- a/monetdb5/extras/pyapi/pyapi.c +++ b/monetdb5/extras/pyapi/pyapi.c @@ -34,11 +34,31 @@ int PyAPIEnabled(void) { } // TODO: exclude pyapi from mergetable, too +// TODO: add to SQL layer // TODO: can we call the Python interpreter in a multi-thread environment? static MT_Lock pyapiLock; static int pyapiInitialized = FALSE; +#define BAT_TO_NP(bat, mtpe, nptpe) \ + PyArray_New(&PyArray_Type, 1, (npy_intp[1]) {BATcount(bat)}, \ + nptpe, NULL, (mtpe*) Tloc(bat, BUNfirst(bat)), 0, \ + NPY_ARRAY_CARRAY || !NPY_ARRAY_WRITEABLE, NULL); + +#define NP_TO_BAT(bat, mtpe, nptpe) { \ + PyArrayObject* pCol = (PyArrayObject*) PyArray_FromAny(pColO, \ + PyArray_DescrFromType(nptpe), 1, 1, NPY_ARRAY_CARRAY | \ + NPY_ARRAY_FORCECAST, NULL); \ + size_t cnt = PyArray_DIMS(pCol)[0], j; \ + bat = BATnew(TYPE_void, TYPE_##mtpe, cnt, TRANSIENT); \ + BATseqbase(bat, 0); bat->T->nil = 0; bat->T->nonil = 1; \ + bat->tkey = 0; bat->tsorted = 0; bat->trevsorted = 0; \ + for (j =0; j < cnt; j++) { \ + ((mtpe*) Tloc(bat, BUNfirst(bat)))[j] = \ + *(mtpe*) PyArray_GETPTR1(pCol, j); } \ + BATsetcount(bat, cnt); } + + #define _PYAPI_DEBUG_ str PyAPIeval(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, bit grouped); @@ -76,6 +96,8 @@ str PyAPIeval(MalBlkPtr mb, MalStkPtr st node * argnode; int seengrp = FALSE; PyObject *pArgs, *pResult; // this is going to be the parameter tuple + PyThreadState* tstate; + if (!PyAPIEnabled()) { throw(MAL, "pyapi.eval", @@ -95,8 +117,9 @@ str PyAPIeval(MalBlkPtr mb, MalStkPtr st // TODO: free args and rcall } - // TODO: do we need this lock for Python as well? - MT_lock_set(&pyapiLock, "pyapi.evaluate"); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list