diff --git a/packages/cplint/slipcase/bddem.c b/packages/cplint/slipcase/bddem.c index aaf7d6bd0..5821b836c 100644 --- a/packages/cplint/slipcase/bddem.c +++ b/packages/cplint/slipcase/bddem.c @@ -2,7 +2,7 @@ EMBLEM and SLIPCASE -Copyright (c) 2011, Fabrizio Riguzzi and Elena Bellodi +Copyright (c) 2013, Fabrizio Riguzzi and Elena Bellodi This package uses the library cudd, see http://vlsi.colorado.edu/~fabio/CUDD/ for the relative license. @@ -41,24 +41,18 @@ typedef struct tablerow * table; -static variable * vars; static variable ** vars_ex; -static int * bVar2mVar; static int ** bVar2mVar_ex; static double * sigma; static double ***eta; static double ***eta_temp; static double **arrayprob; static int *rules; -static DdManager *mgr; static DdManager **mgr_ex; -static int *nVars; static int *nVars_ex; static int nRules; -double * probs; double * nodes_probs_ex; double ** probs_ex; -static int * boolVars; static int * boolVars_ex; tablerow * nodesB; tablerow * nodesF; @@ -75,13 +69,13 @@ static int init(void); static int end(void); static int EM(void); static int Q(void); -double ProbPath(DdNode *node, int comp_par); +double ProbPath(DdNode *node, int comp_par, int nex); static int rec_deref(void); int indexMvar(DdNode *node); -void Forward(DdNode *node); +void Forward(DdNode *node, int nex); void GetForward(DdNode *node, double ForwProbPath); -void UpdateForward(DdNode * node); -double GetOutsideExpe(DdNode *root,double ex_prob); +void UpdateForward(DdNode * node, int nex); +double GetOutsideExpe(DdNode *root,double ex_prob, int nex); void Maximization(void); static double Expectation(DdNode **nodes_ex, int lenNodes); void init_my_predicates(void); @@ -133,33 +127,27 @@ static int init(void) static int init_bdd(void) { - mgr=Cudd_Init(0,0,UNIQUE_SLOTS,CACHE_SLOTS,5120); - Cudd_AutodynEnable(mgr, CUDD_REORDER_GROUP_SIFT); - Cudd_SetMaxCacheHard(mgr, 0); - Cudd_SetLooseUpTo(mgr, 0); - Cudd_SetMinHit(mgr, 15); mgr_ex=(DdManager **) realloc(mgr_ex, (ex+1)* sizeof(DdManager *)); - mgr_ex[ex]=mgr; - + mgr_ex[ex]=Cudd_Init(0,0,UNIQUE_SLOTS,CACHE_SLOTS,5120); + Cudd_AutodynEnable(mgr_ex[ex], CUDD_REORDER_GROUP_SIFT); + Cudd_SetMaxCacheHard(mgr_ex[ex], 0); + Cudd_SetLooseUpTo(mgr_ex[ex], 0); + Cudd_SetMinHit(mgr_ex[ex], 15); + bVar2mVar_ex=(int **) realloc(bVar2mVar_ex, (ex+1)* sizeof(int *)); bVar2mVar_ex[ex]=NULL; - bVar2mVar=bVar2mVar_ex[ex]; vars_ex=(variable **) realloc(vars_ex, (ex+1)* sizeof(variable *)); vars_ex[ex]=NULL; - vars=vars_ex[ex]; nVars_ex=(int *) realloc(nVars_ex, (ex+1)* sizeof(int )); - nVars=nVars_ex+ex; - *nVars=0; + nVars_ex[ex]=0; probs_ex=(double **) realloc(probs_ex, (ex+1)* sizeof(double *)); probs_ex[ex]=NULL; - probs=probs_ex[ex]; boolVars_ex=(int *) realloc(boolVars_ex, (ex+1)* sizeof(int )); - boolVars=boolVars_ex+ex; - *boolVars=0; + boolVars_ex[ex]=0; return 1; } @@ -167,9 +155,6 @@ static int init_bdd(void) static int end_bdd(void) { - bVar2mVar_ex[ex]=bVar2mVar; - probs_ex[ex]=probs; - vars_ex[ex]=vars; ex=ex+1; return 1; } @@ -184,33 +169,31 @@ static int init_test(void) nRules=YAP_IntOfTerm(arg1); - mgr=Cudd_Init(0,0,UNIQUE_SLOTS,CACHE_SLOTS,0); - Cudd_AutodynEnable(mgr, CUDD_REORDER_GROUP_SIFT); - Cudd_SetMaxCacheHard(mgr, 1024*1024*1024); - Cudd_SetLooseUpTo(mgr, 1024*1024*512); - rules= (int *) malloc(nRules * sizeof(int)); + mgr_ex[ex]=Cudd_Init(0,0,UNIQUE_SLOTS,CACHE_SLOTS,0); + Cudd_AutodynEnable(mgr_ex[ex], CUDD_REORDER_GROUP_SIFT); + Cudd_SetMaxCacheHard(mgr_ex[ex], 1024*1024*1024); + Cudd_SetLooseUpTo(mgr_ex[ex], 1024*1024*512); + rules= (int *) malloc(nRules * sizeof(int)); - bVar2mVar=NULL; - probs=NULL; - vars=NULL; + bVar2mVar_ex[ex]=NULL; + probs_ex[ex]=NULL; + vars_ex[ex]=NULL; - nVars=(int *) malloc(sizeof(int )); - *nVars=0; + nVars_ex[ex]=0; - boolVars=(int *) malloc(sizeof(int )); - *boolVars=0; + boolVars_ex[ex]=0; return 1; } static int end_test(void) { - free(bVar2mVar); - free(vars); - free(nVars); - free(boolVars); - Cudd_Quit(mgr); - free(probs); + free(bVar2mVar_ex[ex]); + free(vars_ex[ex]); + free(nVars_ex+ex); + free(boolVars_ex+ex); + Cudd_Quit(mgr_ex[ex]); + free(probs_ex[ex]); free(rules); return 1; } @@ -221,21 +204,16 @@ static double Expectation(DdNode **nodes_ex,int lenNodes) { int i; double rootProb,CLL=0; - + for(i=0;inVal=YAP_IntOfTerm(arg1); v->nRule=YAP_IntOfTerm(arg3); - v->firstBoolVar=*boolVars; - probs=(double *) realloc(probs,(((*boolVars+v->nVal-1)* sizeof(double)))); - bVar2mVar=(int *) realloc(bVar2mVar,((*boolVars+v->nVal-1)* sizeof(int))); + v->firstBoolVar=boolVars_ex[ex]; + probs_ex[ex]=(double *) realloc(probs_ex[ex],(((boolVars_ex[ex]+v->nVal-1)* sizeof(double)))); + bVar2mVar_ex[ex]=(int *) realloc(bVar2mVar_ex[ex],((boolVars_ex[ex]+v->nVal-1)* sizeof(int))); probTerm=arg2; p0=1; for (i=0;inVal-1;i++) { - node=Cudd_bddIthVar(mgr,*boolVars+i); + node=Cudd_bddIthVar(mgr_ex[ex],boolVars_ex[ex]+i); p=YAP_FloatOfTerm(YAP_HeadOfTerm(probTerm)); - bVar2mVar[*boolVars+i]=*nVars-1; - probs[*boolVars+i]=p/p0; + bVar2mVar_ex[ex][boolVars_ex[ex]+i]=nVars_ex[ex]-1; + probs_ex[ex][boolVars_ex[ex]+i]=p/p0; probTerm_temp=YAP_TailOfTerm(probTerm); probTerm=probTerm_temp; p0=p0*(1-p/p0); } - *boolVars=*boolVars+v->nVal-1; + boolVars_ex[ex]=boolVars_ex[ex]+v->nVal-1; rules[v->nRule]= v->nVal; - out=YAP_MkIntTerm((YAP_Int)* nVars-1); + out=YAP_MkIntTerm((YAP_Int) nVars_ex[ex]-1); return YAP_Unify(out,arg4); } @@ -425,30 +400,30 @@ static int equality(void) variable v; DdNode * node, * tmp,*var; - arg1=YAP_ARG1; //var - arg2=YAP_ARG2; //value - arg3=YAP_ARG3; //node + arg1=YAP_ARG1; + arg2=YAP_ARG2; + arg3=YAP_ARG3; varIndex=YAP_IntOfTerm(arg1); value=YAP_IntOfTerm(arg2); - v=vars[varIndex]; + v=vars_ex[ex][varIndex]; i=v.firstBoolVar; - tmp=Cudd_ReadOne(mgr); + tmp=Cudd_ReadOne(mgr_ex[ex]); Cudd_Ref(tmp); node=NULL; for (i=v.firstBoolVar;i0.0) { - for (j=0; j<*boolVars; j++) + for (j=0; j