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

Reply via email to