Changeset: d6464d16db61 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d6464d16db61 Modified Files: monetdb5/modules/mal/calc_arrays.c monetdb5/modules/mal/calc_arrays.h monetdb5/modules/mal/calc_arrays.mal Branch: arrays Log Message:
calc.+ diffs (123 lines): diff --git a/monetdb5/modules/mal/calc_arrays.c b/monetdb5/modules/mal/calc_arrays.c --- a/monetdb5/modules/mal/calc_arrays.c +++ b/monetdb5/modules/mal/calc_arrays.c @@ -2289,10 +2289,91 @@ str CMDdimensionsEQ(ptr* dimsRes, bat* b *dimsRes = arrayCopy((gdk_array*)*dims1); BBPkeepref((*batRes = resBAT->batCacheid)); (void)*dims2; -/* - if (VARcalceq(&stk->stk[getArg(pci, 0)], &stk->stk[getArg(pci, 1)], &stk->stk[getArg(pci, 2)]) != GDK_SUCCEED) - return mythrow(MAL, "calc.==", OPERATION_FAILED); -*/ + return MAL_SUCCEED; } +#define addDims(TPE1, dimLeft, TPE2, dimRight, vals) \ +do { \ + BUN i=0; \ + TPE1 valLeft; \ + TPE1 maxLeft = *(TPE1*)dimLeft->max; \ + TPE1 stepLeft = *(TPE1*)dimLeft->step; \ + TPE2 valRight; \ + TPE2 maxRight = *(TPE2*)dimRight->max; \ + TPE2 stepRight = *(TPE2*)dimRight->step; \ +\ + for(valLeft = *(TPE1*)dimLeft->min ; valLeft<=maxLeft; valLeft += stepLeft) {\ + for(valRight = *(TPE2*)dimRight->min ; valRight<=maxRight; valRight += stepRight) {\ + vals[i] = (valLeft + valRight); \ + i++; \ + }\ + }\ +} while(0) + + +str CMDdimensionsADDsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { + ptr *array_out = getArgReference_ptr(stk, pci, 0); + bat *batRes = getArgReference_bat(stk, pci, 1); + + ptr *dimLeft_ptr = getArgReference_ptr(stk, pci, 2); + ptr *dimsLeft = getArgReference_ptr(stk, pci, 3); + ptr *dimRight_ptr = getArgReference_ptr(stk, pci, 4); + //It is the same with dimsLeft ptr *dimsRight = getArgReference_ptr(stk, pci, 5); + + gdk_analytic_dimension *dimLeft = (gdk_analytic_dimension*)*dimLeft_ptr; + gdk_analytic_dimension *dimRight = (gdk_analytic_dimension*)*dimRight_ptr; + + BUN elsNum; + BAT *resBAT; + + (void)cntxt; + (void)mb; + + if(dimLeft->type != dimRight->type) + return createException(MAL, "calc.+", "Dimensions of different type"); + + elsNum = dimLeft->elsNum*dimRight->elsNum; + if(!(resBAT = BATnew(TYPE_void, dimLeft->type, elsNum, TRANSIENT))) + return createException(MAL, "calc.+", MAL_MALLOC_FAIL); + + switch(dimLeft->type) { + case TYPE_bte: { + bte *vals = (bte*)Tloc(resBAT, BUNfirst(resBAT)); + addDims(bte, dimLeft, bte, dimRight, vals); + } break; + case TYPE_int: { + int *vals = (int*)Tloc(resBAT, BUNfirst(resBAT)); + addDims(int, dimLeft, int, dimRight, vals); + } break; + case TYPE_wrd: { + wrd *vals = (wrd*)Tloc(resBAT, BUNfirst(resBAT)); + addDims(wrd, dimLeft, wrd, dimRight, vals); + } break; + case TYPE_oid: { + oid *vals = (oid*)Tloc(resBAT, BUNfirst(resBAT)); + addDims(oid, dimLeft, oid, dimRight, vals); + } break; + case TYPE_dbl: { + double *vals = (double*)Tloc(resBAT, BUNfirst(resBAT)); + addDims(double, dimLeft, double, dimRight, vals); + } break; + case TYPE_lng: { + long *vals = (long*)Tloc(resBAT, BUNfirst(resBAT)); + addDims(long, dimLeft, long, dimRight, vals); + } break; + case TYPE_flt: { + float *vals = (float*)Tloc(resBAT, BUNfirst(resBAT)); + addDims(float, dimLeft, float, dimRight, vals); + } break; + default: + return createException(MAL, "calc.+", "Dimension type not recognised"); + } + + /*the array does not change */ + *array_out = arrayCopy((gdk_array*)*dimsLeft); + BBPkeepref((*batRes = resBAT->batCacheid)); + + return MAL_SUCCEED; +} + diff --git a/monetdb5/modules/mal/calc_arrays.h b/monetdb5/modules/mal/calc_arrays.h --- a/monetdb5/modules/mal/calc_arrays.h +++ b/monetdb5/modules/mal/calc_arrays.h @@ -15,7 +15,7 @@ str CMDdimensionCONVERT_oid(ptr *dimRes, //str CMDdimensionCONVERT_str(ptr *dimRes, ptr *dimsRes, const ptr *dim, const ptr *dims); str CMDdimensionMULsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); -str CMDdimensionsADDsignal(ptr* dimsRes, bat* batRes, const ptr* dim1, const ptr* dims1, const ptr* dim2, const ptr* dims2); +str CMDdimensionsADDsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str CMDdimensionsEQ(ptr* dimsRes, bat* batRes, const ptr* dim1, const ptr* dims1, const ptr* dim2, const ptr* dims2); #endif /*_CALC_ARRAYS_H*/ diff --git a/monetdb5/modules/mal/calc_arrays.mal b/monetdb5/modules/mal/calc_arrays.mal --- a/monetdb5/modules/mal/calc_arrays.mal +++ b/monetdb5/modules/mal/calc_arrays.mal @@ -25,7 +25,7 @@ #comment "Unary dimension values - 1"; #+ -command calc.+(dim1:ptr, dims1:ptr, dim2:ptr, dims2:ptr) (:ptr, :bat[:oid,:dbl]) address CMDdimensionsADDsingnal_dbl +pattern calc.+(dim1:ptr, dims1:ptr, dim2:ptr, dims2:ptr) (:ptr, :bat[:oid,:lng]) address CMDdimensionsADDsingnal comment "Return a bat with the sum of the two dimensions"; #pattern +(v:bte, dim:ptr, dims:ptr) (:ptr, :ptr) address CMDdimensionADDsignal #comment "Return V + dimension values, guarantee no overflow by returning larger type"; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list