Changeset: 292efb270d6d for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=292efb270d6d 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:
merged heads 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 @@ -935,6 +935,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,9 @@ 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"; + 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 @@ -2874,6 +2874,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