Changeset: 7bcf5e40718d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7bcf5e40718d
Modified Files:
        monetdb5/modules/kernel/arrays.c
        monetdb5/modules/kernel/arrays.h
        monetdb5/modules/kernel/arrays.mal
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_statement.h
        sql/include/sql_relation.h
        sql/server/rel_distribute.c
        sql/server/rel_dump.c
        sql/server/rel_optimizer.c
        sql/server/rel_select.c
        sql/server/rel_select.h
        sql/server/sql_parser.h
        sql/server/sql_parser.y
        sql/server/sql_scan.c
Branch: arrays
Log Message:

qqr decomposition


diffs (truncated from 685 to 300 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
@@ -933,6 +933,106 @@ 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) {
diff --git a/monetdb5/modules/kernel/arrays.h b/monetdb5/modules/kernel/arrays.h
--- a/monetdb5/modules/kernel/arrays.h
+++ b/monetdb5/modules/kernel/arrays.h
@@ -43,6 +43,8 @@ algebra_export str ALGprojectDimension(b
 algebra_export str ALGprojectNonDimension(bat *result, const bat *vals, const 
ptr *array);
 
 
+algebra_export str ALGnonDimensionQRDecomposition(bat *oidsRes, ptr *dimsRes, 
const bat* vals, const ptr *dims);
+
 
 
 algebra_export str ALGarrayCount(wrd *res, const ptr *array);
diff --git a/monetdb5/modules/kernel/arrays.mal 
b/monetdb5/modules/kernel/arrays.mal
--- a/monetdb5/modules/kernel/arrays.mal
+++ b/monetdb5/modules/kernel/arrays.mal
@@ -61,3 +61,8 @@ address ALGproject;
 #the dim will be ignored. only the array will be used
 command aggr.count(array:ptr) :wrd 
 address ALGarrayCount;
+
+
+command algebra.qqr_decomposition(vals:bat[:oid,:any], dims:ptr) 
(:bat[:oid,:dbl], :ptr)
+address ALGnonDimensionQRDecomposition;
+#comment "QQR decomposition"
\ No newline at end of file
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1421,6 +1421,7 @@ rel2bin_args( mvc *sql, sql_rel *rel, li
        case op_insert:
        case op_update:
        case op_delete:
+       case op_qqr:
                args = rel2bin_args(sql, rel->r, args);
                break;
        }
@@ -1683,6 +1684,42 @@ releqjoin( mvc *sql, list *l1, list *l2,
        return res;
 }
 
+
+static stmt *
+rel2bin_qqr(mvc *sql, sql_rel *rel, list *refs)
+{
+       node *n;
+       list *l;
+       stmt *left = NULL;
+
+
+       if (rel->l) 
+               left = subrel_bin(sql, rel->l, refs);
+       if (!left ) 
+               return NULL;
+
+       l = sa_list(sql->sa);
+       for( n = left->op4.lval->h; n; n = n->next ) {
+               stmt *s;
+               stmt *c = n->data;
+               char *rnme = table_name(sql->sa, c);
+               char *nme = column_name(sql->sa, c);
+               if (c->type == st_join)
+               {
+                       s = stmt_qqr(sql->sa, column(sql->sa, c) );
+               }
+               else
+               {
+                       s = column(sql->sa, c);
+               }
+               s = stmt_alias(sql->sa, s, rnme, nme);
+               list_append(l, s);
+
+       }
+       return stmt_list(sql->sa, l);
+}
+
+
 static stmt *
 rel2bin_join( mvc *sql, sql_rel *rel, list *refs)
 {
@@ -4761,6 +4798,10 @@ subrel_bin(mvc *sql, sql_rel *rel, list 
        case op_ddl:
                s = rel2bin_ddl(sql, rel, refs);
                break;
+       case op_qqr:
+               s = rel2bin_qqr(sql, rel, refs);
+               sql->type = Q_TABLE;
+               break;
        }
        if (s && rel_is_ref(rel)) {
                list_append(refs, rel);
diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -2958,6 +2958,31 @@ static int
                        renameVariable(mb, getArg(q, 1), "Y_%d", s->nr);
 
                } break;
+               case st_qqr: {
+
+                       int l = _dumpstmt(sql, mb, s->op1);
+                       int arraySecondVar = -1;
+
+                       if (l < 0)
+                               return -1;
+
+                       q = newStmt1(mb, algebraRef, "qqr_decomposition");
+
+                       setVarType(mb, getArg(q, 0), newBatType(TYPE_oid, 
TYPE_dbl));
+                       setVarUDFtype(mb, getArg(q, 0));
+
+                       q = pushReturn(mb, q, newTmpVariable(mb, TYPE_ptr));
+                       q = pushArgument(mb, q, l);
+
+                       snprintf(nme, SMALLBUFSIZ, "Y_%d", l);
+            if((arraySecondVar = findVariable(mb, nme)) >= 0)
+                       q = pushArgument(mb, q, arraySecondVar);
+
+                       s->nr = getDestVar(q);
+                       renameVariable(mb, getArg(q, 1), "Y_%d", s->nr);
+                               return s->nr;
+               } break;
+
                }
                if (mb->errors)
                        return -1;
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -327,6 +327,7 @@ stmt_deps(list *dep_list, stmt *s, int d
                        case st_mbrselect:
                        case st_uselect:
                        case st_uselect2:
+                       case st_qqr:
                                if (s->op1)
                                        push(s->op1);
                                if (s->op2)
@@ -813,6 +814,18 @@ stmt* stmt_dimension(sql_allocator *sa, 
        return d;
 }
 
+
+extern stmt *stmt_qqr(sql_allocator *sa, stmt *op1)
+{
+       stmt *s = stmt_create(sa, st_qqr);
+
+       s->op1 = op1;
+       s->nrcols = 2;
+
+       return s;
+
+}
+
 stmt *
 stmt_genselect(sql_allocator *sa, stmt *lops, stmt *rops, sql_subfunc *f, stmt 
*sub)
 {
@@ -1263,6 +1276,7 @@ tail_type(stmt *st)
        case st_alias:
        case st_gen_group:
        case st_order:
+       case st_qqr:
                return tail_type(st->op1);
 
        case st_list:
diff --git a/sql/backends/monet5/sql_statement.h 
b/sql/backends/monet5/sql_statement.h
--- a/sql/backends/monet5/sql_statement.h
+++ b/sql/backends/monet5/sql_statement.h
@@ -101,7 +101,8 @@ typedef enum stmt_type {
        st_assign,
 
 //     st_cells,
-       st_dimension
+       st_dimension,
+       st_qqr,
 } st_type;
 
 /* flag to indicate anti join/select */
@@ -186,6 +187,8 @@ extern stmt *stmt_uselect(sql_allocator 
        2 ==   l <= x <  h
        3 ==   l <= x <= h
        */
+
+extern stmt *stmt_qqr(sql_allocator *sa, stmt *op1);       
 extern stmt *stmt_uselect2(sql_allocator *sa, stmt *op1, stmt *op2, stmt *op3, 
int cmp, stmt *sub);
 extern stmt *stmt_genselect(sql_allocator *sa, stmt *lops, stmt *rops, 
sql_subfunc *f, stmt *sub);
 
diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -145,7 +145,8 @@ typedef enum operator_type {
        op_sample,
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to