Changeset: 8813b6090718 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8813b6090718
Modified Files:
        monetdb5/modules/kernel/arrays.c
Branch: arrays
Log Message:

new QR version that works for rectangular arrays


diffs (217 lines):

diff --git a/monetdb5/modules/kernel/arrays.c b/monetdb5/modules/kernel/arrays.c
--- a/monetdb5/modules/kernel/arrays.c
+++ b/monetdb5/modules/kernel/arrays.c
@@ -935,108 +935,6 @@ str ALGnonDimensionThetasubselect1(ptr *
        return ALGnonDimensionThetasubselect2(dimsRes, oidsRes, values, dims, 
NULL, NULL, val, op);
 }
 
-str ALGnonDimensionQRDecomposition(bat *oidsRes, ptr *dimsRes,  const bat* 
vals, const ptr *dims)
-{
-       gdk_array *array = (gdk_array*)*dims;
-       gdk_array *aCopy = NULL;
-       BAT *b;
-    dbl *elements = NULL, *new_elements = NULL; 
-    unsigned int max;
-    unsigned int size;
-    BUN j; 
-
-    dbl *qarray = NULL, *rarray = NULL;
-    BUN i, k;
-    dbl s = 0; 
-
-    // we do not change array structure, all dimensions must be the same
-    aCopy = arrayCopy(array);   
-    max = array->dims[0]->max;
-    *dimsRes = aCopy;  
-
-    size = max + 1;
-
-    if((b = BATnew(TYPE_void, TYPE_dbl, size*size, TRANSIENT)) == NULL)  
-        return NULL;        
-
-    elements = (dbl*) Tloc(BATdescriptor(*vals), 
BUNfirst(BATdescriptor(*vals)));      
-    new_elements = (dbl*) Tloc(b, BUNfirst(b));         
-
-    qarray = (double*)malloc(size*size*sizeof(double));
-    rarray = (double*)malloc(size*size*sizeof(double));
-   
-
-
-    // resulting bat calculation    
-
-    for (j = 0; j < size*size; j++)
-       {
-           new_elements[j] = elements[j];
-       }  
-
-
-    for (k = 0; k <= max; k++)
-    {
-
-       s = 0;
-       for (j = 0; j <= max; j++)
-       {
-               s = s + new_elements[k + (max - j) * size] * new_elements[k + 
(max - j) * size];
-
-       }
-       rarray[k + k * size] = sqrt(s);
-       for (j = 0; j <= max; j++)
-       {
-               qarray[k + (max - j) * size] = new_elements[k + (max - j) * 
size]/rarray[k + k * size];
-
-       }
-       for (i = k + 1; i <= max; i++)
-       {
-               s = 0;          
-               for (j = 0; j <= max; j++)
-               {
-                       s = s + new_elements[i + (max - j)  * size] * qarray[k 
+ (max - j) * size];
-
-               }
-               rarray[i + k * size] = s;
-               for (j = 0; j <= max; j++)
-               {
-                       new_elements[i + (max - j) * size] = new_elements[i + 
(max - j) * size] - rarray[i + k * size] * qarray[k + (max - j) * size];
-               }
-           }
-
-    }
-    for (j = 0; j < size*size; j++)
-       {
-           new_elements[j] = qarray[j];
-       }  
-
-
-       BATsetcount(b, size*size);
-       b->tsorted = 0;
-       b->trevsorted = b->batCount <= 1;
-       b->tkey = 1;
-       b->tdense = (b->batCount <= 1 || b->batCount == b->batCount);
-       if (b->batCount == 1 || b->batCount == b->batCount)
-               b->tseqbase = b->hseqbase;
-       b->hsorted = 1;
-       b->hdense = 1;
-       b->hseqbase = 0;
-       b->hkey = 1;
-       b->hrevsorted = b->batCount <= 1;
-
-       free(rarray);
-       free(qarray);
-
-
-       BBPkeepref(*oidsRes = b->batCacheid);
-
-
-    return MAL_SUCCEED;
-}
-
-
-
 str ALGarrayCount(wrd *res, const ptr *array) {
        gdk_array *ar = (gdk_array*)*array;
        *res = arrayCellsNum(ar);
@@ -1061,3 +959,104 @@ str ALGprojectNonDimension(bat *result, 
        return ALGnonDimensionLeftfetchjoin1(result, (void*)&dimsCands, 
&oidsCands, vals, array);
 }
 
+str ALGnonDimensionQRDecomposition(bat *oidsRes, ptr *dimsRes,  const bat* 
vals, const ptr *dims)
+{
+    gdk_array *array = (gdk_array*)*dims;
+    gdk_array *aCopy = NULL;
+    BAT *b;
+    dbl *elements = NULL, *new_elements = NULL;
+    unsigned int maxX, maxY;
+    unsigned int sizeX, sizeY;
+    BUN j;
+
+    dbl *qarray = NULL, *rarray = NULL;
+    BUN i, k;
+    dbl s = 0;
+
+    // we do not change array structure, all dimensions must be the same
+    aCopy = arrayCopy(array);
+    maxX = array->dims[0]->max;
+    sizeX = maxX + 1;
+
+    maxY = array->dims[1]->max;
+    sizeY = maxY + 1;
+
+    *dimsRes = aCopy;
+
+    if((b = BATnew(TYPE_void, TYPE_dbl, sizeX*sizeY, TRANSIENT)) == NULL)
+        return NULL;
+
+    elements = (dbl*) Tloc(BATdescriptor(*vals), 
BUNfirst(BATdescriptor(*vals)));
+    new_elements = (dbl*) Tloc(b, BUNfirst(b));
+
+    qarray = (double*)malloc(sizeX*sizeY*sizeof(double));
+    rarray = (double*)malloc(sizeY*sizeY*sizeof(double));
+
+
+    // resulting bat calculation    
+
+    for (j = 0; j < sizeX*sizeY; j++)
+    {
+        new_elements[j] = elements[j];
+    }
+
+    for (k = 0; k <= maxY; k++)
+    {
+
+        s = 0;
+        for (j = 0; j <= maxX; j++)
+        {
+            s = s + new_elements[j + k * sizeX] * new_elements[j + k * sizeX];
+        }
+
+        rarray[k + k * sizeY] = sqrt(s);
+        for (j = 0; j <= maxX; j++)
+        {
+            qarray[j + k * sizeX] = new_elements[j + k * sizeX]/rarray[k + k * 
sizeY];
+
+        }
+        for (i = k + 1; i <= maxY; i++)
+        {
+            s = 0;
+            for (j = 0; j <= maxX; j++)
+            {
+                s = s + new_elements[j + i * sizeX] * qarray[j + k * sizeX];
+            }
+            rarray[k + i * sizeY] = s;
+            for (j = 0; j <= maxX; j++)
+            {
+                new_elements[j + i * sizeX] = new_elements[j + i * sizeX] - 
rarray[k + i * sizeY] * qarray[j + k * sizeX];
+            }
+        }
+    }
+    for (j = 0; j < sizeX*sizeY; j++)
+    {
+        new_elements[j] = qarray[j];
+    }
+
+
+    BATsetcount(b, sizeX*sizeY);
+    b->tsorted = 0;
+    b->trevsorted = b->batCount <= 1;
+    b->tkey = 1;
+    b->tdense = (b->batCount <= 1 || b->batCount == b->batCount);
+    if (b->batCount == 1 || b->batCount == b->batCount)
+        b->tseqbase = b->hseqbase;
+    b->hsorted = 1;
+    b->hdense = 1;
+    b->hseqbase = 0;
+    b->hkey = 1;
+    b->hrevsorted = b->batCount <= 1;
+
+    free(rarray);
+    free(qarray);
+
+
+    BBPkeepref(*oidsRes = b->batCacheid);
+
+
+    return MAL_SUCCEED;
+}
+
+
+
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to