Changeset: 4b2db9afe7f1 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4b2db9afe7f1 Modified Files: monetdb5/modules/mal/calc_arrays.c monetdb5/modules/mal/calc_arrays.h monetdb5/modules/mal/calc_arrays.mal Branch: arrays Log Message:
matrix addition diffs (truncated from 329 to 300 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 @@ -2435,47 +2435,7 @@ str CMDscalarMULenlarge(Client cntxt, Ma return MAL_SUCCEED; } -str CMDscalarADDsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { - BAT *s=NULL; - - int resType, valType; - - /*get the arguments */ - bat *result = getArgReference_bat(stk, pci, 0); - BAT *resBAT = NULL; - - ptr *array_out = getArgReference(stk, pci, 1); - ptr *array_in = getArgReference(stk, pci, 4); - - bat *vals = getArgReference_bat(stk, pci, 3); - BAT *valsBAT = BATdescriptor(*vals); - if(!valsBAT) - return createException(MAL, "calc.*", RUNTIME_OBJECT_MISSING); - - /* get the types of the input and output arguments */ - resType = getColumnType(getArgType(mb, pci, 0)); - valType = stk->stk[getArg(pci, 1)].vtype; - if (resType == TYPE_any) - resType = calctype(valType, BATttype(valsBAT)); - - resBAT = BATcalccstadd(&stk->stk[getArg(pci, 2)], valsBAT, s, resType, 1); - - if (resBAT == NULL) { - BBPunfix(valsBAT->batCacheid); - return createException(MAL, "calc.*", OPERATION_FAILED); - } - - - (void) cntxt; - BBPunfix(valsBAT->batCacheid); - BBPkeepref(*result = resBAT->batCacheid); - *array_out = arrayCopy((gdk_array*)*array_in); - - return MAL_SUCCEED; -} - - -str CMDscalarADDenlarge(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { +static str CMDscalarADD(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, int (*typefunc)(int, int)) { BAT *s=NULL; int resType, valType; @@ -2490,23 +2450,21 @@ str CMDscalarADDenlarge(Client cntxt, Ma bat *vals = getArgReference_bat(stk, pci, 3); BAT *valsBAT = BATdescriptor(*vals); if(!valsBAT) - return createException(MAL, "calc.*", RUNTIME_OBJECT_MISSING); + return createException(MAL, "calc.+", RUNTIME_OBJECT_MISSING); /* get the types of the input and output arguments */ resType = getColumnType(getArgType(mb, pci, 0)); valType = stk->stk[getArg(pci, 1)].vtype; if (resType == TYPE_any) - resType = calctypeenlarge(valType, BATttype(valsBAT)); + resType = (*typefunc)(valType, BATttype(valsBAT)); - resBAT = BATcalccstadd(&stk->stk[getArg(pci, 2)], valsBAT, s, resType, 1); + resBAT = BATcalccstadd(&stk->stk[getArg(pci, 2)], valsBAT, s, resType, 1); if (resBAT == NULL) { BBPunfix(valsBAT->batCacheid); - return createException(MAL, "calc.*", OPERATION_FAILED); + return createException(MAL, "calc.+", OPERATION_FAILED); } - - (void) cntxt; BBPunfix(valsBAT->batCacheid); BBPkeepref(*result = resBAT->batCacheid); *array_out = arrayCopy((gdk_array*)*array_in); @@ -2514,6 +2472,86 @@ str CMDscalarADDenlarge(Client cntxt, Ma return MAL_SUCCEED; } +str CMDscalarADDsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { + (void) cntxt; + + return CMDscalarADD(mb, stk, pci, calctype); + +} + +str CMDscalarADDenlarge(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { + (void) cntxt; + + return CMDscalarADD(mb, stk, pci, calctypeenlarge); +} + +static str CMDarrayADD(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, int (*typefunc)(int, int)) { + BAT *resBAT, *valsLeftBAT, *valsRightBAT, *s=NULL; + int i; + int resType, valType; + + bat *result = getArgReference_bat(stk, pci, 0); + bat *valsLeft = getArgReference_bat(stk, pci, 2); + bat *valsRight = getArgReference_bat(stk, pci, 4); + + ptr *array_out = getArgReference(stk, pci, 1); + /* there are two arrays. one of each of the columns that are being added */ + ptr *arrayLeft = getArgReference(stk, pci, 3); + ptr *arrayRight = getArgReference(stk, pci, 5); + + /* compare the arrays. they should have dimension of the same size */ + gdk_array *arL = (gdk_array*)*arrayLeft; + gdk_array *arR = (gdk_array*)*arrayRight; + int dimsNumL = arL->dimsNum; + int dimsNumR = arR->dimsNum; + + if(dimsNumL != dimsNumR) + return createException(MAL, "calc.+", "Arrays should have the same number of dimensions"); + for(i=0; i<dimsNumL; i++) + if(arL->dims[i]->elsNum != arR->dims[i]->elsNum) + return createException(MAL, "calc.+", "Dimensions should be of the same size"); + + if(!(valsLeftBAT = BATdescriptor(*valsLeft))) + return createException(MAL, "calc.+", RUNTIME_OBJECT_MISSING); + if(!(valsRightBAT = BATdescriptor(*valsRight))) { + BBPunfix(valsLeftBAT->batCacheid); + return createException(MAL, "calc.+", RUNTIME_OBJECT_MISSING); + } + + resType = getColumnType(getArgType(mb, pci, 0)); + valType = stk->stk[getArg(pci, 1)].vtype; + if (resType == TYPE_any) + resType = (*typefunc)(valType, BATttype(valsRightBAT)); + + resBAT = BATcalcadd(valsLeftBAT, valsRightBAT, s, resType, 1); + if (resBAT == NULL) { + BBPunfix(valsLeftBAT->batCacheid); + BBPunfix(valsRightBAT->batCacheid); + return createException(MAL, "calc.+", OPERATION_FAILED); + } + + BBPunfix(valsLeftBAT->batCacheid); + BBPunfix(valsRightBAT->batCacheid); + BBPkeepref(*result = resBAT->batCacheid); + *array_out = arrayCopy(arL); + + return MAL_SUCCEED; +} + +str CMDarrayADDsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { + (void) cntxt; + + return CMDarrayADD(mb, stk, pci, calctype); +} + +str CMDarrayADDenlarge(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { + (void) cntxt; + + return CMDarrayADD(mb, stk, pci, calctypeenlarge); +} + + + #define checkEqual(TPE1, dimLeft, TPE2, dimRight, vals) \ do { \ BUN i=0; \ 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 @@ -32,6 +32,8 @@ str CMDscalarMULenlarge(Client cntxt, Ma str CMDdimensionsADDsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str CMDscalarADDsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); str CMDscalarADDenlarge(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); +str CMDarrayADDsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); +str CMDarrayADDenlarge(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); 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 @@ -168,7 +168,141 @@ comment "Return V + B, guarantee no over pattern calc.+(v:flt,b:bat[:oid,:flt], array:ptr) (:bat[:oid,:dbl], :ptr) address CMDscalarADDenlarge comment "Return V + B, guarantee no overflow by returning larger type"; +pattern calc.+(b1:bat[:oid,:bte], ar1:ptr, b2:bat[:oid,:bte], ar2:ptr) (:bat[:oid,:sht], :ptr) address CMDarrayADDenlarge +comment "Return B1 + B2, guarantee no overflow by returning larger type"; +pattern calc.+(b1:bat[:oid,:bte], ar1:ptr, b2:bat[:oid,:sht], ar2:ptr) (:bat[:oid,:int], :ptr) address CMDarrayADDenlarge +comment "Return B1 + B2, guarantee no overflow by returning larger type"; +pattern calc.+(b1:bat[:oid,:bte], ar1:ptr, b2:bat[:oid,:int], ar2:ptr) (:bat[:oid,:lng], :ptr) address CMDarrayADDenlarge +comment "Return B1 + B2, guarantee no overflow by returning larger type"; +pattern calc.+(b1:bat[:oid,:bte], ar1:ptr, b2:bat[:oid,:flt], ar2:ptr) (:bat[:oid,:dbl], :ptr) address CMDarrayADDenlarge +comment "Return B1 + B2, guarantee no overflow by returning larger type"; +pattern calc.+(b1:bat[:oid,:sht], ar1:ptr, b2:bat[:oid,:bte], ar2:ptr) (:bat[:oid,:int], :ptr) address CMDarrayADDenlarge +comment "Return B1 + B2, guarantee no overflow by returning larger type"; +pattern calc.+(b1:bat[:oid,:sht], ar1:ptr, b2:bat[:oid,:sht], ar2:ptr) (:bat[:oid,:int], :ptr) address CMDarrayADDenlarge +comment "Return B1 + B2, guarantee no overflow by returning larger type"; +pattern calc.+(b1:bat[:oid,:sht], ar1:ptr, b2:bat[:oid,:int], ar2:ptr) (:bat[:oid,:lng], :ptr) address CMDarrayADDenlarge +comment "Return B1 + B2, guarantee no overflow by returning larger type"; +pattern calc.+(b1:bat[:oid,:sht], ar1:ptr, b2:bat[:oid,:flt], ar2:ptr) (:bat[:oid,:dbl], :ptr) address CMDarrayADDenlarge +comment "Return B1 + B2, guarantee no overflow by returning larger type"; +pattern calc.+(b1:bat[:oid,:int], ar1:ptr, b2:bat[:oid,:bte], ar2:ptr) (:bat[:oid,:lng], :ptr) address CMDarrayADDenlarge +comment "Return B1 + B2, guarantee no overflow by returning larger type"; +pattern calc.+(b1:bat[:oid,:int], ar1:ptr, b2:bat[:oid,:sht], ar2:ptr) (:bat[:oid,:lng], :ptr) address CMDarrayADDenlarge +comment "Return B1 + B2, guarantee no overflow by returning larger type"; +pattern calc.+(b1:bat[:oid,:int], ar1:ptr, b2:bat[:oid,:int], ar2:ptr) (:bat[:oid,:lng], :ptr) address CMDarrayADDenlarge +comment "Return B1 + B2, guarantee no overflow by returning larger type"; +pattern calc.+(b1:bat[:oid,:int], ar1:ptr, b2:bat[:oid,:flt], ar2:ptr) (:bat[:oid,:dbl], :ptr) address CMDarrayADDenlarge +comment "Return B1 + B2, guarantee no overflow by returning larger type"; +pattern calc.+(b1:bat[:oid,:lng], ar1:ptr, b2:bat[:oid,:flt], ar2:ptr) (:bat[:oid,:dbl], :ptr) address CMDarrayADDenlarge +comment "Return B1 + B2, guarantee no overflow by returning larger type"; +pattern calc.+(b1:bat[:oid,:flt], ar1:ptr, b2:bat[:oid,:bte], ar2:ptr) (:bat[:oid,:dbl], :ptr) address CMDarrayADDenlarge +comment "Return B1 + B2, guarantee no overflow by returning larger type"; +pattern calc.+(b1:bat[:oid,:flt], ar1:ptr, b2:bat[:oid,:sht], ar2:ptr) (:bat[:oid,:dbl], :ptr) address CMDarrayADDenlarge +comment "Return B1 + B2, guarantee no overflow by returning larger type"; +pattern calc.+(b1:bat[:oid,:flt], ar1:ptr, b2:bat[:oid,:int], ar2:ptr) (:bat[:oid,:dbl], :ptr) address CMDarrayADDenlarge +comment "Return B1 + B2, guarantee no overflow by returning larger type"; +pattern calc.+(b1:bat[:oid,:flt], ar1:ptr, b2:bat[:oid,:lng], ar2:ptr) (:bat[:oid,:dbl], :ptr) address CMDarrayADDenlarge +comment "Return B1 + B2, guarantee no overflow by returning larger type"; +pattern calc.+(b1:bat[:oid,:flt], ar1:ptr, b2:bat[:oid,:flt], ar2:ptr) (:bat[:oid,:dbl], :ptr) address CMDarrayADDenlarge +comment "Return B1 + B2, guarantee no overflow by returning larger type"; +pattern calc.+(b1:bat[:oid,:bte], ar1:ptr, b2:bat[:oid,:bte], ar2:ptr) (:bat[:oid,:bte], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:bte], ar1:ptr, b2:bat[:oid,:sht], ar2:ptr) (:bat[:oid,:sht], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:bte], ar1:ptr, b2:bat[:oid,:int], ar2:ptr) (:bat[:oid,:int], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:bte], ar1:ptr, b2:bat[:oid,:wrd], ar2:ptr) (:bat[:oid,:wrd], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:bte], ar1:ptr, b2:bat[:oid,:lng], ar2:ptr) (:bat[:oid,:lng], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:bte], ar1:ptr, b2:bat[:oid,:flt], ar2:ptr) (:bat[:oid,:flt], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:bte], ar1:ptr, b2:bat[:oid,:dbl], ar2:ptr) (:bat[:oid,:dbl], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:sht], ar1:ptr, b2:bat[:oid,:bte], ar2:ptr) (:bat[:oid,:sht], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:sht], ar1:ptr, b2:bat[:oid,:sht], ar2:ptr) (:bat[:oid,:sht], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:sht], ar1:ptr, b2:bat[:oid,:int], ar2:ptr) (:bat[:oid,:int], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:sht], ar1:ptr, b2:bat[:oid,:wrd], ar2:ptr) (:bat[:oid,:wrd], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:sht], ar1:ptr, b2:bat[:oid,:lng], ar2:ptr) (:bat[:oid,:lng], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:sht], ar1:ptr, b2:bat[:oid,:flt], ar2:ptr) (:bat[:oid,:flt], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:sht], ar1:ptr, b2:bat[:oid,:dbl], ar2:ptr) (:bat[:oid,:dbl], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:int], ar1:ptr, b2:bat[:oid,:bte], ar2:ptr) (:bat[:oid,:int], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:int], ar1:ptr, b2:bat[:oid,:sht], ar2:ptr) (:bat[:oid,:int], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:int], ar1:ptr, b2:bat[:oid,:int], ar2:ptr) (:bat[:oid,:int], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:int], ar1:ptr, b2:bat[:oid,:wrd], ar2:ptr) (:bat[:oid,:wrd], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:int], ar1:ptr, b2:bat[:oid,:lng], ar2:ptr) (:bat[:oid,:lng], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:int], ar1:ptr, b2:bat[:oid,:flt], ar2:ptr) (:bat[:oid,:flt], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:int], ar1:ptr, b2:bat[:oid,:dbl], ar2:ptr) (:bat[:oid,:dbl], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:wrd], ar1:ptr, b2:bat[:oid,:bte], ar2:ptr) (:bat[:oid,:wrd], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:wrd], ar1:ptr, b2:bat[:oid,:sht], ar2:ptr) (:bat[:oid,:wrd], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:wrd], ar1:ptr, b2:bat[:oid,:int], ar2:ptr) (:bat[:oid,:wrd], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:wrd], ar1:ptr, b2:bat[:oid,:wrd], ar2:ptr) (:bat[:oid,:wrd], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:wrd], ar1:ptr, b2:bat[:oid,:lng], ar2:ptr) (:bat[:oid,:lng], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:wrd], ar1:ptr, b2:bat[:oid,:flt], ar2:ptr) (:bat[:oid,:flt], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:wrd], ar1:ptr, b2:bat[:oid,:dbl], ar2:ptr) (:bat[:oid,:dbl], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:lng], ar1:ptr, b2:bat[:oid,:bte], ar2:ptr) (:bat[:oid,:lng], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:lng], ar1:ptr, b2:bat[:oid,:sht], ar2:ptr) (:bat[:oid,:lng], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:lng], ar1:ptr, b2:bat[:oid,:int], ar2:ptr) (:bat[:oid,:lng], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:lng], ar1:ptr, b2:bat[:oid,:wrd], ar2:ptr) (:bat[:oid,:lng], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:lng], ar1:ptr, b2:bat[:oid,:lng], ar2:ptr) (:bat[:oid,:lng], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:lng], ar1:ptr, b2:bat[:oid,:flt], ar2:ptr) (:bat[:oid,:flt], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:lng], ar1:ptr, b2:bat[:oid,:dbl], ar2:ptr) (:bat[:oid,:dbl], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:flt], ar1:ptr, b2:bat[:oid,:bte], ar2:ptr) (:bat[:oid,:flt], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:flt], ar1:ptr, b2:bat[:oid,:sht], ar2:ptr) (:bat[:oid,:flt], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:flt], ar1:ptr, b2:bat[:oid,:int], ar2:ptr) (:bat[:oid,:flt], :ptr) address CMDarrayADDsignal +comment "Return B1 + B2, signal error on overflow"; +pattern calc.+(b1:bat[:oid,:flt], ar1:ptr, b2:bat[:oid,:wrd], ar2:ptr) (:bat[:oid,:flt], :ptr) address CMDarrayADDsignal _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list