?? init_pot1.c
字號:
/* C mex init_pot for in @jtree_sparse_inf_engine directory */
/* The file enter_evidence.m in directory @jtree_sparse_inf_engine call it*/
/**************************************/
/* init_pot.c has 6 input & 2 output */
/* engine */
/* clqs */
/* pots */
/* pot_type */
/* onodes */
/* ndx */
/* */
/* clpot */
/* seppot */
/**************************************/
#include <math.h>
#include <search.h>
#include "mex.h"
int compare(const void* src1, const void* src2){
int i1 = *(int*)src1 ;
int i2 = *(int*)src2 ;
return i1-i2 ;
}
void ind_subv(int index, const int *cumprod, int n, int *bsubv){
int i;
for (i = n-1; i >= 0; i--) {
bsubv[i] = ((int)floor(index / cumprod[i]));
index = index % cumprod[i];
}
}
int subv_ind(const int n, const int *cumprod, const int *subv){
int i, index=0;
for(i=0; i<n; i++){
index += subv[i] * cumprod[i];
}
return index;
}
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 reset_nzmax(mxArray *spArray, const int old_nzmax, const int new_nzmax){
double *ptr;
void *newptr;
int *ir, *jc;
int nbytes;
if(new_nzmax == old_nzmax) return;
nbytes = new_nzmax * sizeof(*ptr);
ptr = mxGetPr(spArray);
newptr = mxRealloc(ptr, nbytes);
mxSetPr(spArray, newptr);
nbytes = new_nzmax * sizeof(*ir);
ir = mxGetIr(spArray);
newptr = mxRealloc(ir, nbytes);
mxSetIr(spArray, newptr);
jc = mxGetJc(spArray);
jc[0] = 0;
jc[1] = new_nzmax;
mxSetNzmax(spArray, new_nzmax);
}
mxArray* convert_table_to_sparse(const double *bT, const int *index, const int nzCounts, const int NB){
mxArray *spTable;
int i, *irs, *jcs;
double *sr;
spTable = mxCreateSparse(NB, 1, nzCounts, mxREAL);
sr = mxGetPr(spTable);
irs = mxGetIr(spTable);
jcs = mxGetJc(spTable);
jcs[0] = 0;
jcs[1] = nzCounts;
for(i=0; i<nzCounts; i++){
sr[i] = bT[i];
irs[i] = index[i];
}
return spTable;
}
mxArray* convert_ill_table_to_sparse(const double *bigTable, const int *sequence, const int nzCounts, const int NB){
mxArray *spTable;
int i, temp, *irs, *jcs, count=0;
double *sr;
spTable = mxCreateSparse(NB, 1, nzCounts, mxREAL);
sr = mxGetPr(spTable);
irs = mxGetIr(spTable);
jcs = mxGetJc(spTable);
jcs[0] = 0;
jcs[1] = nzCounts;
for(i=0; i<nzCounts; i++){
irs[i] = sequence[count];
count++;
temp = sequence[count];
sr[i] = bigTable[temp];
count++;
}
return spTable;
}
void multiply_null_by_fuPot(mxArray *bigPot, const mxArray *smallPot){
int i, j, count, NB, NS, siz_b, siz_s, ndim, nzCounts=0;
int *mask, *sx, *sy, *cpsy, *subs, *s, *cpsy2, *bir, *bjc;
double *pbDomain, *psDomain, *pbSize, *psSize, *spr, *bpr, value;
mxArray *pTemp, *pTemp1;
pTemp = mxGetField(bigPot, 0, "domain");
pbDomain = mxGetPr(pTemp);
siz_b = mxGetNumberOfElements(pTemp);
pTemp = mxGetField(smallPot, 0, "domain");
psDomain = mxGetPr(pTemp);
siz_s = mxGetNumberOfElements(pTemp);
pTemp = mxGetField(bigPot, 0, "sizes");
pbSize = mxGetPr(pTemp);
pTemp = mxGetField(smallPot, 0, "sizes");
psSize = mxGetPr(pTemp);
NB = 1;
for(i=0; i<siz_b; i++){
NB *= (int)pbSize[i];
}
NS = 1;
for(i=0; i<siz_s; i++){
NS *= (int)psSize[i];
}
pTemp = mxGetField(smallPot, 0, "T");
spr = mxGetPr(pTemp);
pTemp1 = mxCreateSparse(NB, 1, NB, mxREAL);
bpr = mxGetPr(pTemp1);
bir = mxGetIr(pTemp1);
bjc = mxGetJc(pTemp1);
bjc[0] = 0;
bjc[1] = NB;
if(NS == 1){
value = *spr;
for(i=0; i<NB; i++){
bpr[i] = value;
bir[i] = i;
}
nzCounts = NB;
pTemp = mxGetField(bigPot, 0, "T");
if(pTemp)mxDestroyArray(pTemp);
reset_nzmax(pTemp1, NB, nzCounts);
mxSetField(bigPot, 0, "T", pTemp1);
return;
}
if(NS == NB){
for(i=0; i<NB; i++){
if(spr[i] != 0){
bpr[nzCounts] = spr[i];
bir[nzCounts] = i;
nzCounts++;
}
}
pTemp = mxGetField(bigPot, 0, "T");
if(pTemp)mxDestroyArray(pTemp);
reset_nzmax(pTemp1, NB, nzCounts);
mxSetField(bigPot, 0, "T", pTemp1);
return;
}
mask = malloc(siz_s * sizeof(int));
count = 0;
for(i=0; i<siz_s; i++){
for(j=0; j<siz_b; j++){
if(psDomain[i] == pbDomain[j]){
mask[count] = j;
count++;
break;
}
}
}
ndim = siz_b;
sx = (int *)malloc(sizeof(int)*ndim);
sy = (int *)malloc(sizeof(int)*ndim);
for(i=0; i<ndim; i++){
sx[i] = (int)pbSize[i];
sy[i] = 1;
}
for(i=0; i<count; i++){
sy[mask[i]] = sx[mask[i]];
}
s = (int *)malloc(sizeof(int)*ndim);
*(cpsy = (int *)malloc(sizeof(int)*ndim)) = 1;
subs = (int *)malloc(sizeof(int)*ndim);
cpsy2 = (int *)malloc(sizeof(int)*ndim);
for(i = 0; i < ndim; i++){
subs[i] = 0;
s[i] = sx[i] - 1;
}
for(i = 0; i < ndim-1; i++){
cpsy[i+1] = cpsy[i]*sy[i]--;
cpsy2[i] = cpsy[i]*sy[i];
}
cpsy2[ndim-1] = cpsy[ndim-1]*(--sy[ndim-1]);
for(j=0; j<NB; j++){
if(*spr != 0){
bpr[nzCounts] = *spr;
bir[nzCounts] = j;
nzCounts++;
}
for(i = 0; i < ndim; i++){
if(subs[i] == s[i]){
subs[i] = 0;
if(sy[i])
spr -= cpsy2[i];
}
else{
subs[i]++;
if(sy[i])
spr += cpsy[i];
break;
}
}
}
pTemp = mxGetField(bigPot, 0, "T");
if(pTemp)mxDestroyArray(pTemp);
reset_nzmax(pTemp1, NB, nzCounts);
mxSetField(bigPot, 0, "T", pTemp1);
free(sx);
free(sy);
free(s);
free(cpsy);
free(subs);
free(cpsy2);
free(mask);
}
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;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -