void compute_fixed_weight(int *weight, const double *pbSize, const int *dmask, const int *bCumprod, const int ND, const int diffdim){ int i, j; int *eff_cumprod, *subv, *diffsize, *diff_cumprod; subv = malloc(diffdim * sizeof(int)); eff_cumprod = malloc(diffdim * sizeof(int)); diffsize = malloc(diffdim * sizeof(int)); diff_cumprod = malloc(diffdim * sizeof(int)); for(i=0; i<diffdim; i++){ eff_cumprod[i] = bCumprod[dmask[i]]; diffsize[i] = (int)pbSize[dmask[i]]; } diff_cumprod[0] = 1; for(i=0; i<diffdim-1; i++){ diff_cumprod[i+1] = diff_cumprod[i] * diffsize[i]; } for(i=0; i<ND; i++){ ind_subv(i, diff_cumprod, diffdim, subv); weight[i] = 0; for(j=0; j<diffdim; j++){ weight[i] += eff_cumprod[j] * subv[j]; } } free(eff_cumprod); free(subv); free(diffsize); free(diff_cumprod); }
void multiply_spPot_by_spPot(mxArray *bigPot, const mxArray *smallPot){ int i, j, count, bdim, sdim, NB, NZB, NZS, position, bindex, sindex, nzCounts=0; int *mask, *index, *result, *bir, *sir, *bjc, *sjc, *bCumprod, *sCumprod, *bsubv, *ssubv; double *bigTable, *pbDomain, *psDomain, *pbSize, *psSize, *bpr, *spr, value; mxArray *pTemp; pTemp = mxGetField(bigPot, 0, "domain"); pbDomain = mxGetPr(pTemp); bdim = mxGetNumberOfElements(pTemp); pTemp = mxGetField(smallPot, 0, "domain"); psDomain = mxGetPr(pTemp); sdim = mxGetNumberOfElements(pTemp); pTemp = mxGetField(bigPot, 0, "sizes"); pbSize = mxGetPr(pTemp); pTemp = mxGetField(smallPot, 0, "sizes"); psSize = mxGetPr(pTemp); NB = 1; for(i=0; i<bdim; i++){ NB *= (int)pbSize[i]; } pTemp = mxGetField(bigPot, 0, "T"); bpr = mxGetPr(pTemp); bir = mxGetIr(pTemp); bjc = mxGetJc(pTemp); NZB = bjc[1]; pTemp = mxGetField(smallPot, 0, "T"); spr = mxGetPr(pTemp); sir = mxGetIr(pTemp); sjc = mxGetJc(pTemp); NZS = sjc[1]; bigTable = malloc(NZB * sizeof(double)); index = malloc(NZB * sizeof(double)); mask = malloc(sdim * sizeof(int)); bCumprod = malloc(bdim * sizeof(int)); sCumprod = malloc(sdim * sizeof(int)); bsubv = malloc(bdim * sizeof(int)); ssubv = malloc(sdim * sizeof(int)); for(i=0; i<NZB; i++){ bigTable[i] = 0; } count = 0; for(i=0; i<sdim; i++){ for(j=0; j<bdim; j++){ if(psDomain[i] == pbDomain[j]){ mask[count] = j; count++; break; } } } bCumprod[0] = 1; for(i=0; i<bdim-1; i++){ bCumprod[i+1] = bCumprod[i] * (int)pbSize[i]; } sCumprod[0] = 1; for(i=0; i<sdim-1; i++){ sCumprod[i+1] = sCumprod[i] * (int)psSize[i]; } for(i=0; i<NZB; i++){ value = bpr[i]; bindex = bir[i]; ind_subv(bindex, bCumprod, bdim, bsubv); for(j=0; j<sdim; j++){ ssubv[j] = bsubv[mask[j]]; } sindex = subv_ind(sdim, sCumprod, ssubv); result = (int *) bsearch(&sindex, sir, NZS, sizeof(int), compare); if(result){ position = result - sir; value *= spr[position]; bigTable[nzCounts] = value; index[nzCounts] = bindex; nzCounts++; } } pTemp = mxGetField(bigPot, 0, "T"); if(pTemp)mxDestroyArray(pTemp); pTemp = convert_table_to_sparse(bigTable, index, nzCounts, NB); mxSetField(bigPot, 0, "T", pTemp); free(bigTable); free(index); free(mask); free(bCumprod); free(sCumprod); free(bsubv); free(ssubv); }
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){ int i, j, NS, NZB, count, bdim, match, domain, bindex, sindex, nzCounts=0; int *observed, *bsubv, *ssubv, *bir, *sir, *bjc, *sjc, *mask, *ssize, *bcumprod, *scumprod; double *pDomain, *pSize, *bpr, *spr; mxArray *pTemp; pTemp = mxGetField(prhs[0], 0, "CPT"); bpr = mxGetPr(pTemp); bir = mxGetIr(pTemp); bjc = mxGetJc(pTemp); NZB = bjc[1]; pTemp = mxGetField(prhs[0], 0, "sizes"); pSize = mxGetPr(pTemp); pDomain = mxGetPr(prhs[1]); bdim = mxGetNumberOfElements(prhs[1]); mask = malloc(bdim * sizeof(int)); ssize = malloc(bdim * sizeof(int)); observed = malloc(bdim * sizeof(int)); for(i=0; i<bdim; i++){ ssize[i] = (int)pSize[i]; } count = 0; for(i=0; i<bdim; i++){ domain = (int)pDomain[i] - 1; pTemp = mxGetCell(prhs[2], domain); if(pTemp){ mask[count] = i; ssize[i] = 1; observed[count] = (int)mxGetScalar(pTemp) - 1; count++; } } if(count == 0){ pTemp = mxGetField(prhs[0], 0, "CPT"); plhs[0] = mxDuplicateArray(pTemp); free(mask); free(ssize); free(observed); return; } bsubv = malloc(bdim * sizeof(int)); ssubv = malloc(count * sizeof(int)); bcumprod = malloc(bdim * sizeof(int)); scumprod = malloc(bdim * sizeof(int)); NS = 1; for(i=0; i<bdim; i++){ NS *= ssize[i]; } plhs[0] = mxCreateSparse(NS, 1, NS, mxREAL); spr = mxGetPr(plhs[0]); sir = mxGetIr(plhs[0]); sjc = mxGetJc(plhs[0]); sjc[0] = 0; sjc[1] = NS; bcumprod[0] = 1; scumprod[0] = 1; for(i=0; i<bdim-1; i++){ bcumprod[i+1] = bcumprod[i] * (int)pSize[i]; scumprod[i+1] = scumprod[i] * ssize[i]; } nzCounts = 0; for(i=0; i<NZB; i++){ bindex = bir[i]; ind_subv(bindex, bcumprod, bdim, bsubv); for(j=0; j<count; j++){ ssubv[j] = bsubv[mask[j]]; } match = 1; for(j=0; j<count; j++){ if((ssubv[j]) != observed[j]){ match = 0; break; } } if(match){ spr[nzCounts] = bpr[i]; sindex = subv_ind(bdim, scumprod, bsubv); sir[nzCounts] = sindex; nzCounts++; } } reset_nzmax(plhs[0], NS, nzCounts); free(mask); free(ssize); free(observed); free(bsubv); free(ssubv); free(bcumprod); free(scumprod); }
void multiply_null_by_spPot(mxArray *bigPot, const mxArray *smallPot){ int i, j, count, count1, match, temp, bdim, sdim, diffdim, NB, NS, ND, NZB, NZS, bindex, sindex, nzCounts=0; int *samemask, *diffmask, *sir, *sjc, *bCumprod, *sCumprod, *ssubv, *sequence, *weight; double *bigTable, *pbDomain, *psDomain, *pbSize, *psSize, *spr; mxArray *pTemp, *pTemp1; pTemp = mxGetField(bigPot, 0, "domain"); pbDomain = mxGetPr(pTemp); bdim = mxGetNumberOfElements(pTemp); pTemp = mxGetField(smallPot, 0, "domain"); psDomain = mxGetPr(pTemp); sdim = mxGetNumberOfElements(pTemp); pTemp = mxGetField(bigPot, 0, "sizes"); pbSize = mxGetPr(pTemp); pTemp = mxGetField(smallPot, 0, "sizes"); psSize = mxGetPr(pTemp); NB = 1; for(i=0; i<bdim; i++){ NB *= (int)pbSize[i]; } NS = 1; for(i=0; i<sdim; i++){ NS *= (int)psSize[i]; } ND = NB / NS; if(ND == 1){ pTemp = mxGetField(bigPot, 0, "T"); if(pTemp)mxDestroyArray(pTemp); pTemp1 = mxGetField(smallPot, 0, "T"); pTemp = mxDuplicateArray(pTemp1); mxSetField(bigPot, 0, "T", pTemp); return; } pTemp = mxGetField(smallPot, 0, "T"); spr = mxGetPr(pTemp); sir = mxGetIr(pTemp); sjc = mxGetJc(pTemp); NZS = sjc[1]; NZB = ND * NZS; diffdim = bdim - sdim; sequence = malloc(NZB * 2 * sizeof(int)); bigTable = malloc(NZB * sizeof(double)); samemask = malloc(sdim * sizeof(int)); diffmask = malloc(diffdim * sizeof(int)); bCumprod = malloc(bdim * sizeof(int)); sCumprod = malloc(sdim * sizeof(int)); weight = malloc(ND * sizeof(int)); ssubv = malloc(sdim * sizeof(int)); count = 0; count1 = 0; for(i=0; i<bdim; i++){ match = 0; for(j=0; j<sdim; j++){ if(pbDomain[i] == psDomain[j]){ samemask[count] = i; match = 1; count++; break; } } if(match == 0){ diffmask[count1] = i; count1++; } } bCumprod[0] = 1; for(i=0; i<bdim-1; i++){ bCumprod[i+1] = bCumprod[i] * (int)pbSize[i]; } sCumprod[0] = 1; for(i=0; i<sdim-1; i++){ sCumprod[i+1] = sCumprod[i] * (int)psSize[i]; } count = 0; compute_fixed_weight(weight, pbSize, diffmask, bCumprod, ND, diffdim); for(i=0; i<NZS; i++){ sindex = sir[i]; ind_subv(sindex, sCumprod, sdim, ssubv); temp = 0; for(j=0; j<sdim; j++){ temp += ssubv[j] * bCumprod[samemask[j]]; } for(j=0; j<ND; j++){ bindex = weight[j] + temp; bigTable[nzCounts] = spr[i]; sequence[count] = bindex; count++; sequence[count] = nzCounts; nzCounts++; count++; } } pTemp = mxGetField(bigPot, 0, "T"); if(pTemp)mxDestroyArray(pTemp); qsort(sequence, nzCounts, sizeof(int) * 2, compare); pTemp = convert_ill_table_to_sparse(bigTable, sequence, nzCounts, NB); mxSetField(bigPot, 0, "T", pTemp); free(sequence); free(bigTable); free(samemask); free(diffmask); free(bCumprod); free(sCumprod); free(weight); free(ssubv); }
void multiply_spPot_by_fuPot(mxArray *bigPot, const mxArray *smallPot){ int i, j, count, bdim, sdim, NB, NZB, bindex, sindex, nzCounts=0; int *mask, *bir, *bjc, *rir, *rjc, *bCumprod, *sCumprod, *bsubv, *ssubv; double *pbDomain, *psDomain, *pbSize, *psSize, *bpr, *spr, *rpr, value; mxArray *pTemp, *pTemp1; pTemp = mxGetField(bigPot, 0, "domain"); pbDomain = mxGetPr(pTemp); bdim = mxGetNumberOfElements(pTemp); pTemp = mxGetField(smallPot, 0, "domain"); psDomain = mxGetPr(pTemp); sdim = mxGetNumberOfElements(pTemp); pTemp = mxGetField(bigPot, 0, "sizes"); pbSize = mxGetPr(pTemp); pTemp = mxGetField(smallPot, 0, "sizes"); psSize = mxGetPr(pTemp); NB = 1; for(i=0; i<bdim; i++){ NB *= (int)pbSize[i]; } pTemp = mxGetField(bigPot, 0, "T"); bpr = mxGetPr(pTemp); bir = mxGetIr(pTemp); bjc = mxGetJc(pTemp); NZB = bjc[1]; pTemp = mxGetField(smallPot, 0, "T"); spr = mxGetPr(pTemp); pTemp1 = mxCreateSparse(NB, 1, NZB, mxREAL); rpr = mxGetPr(pTemp1); rir = mxGetIr(pTemp1); rjc = mxGetJc(pTemp1); rjc[0] = 0; rjc[1] = NZB; mask = malloc(sdim * sizeof(int)); bCumprod = malloc(bdim * sizeof(int)); sCumprod = malloc(sdim * sizeof(int)); bsubv = malloc(bdim * sizeof(int)); ssubv = malloc(sdim * sizeof(int)); count = 0; for(i=0; i<sdim; i++){ for(j=0; j<bdim; j++){ if(psDomain[i] == pbDomain[j]){ mask[count] = j; count++; break; } } } bCumprod[0] = 1; for(i=0; i<bdim-1; i++){ bCumprod[i+1] = bCumprod[i] * (int)pbSize[i]; } sCumprod[0] = 1; for(i=0; i<sdim-1; i++){ sCumprod[i+1] = sCumprod[i] * (int)psSize[i]; } for(i=0; i<NZB; i++){ bindex = bir[i]; ind_subv(bindex, bCumprod, bdim, bsubv); for(j=0; j<sdim; j++){ ssubv[j] = bsubv[mask[j]]; } sindex = subv_ind(sdim, sCumprod, ssubv); value = spr[sindex]; if(value != 0){ rpr[nzCounts] = bpr[i] * value; rir[nzCounts] = bindex; nzCounts++; } } pTemp = mxGetField(bigPot, 0, "T"); if(pTemp)mxDestroyArray(pTemp); reset_nzmax(pTemp1, NZB, nzCounts); mxSetField(bigPot, 0, "T", pTemp1); free(mask); free(bCumprod); free(sCumprod); free(bsubv); free(ssubv); }