Changeset: afde60b0c048 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=afde60b0c048 Modified Files: sql/backends/monet5/UDF/80_udf.sql sql/backends/monet5/UDF/udf.c sql/backends/monet5/UDF/udf.h sql/backends/monet5/UDF/udf.mal Branch: arrays Log Message:
qr as udf over arrays diffs (165 lines): diff --git a/sql/backends/monet5/UDF/80_udf.sql b/sql/backends/monet5/UDF/80_udf.sql --- a/sql/backends/monet5/UDF/80_udf.sql +++ b/sql/backends/monet5/UDF/80_udf.sql @@ -39,3 +39,7 @@ external name udf.qr; CREATE FUNCTION qrUDF(r integer, c integer, v double) RETURNS TABLE(r integer, c integer, v double) external name udf.narrowqr; + +CREATE FUNCTION arrayUDF(r integer, c integer, v double) +RETURNS TABLE(r integer, c integer, v double) +external name udf.arrayqr; diff --git a/sql/backends/monet5/UDF/udf.c b/sql/backends/monet5/UDF/udf.c --- a/sql/backends/monet5/UDF/udf.c +++ b/sql/backends/monet5/UDF/udf.c @@ -788,3 +788,131 @@ char* narrowqrUDF_bulk(bat *rowsRes, bat return MAL_SUCCEED; } +char* arrayqrUDF_bulk(bat *rowsRes, bat* columnsRes, bat* valuesRes, const unsigned int rowsNum, const unsigned int colsNum, const bat *vals) { + double *qarray, *rarray, *els; + unsigned int rowNum, colNum, cellsNum; + + BAT *values_out, *values_in; + dbl *elements = NULL, *new_elements = NULL; + + BAT *rows_out, *cols_out; + int *rowsVals, *colsVals; + + if(!(values_in = BATdescriptor(*vals))) + return createException(MAL, "udf.arrayqr", MAL_MALLOC_FAIL); + + cellsNum = rowsNum*colsNum; + + qarray = (dbl*)GDKmalloc(rowsNum*colsNum*sizeof(double)); + rarray = (dbl*)GDKmalloc(colsNum*colsNum*sizeof(double)); + els = (dbl*)GDKmalloc(rowsNum*colsNum*sizeof(double)); + + /* copy the elements in column major to fit the access pattern */ + elements = (dbl*) Tloc(values_in, BUNfirst(values_in)); + for(rowNum=0; rowNum<rowsNum; rowNum++) { + unsigned int skip = rowNum*colsNum; + for(colNum=0; colNum<colsNum; colNum++) + *(els+colNum*rowsNum+rowNum) = elements[colNum+skip]; + } + BBPunfix(values_in->batCacheid); + + /* For each column */ + for(colNum =0 ; colNum<colsNum; colNum++) { + double s=0.0; + unsigned int colNum_tmp; + + unsigned int skip = colNum*rowsNum; + unsigned int rSkip = colNum*colNum; + + /*get all rows*/ + for(rowNum=0; rowNum<rowsNum; rowNum++) + s+=(*(els+skip+rowNum))*(*(els+skip+rowNum)); + + *(rarray+rSkip+colNum) = sqrt(s); + + /* get all rows */ + for(rowNum=0; rowNum<rowsNum; rowNum++) + *(qarray+skip+rowNum) = (*(els+skip+rowNum))/(*(rarray+rSkip+colNum)); + + for(colNum_tmp=colNum+1; colNum_tmp<colsNum; colNum_tmp++) { + unsigned int skip_tmp = colNum_tmp*rowsNum; + s = 0.0; + + for(rowNum=0; rowNum<rowsNum; rowNum++) + s+=(*(els+skip_tmp+rowNum))*(*(qarray+skip+rowNum)); + + *(rarray+rSkip+colNum_tmp) = s; + + for(rowNum=0; rowNum<rowsNum; rowNum++) + *(els+skip_tmp+rowNum) -= s*(*(qarray+skip+rowNum)); + } + } + + + if((values_out = BATnew(TYPE_void, TYPE_dbl, cellsNum, TRANSIENT)) == NULL) { + GDKfree(rarray); + GDKfree(qarray); + GDKfree(els); + + return createException(MAL, "udf.arrayqr", "Problem creating BAT"); + } + new_elements = (dbl*) Tloc(values_out, BUNfirst(values_out)); + + for(rowNum=0; rowNum<rowsNum; rowNum++) { + for(colNum=0; colNum<colsNum; colNum++) { + new_elements[rowNum+colNum*rowsNum] = *(qarray+colNum*rowsNum+rowNum); + } + } + + BATsetcount(values_out, cellsNum); + values_out->tsorted = 0; + values_out->trevsorted = values_out->batCount <= 1; + values_out->tkey = 1; + values_out->tdense = (values_out->batCount <= 1 || values_out->batCount == values_out->batCount); + if (values_out->batCount == 1 || values_out->batCount == values_out->batCount) + values_out->tseqbase = values_out->hseqbase; + values_out->hsorted = 1; + values_out->hdense = 1; + values_out->hseqbase = 0; + values_out->hkey = 1; + values_out->hrevsorted = values_out->batCount <= 1; + + /* fill the row and column indicws */ + if((rows_out = BATnew(TYPE_void, TYPE_int, cellsNum, TRANSIENT)) == NULL) { + GDKfree(rarray); + GDKfree(qarray); + GDKfree(els); + + BBPunfix(values_out->batCacheid); + return createException(MAL, "udf.arrayqr", "Problem creating BAT"); + } + if((cols_out = BATnew(TYPE_void, TYPE_int, cellsNum, TRANSIENT)) == NULL) { + GDKfree(rarray); + GDKfree(qarray); + GDKfree(els); + + BBPunfix(values_out->batCacheid); + BBPunfix(rows_out->batCacheid); + return createException(MAL, "udf.arrayqr", "Problem creating BAT"); + } + rowsVals = (int*)Tloc(rows_out, BUNfirst(rows_out)); + colsVals = (int*)Tloc(cols_out, BUNfirst(cols_out)); + for(rowNum=0; rowNum<rowsNum; rowNum++) { + for(colNum=0; colNum<colsNum; colNum++) { + rowsVals[rowNum*colsNum+colNum] = rowNum; + colsVals[rowNum*colsNum+colNum] = colNum; + } + } + + GDKfree(rarray); + GDKfree(qarray); + GDKfree(els); + + BBPkeepref(*rowsRes = rows_out->batCacheid); + BBPkeepref(*columnsRes = cols_out->batCacheid); + BBPkeepref(*valuesRes = values_out->batCacheid); + + return MAL_SUCCEED; +} + + diff --git a/sql/backends/monet5/UDF/udf.h b/sql/backends/monet5/UDF/udf.h --- a/sql/backends/monet5/UDF/udf.h +++ b/sql/backends/monet5/UDF/udf.h @@ -48,4 +48,5 @@ udf_export char* UDFqrq(bat *q, const ba udf_export char* qrUDF_bulk(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); udf_export char* narrowqrUDF_bulk(bat *rowsRes, bat* columnsRes, bat* valuesRes, const bat *rows, const bat *columns, const bat *values); +udf_export char* arrayqrUDF_bulk(bat *rowsRes, bat* columnsRes, bat* valuesRes, const unsigned int rowsNum, const unsigned int colsNum, const bat *values); #endif /* _SQL_UDF_H_ */ diff --git a/sql/backends/monet5/UDF/udf.mal b/sql/backends/monet5/UDF/udf.mal --- a/sql/backends/monet5/UDF/udf.mal +++ b/sql/backends/monet5/UDF/udf.mal @@ -60,3 +60,6 @@ address qrUDF_bulk; command narrowqr(rows:bat[:oid,:int], columns:bat[:oid,:int], values:bat[:oid,:dbl]) (:bat[:oid,:int], :bat[:oid,:int], :bat[:oid,:dbl]) address narrowqrUDF_bulk; + +command arrayqr(rows:int, columns:int, values:bat[:oid,:dbl]) (:bat[:oid,:int], :bat[:oid,:int], :bat[:oid,:dbl]) +address arrayqrUDF_bulk; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list