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