added memory profiling calls

removed limit to 1000 variables imposed by createVars beause of the use
of tha array of names of variables


git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@2266 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
rzf 2008-06-08 08:38:36 +00:00
parent 87fcf6233c
commit 0ca51355ce
5 changed files with 105 additions and 23 deletions

View File

@ -29,7 +29,7 @@ typedef struct
} variable; } variable;
void createVars(array_t * vars, YAP_Term t,DdManager * mgr, array_t * bVar2mVar, char inames[1000][20]); void createVars(array_t * vars, YAP_Term t,DdManager * mgr, array_t * bVar2mVar,int create_dot, char inames[1000][20]);
void createExpression(array_t * expression, YAP_Term t); void createExpression(array_t * expression, YAP_Term t);
void init_my_predicates(void); void init_my_predicates(void);
int compare(char *a, char *b); int compare(char *a, char *b);

View File

@ -24,7 +24,7 @@ FILE *open_file (char *filename, const char *mode);
void reverse(char s[]); void reverse(char s[]);
static int compute_prob(void); static int compute_prob(void);
void createVars(array_t * vars, YAP_Term t,DdManager * mgr, array_t * bVar2mVar, char inames[1000][20]) void createVars(array_t * vars, YAP_Term t,DdManager * mgr, array_t * bVar2mVar,int create_dot, char inames[1000][20])
/* adds the boolean variables to the BDD and returns /* adds the boolean variables to the BDD and returns
an array_t containing them (array_t is defined in the util library of glu) an array_t containing them (array_t is defined in the util library of glu)
returns also the names of the variables to be used to save the ADD in dot format returns also the names of the variables to be used to save the ADD in dot format
@ -51,6 +51,8 @@ returns also the names of the variables to be used to save the ADD in dot format
v.probabilities=array_alloc(double,0); v.probabilities=array_alloc(double,0);
v.booleanVars=array_alloc(DdNode *,0); v.booleanVars=array_alloc(DdNode *,0);
for (i=0;i<nVal;i++) for (i=0;i<nVal;i++)
{
if (create_dot)
{ {
strcpy(inames[b+i],"X"); strcpy(inames[b+i],"X");
sprintf(numberVar,"%d",varIndex); sprintf(numberVar,"%d",varIndex);
@ -58,6 +60,7 @@ returns also the names of the variables to be used to save the ADD in dot format
strcat(inames[b+i],"_"); strcat(inames[b+i],"_");
sprintf(numberBit,"%d",i); sprintf(numberBit,"%d",i);
strcat(inames[b+i],numberBit); strcat(inames[b+i],numberBit);
}
p=YAP_FloatOfTerm(YAP_HeadOfTerm(probTerm)); p=YAP_FloatOfTerm(YAP_HeadOfTerm(probTerm));
array_insert(double,v.probabilities,i,p); array_insert(double,v.probabilities,i,p);
probTerm=YAP_TailOfTerm(probTerm); probTerm=YAP_TailOfTerm(probTerm);
@ -112,7 +115,7 @@ static int compute_prob(void)
array_t * variables,* expression, * bVar2mVar; array_t * variables,* expression, * bVar2mVar;
DdNode * function, * add; DdNode * function, * add;
DdManager * mgr; DdManager * mgr;
int nBVar,i,j,intBits; int nBVar,i,j,intBits,create_dot;
FILE * file; FILE * file;
DdNode * array[1]; DdNode * array[1];
char * onames[1]; char * onames[1];
@ -120,20 +123,29 @@ static int compute_prob(void)
char * names[1000]; char * names[1000];
GHashTable * nodes; /* hash table that associates nodes with their probability if already GHashTable * nodes; /* hash table that associates nodes with their probability if already
computed, it is defined in glib */ computed, it is defined in glib */
Cudd_ReorderingType order;
arg1=YAP_ARG1; arg1=YAP_ARG1;
arg2=YAP_ARG2; arg2=YAP_ARG2;
arg3=YAP_ARG3; arg3=YAP_ARG3;
arg4=YAP_ARG4; arg4=YAP_ARG4;
mgr=Cudd_Init(0,0,CUDD_UNIQUE_SLOTS,CUDD_CACHE_SLOTS,0); mgr=Cudd_Init(0,0,CUDD_UNIQUE_SLOTS,CUDD_CACHE_SLOTS,0);
variables=array_alloc(variable,0); variables=array_alloc(variable,0);
bVar2mVar=array_alloc(int,0); bVar2mVar=array_alloc(int,0);
createVars(variables,arg1,mgr,bVar2mVar,inames); create_dot=YAP_IntOfTerm(arg4);
createVars(variables,arg1,mgr,bVar2mVar,create_dot,inames);
Cudd_PrintInfo(mgr,stderr);
/* automatic variable reordering, default method CUDD_REORDER_SIFT used */ /* automatic variable reordering, default method CUDD_REORDER_SIFT used */
printf("status %d\n",Cudd_ReorderingStatus(mgr,&order));
printf("order %d\n",order);
Cudd_AutodynEnable(mgr,CUDD_REORDER_SAME); Cudd_AutodynEnable(mgr,CUDD_REORDER_SAME);
/* Cudd_AutodynEnable(mgr, CUDD_REORDER_RANDOM_PIVOT);
printf("status %d\n",Cudd_ReorderingStatus(mgr,&order));
printf("order %d\n",order);
printf("%d",CUDD_REORDER_RANDOM_PIVOT);
*/
expression=array_alloc(array_t *,0); expression=array_alloc(array_t *,0);
@ -143,8 +155,9 @@ static int compute_prob(void)
/* the BDD build by retFunction is converted to an ADD (algebraic decision diagram) /* the BDD build by retFunction is converted to an ADD (algebraic decision diagram)
because it is easier to interpret and to print */ because it is easier to interpret and to print */
add=Cudd_BddToAdd(mgr,function); add=Cudd_BddToAdd(mgr,function);
Cudd_PrintInfo(mgr,stderr);
if (YAP_IntOfTerm(arg4)) if (create_dot)
/* if specified by the user, a dot file for the BDD is written to cpl.dot */ /* if specified by the user, a dot file for the BDD is written to cpl.dot */
{ {
nBVar=array_n(bVar2mVar); nBVar=array_n(bVar2mVar);

View File

@ -115,6 +115,7 @@ solve(GL,P,CPUTime1,CPUTime2,WallTime1,WallTime2):-
CPUTime1 is CT1/1000, CPUTime1 is CT1/1000,
statistics(walltime,[_,WT1]), statistics(walltime,[_,WT1]),
WallTime1 is WT1/1000, WallTime1 is WT1/1000,
print_mem,
build_ground_lpad(L2,0,CL), build_ground_lpad(L2,0,CL),
convert_to_clpbn(CL,GL,LV,P), convert_to_clpbn(CL,GL,LV,P),
statistics(cputime,[_,CT2]), statistics(cputime,[_,CT2]),
@ -122,6 +123,7 @@ solve(GL,P,CPUTime1,CPUTime2,WallTime1,WallTime2):-
statistics(walltime,[_,WT2]), statistics(walltime,[_,WT2]),
WallTime2 is WT2/1000 WallTime2 is WT2/1000
; ;
print_mem,
P=0.0, P=0.0,
statistics(cputime,[_,CT1]), statistics(cputime,[_,CT1]),
CPUTime1 is CT1/1000, CPUTime1 is CT1/1000,
@ -130,7 +132,9 @@ solve(GL,P,CPUTime1,CPUTime2,WallTime1,WallTime2):-
CPUTime2 =0.0, CPUTime2 =0.0,
statistics(walltime,[_,WT2]), statistics(walltime,[_,WT2]),
WallTime2 =0.0 WallTime2 =0.0
),!. ),!,
format(user_error,"Memory after inference~n",[]),
print_mem.
/* sc(GoalsList,EvidenceList,Prob) compute the probability of a list of goals /* sc(GoalsList,EvidenceList,Prob) compute the probability of a list of goals
GoalsList given EvidenceList. Both lists can have variables, sc returns in GoalsList given EvidenceList. Both lists can have variables, sc returns in
@ -151,6 +155,7 @@ sc(GL,GLC,P,CPUTime1,CPUTime2,WallTime1,WallTime2):-
CPUTime1 is CT1/1000, CPUTime1 is CT1/1000,
statistics(walltime,[_,WT1]), statistics(walltime,[_,WT1]),
WallTime1 is WT1/1000, WallTime1 is WT1/1000,
print_mem,
build_ground_lpad(LD1,0,CL), build_ground_lpad(LD1,0,CL),
convert_to_clpbn(CL,GL,LV,P,GLC), convert_to_clpbn(CL,GL,LV,P,GLC),
statistics(cputime,[_,CT2]), statistics(cputime,[_,CT2]),
@ -159,6 +164,8 @@ sc(GL,GLC,P,CPUTime1,CPUTime2,WallTime1,WallTime2):-
WallTime2 is WT2/1000 WallTime2 is WT2/1000
; ;
P=0.0, P=0.0,
print_mem,
format(user_error,"Porb 0~n",[]),
statistics(cputime,[_,CT1]), statistics(cputime,[_,CT1]),
CPUTime1 is CT1/1000, CPUTime1 is CT1/1000,
statistics(walltime,[_,WT1]), statistics(walltime,[_,WT1]),
@ -168,13 +175,18 @@ sc(GL,GLC,P,CPUTime1,CPUTime2,WallTime1,WallTime2):-
) )
; ;
P=undef, P=undef,
print_mem,
statistics(cputime,[_,CT1]), statistics(cputime,[_,CT1]),
CPUTime1 is CT1/1000, CPUTime1 is CT1/1000,
statistics(walltime,[_,WT1]), statistics(walltime,[_,WT1]),
WallTime1 is WT1/1000, WallTime1 is WT1/1000,
CPUTime2 =0.0, CPUTime2 =0.0,
WallTime2 =0.0 WallTime2 =0.0,
). print_mem,
format(user_error,"Undef~n",[])
),
format(user_error,"Memory after inference~n",[]),
print_mem.
remove_head([],[]). remove_head([],[]).
@ -435,6 +447,15 @@ find_atoms_head([],[],[]).
find_atoms_head([H:P|T],[H|TA],[P|TP]):- find_atoms_head([H:P|T],[H|TA],[P|TP]):-
find_atoms_head(T,TA,TP). find_atoms_head(T,TA,TP).
print_mem:-
statistics(global_stack,[GS,GSF]),
statistics(local_stack,[LS,LSF]),
statistics(heap,[HP,HPF]),
statistics(trail,[TU,TF]),
format(user_error,"~nGloabal stack used ~d execution stack free: ~d~n",[GS,GSF]),
format(user_error,"Local stack used ~d execution stack free: ~d~n",[LS,LSF]),
format(user_error,"Heap used ~d heap free: ~d~n",[HP,HPF]),
format(user_error,"Trail used ~d Trail free: ~d~n",[TU,TF]).
find_deriv(GoalsList,Deriv):- find_deriv(GoalsList,Deriv):-
solve(GoalsList,[],DerivDup), solve(GoalsList,[],DerivDup),

View File

@ -68,7 +68,11 @@ solve(GoalsList,Prob,CPUTime1,CPUTime2,WallTime1,WallTime2):-
CPUTime1 is CT1/1000, CPUTime1 is CT1/1000,
statistics(walltime,[_,WT1]), statistics(walltime,[_,WT1]),
WallTime1 is WT1/1000, WallTime1 is WT1/1000,
build_formula(L,Formula,[],Var), print_mem,
build_formula(L,Formula,[],Var,0,Conj),
length(L,ND),
length(Var,NV),
format(user_error,"Disjunctions :~d~nConjunctions: ~d~nVariables ~d~n",[ND,Conj,NV]),
var2numbers(Var,0,NewVar), var2numbers(Var,0,NewVar),
(setting(save_dot,true)-> (setting(save_dot,true)->
format("Variables: ~p~n",[Var]), format("Variables: ~p~n",[Var]),
@ -81,6 +85,7 @@ solve(GoalsList,Prob,CPUTime1,CPUTime2,WallTime1,WallTime2):-
statistics(walltime,[_,WT2]), statistics(walltime,[_,WT2]),
WallTime2 is WT2/1000 WallTime2 is WT2/1000
; ;
print_mem,
Prob=0.0, Prob=0.0,
statistics(cputime,[_,CT1]), statistics(cputime,[_,CT1]),
CPUTime1 is CT1/1000, CPUTime1 is CT1/1000,
@ -89,9 +94,19 @@ solve(GoalsList,Prob,CPUTime1,CPUTime2,WallTime1,WallTime2):-
CPUTime2 =0.0, CPUTime2 =0.0,
statistics(walltime,[_,WT2]), statistics(walltime,[_,WT2]),
WallTime2 =0.0 WallTime2 =0.0
),!. ),!,
format(user_error,"~nMemory after inference~n",[]),
print_mem.
print_mem:-
statistics(global_stack,[GS,GSF]),
statistics(local_stack,[LS,LSF]),
statistics(heap,[HP,HPF]),
statistics(trail,[TU,TF]),
format(user_error,"~nGloabal stack used ~d execution stack free: ~d~n",[GS,GSF]),
format(user_error,"Local stack used ~d execution stack free: ~d~n",[LS,LSF]),
format(user_error,"Heap used ~d heap free: ~d~n",[HP,HPF]),
format(user_error,"Trail used ~d Trail free: ~d~n",[TU,TF]).
find_deriv(GoalsList,Deriv):- find_deriv(GoalsList,Deriv):-
solve(GoalsList,[],DerivDup), solve(GoalsList,[],DerivDup),
@ -111,6 +126,7 @@ solve_cond(Goals,Evidence,Prob):-
(setof(DerivE,find_deriv(Evidence,DerivE),LDupE)-> (setof(DerivE,find_deriv(Evidence,DerivE),LDupE)->
rem_dup_lists(LDupE,[],LE), rem_dup_lists(LDupE,[],LE),
(setof(DerivGE,find_deriv_GE(LE,Goals,DerivGE),LDupGE)-> (setof(DerivGE,find_deriv_GE(LE,Goals,DerivGE),LDupGE)->
print_mem,
rem_dup_lists(LDupGE,[],LGE), rem_dup_lists(LDupGE,[],LGE),
build_formula(LE,FormulaE,[],VarE), build_formula(LE,FormulaE,[],VarE),
var2numbers(VarE,0,NewVarE), var2numbers(VarE,0,NewVarE),
@ -120,11 +136,15 @@ solve_cond(Goals,Evidence,Prob):-
call_compute_prob(NewVarGE,FormulaGE,ProbGE), call_compute_prob(NewVarGE,FormulaGE,ProbGE),
Prob is ProbGE/ProbE Prob is ProbGE/ProbE
; ;
print_mem,
Prob=0.0 Prob=0.0
) )
; ;
print_mem,
Prob=undefined Prob=undefined
). ),
format(user_error,"~nMemory after inference~n",[]),
print_mem.
/* sc(Goals,Evidence,Prob,Time1,Time2) compute the conditional probability of the list of goals /* sc(Goals,Evidence,Prob,Time1,Time2) compute the conditional probability of the list of goals
Goals given the list of goals Evidence Goals given the list of goals Evidence
@ -502,6 +522,14 @@ Termi is of the form [Factor1,...,Factorm]
Factorj is of the form (Var,Value) where Var is the index of Factorj is of the form (Var,Value) where Var is the index of
the multivalued variable Var and Value is the index of the value the multivalued variable Var and Value is the index of the value
*/ */
build_formula([],[],Var,Var,C,C).
build_formula([D|TD],[F|TF],VarIn,VarOut,C0,C1):-
length(D,NC),
C2 is C0+NC,
build_term(D,F,VarIn,Var1),
build_formula(TD,TF,Var1,VarOut,C2,C1).
build_formula([],[],Var,Var). build_formula([],[],Var,Var).
build_formula([D|TD],[F|TF],VarIn,VarOut):- build_formula([D|TD],[F|TF],VarIn,VarOut):-

View File

@ -107,20 +107,36 @@ s(GL,P,CPUTime1,CPUTime2,WallTime1,WallTime2):-
CPUTime1 is CT1/1000, CPUTime1 is CT1/1000,
statistics(walltime,[_,WT1]), statistics(walltime,[_,WT1]),
WallTime1 is WT1/1000, WallTime1 is WT1/1000,
print_mem,
convert_to_bn(CL,GL,[],P), convert_to_bn(CL,GL,[],P),
statistics(cputime,[_,CT2]), statistics(cputime,[_,CT2]),
CPUTime2 is CT2/1000, CPUTime2 is CT2/1000,
statistics(walltime,[_,WT2]), statistics(walltime,[_,WT2]),
WallTime2 is WT2/1000 WallTime2 is WT2/1000
; ;
statistics(cputime,[_,CT1]), statistics(cputime,[_,CT1]),
CPUTime1 is CT1/1000, CPUTime1 is CT1/1000,
statistics(walltime,[_,WT1]), statistics(walltime,[_,WT1]),
WallTime1 is WT1/1000, WallTime1 is WT1/1000,
print_mem,
CPUTime2=0.0, CPUTime2=0.0,
WallTime2=0.0, WallTime2=0.0,
P=0.0 P=0.0
). ),
format(user_error,"~nMemory after inference~n",[]),
print_mem.
print_mem:-
statistics(global_stack,[GS,GSF]),
statistics(local_stack,[LS,LSF]),
statistics(heap,[HP,HPF]),
statistics(trail,[TU,TF]),
format(user_error,"~nGloabal stack used ~d execution stack free: ~d~n",[GS,GSF]),
format(user_error,"Local stack used ~d execution stack free: ~d~n",[LS,LSF]),
format(user_error,"Heap used ~d heap free: ~d~n",[HP,HPF]),
format(user_error,"Trail used ~d Trail free: ~d~n",[TU,TF]).
/* sc(GoalsList,EvidenceList,Prob) compute the probability of a list of goals /* sc(GoalsList,EvidenceList,Prob) compute the probability of a list of goals
GoalsList given EvidenceList. Both lists can have variables, sc returns in GoalsList given EvidenceList. Both lists can have variables, sc returns in
@ -136,6 +152,7 @@ sc(GL,GLC,P,CPUTime1,CPUTime2,WallTime1,WallTime2):-
CPUTime1 is CT1/1000, CPUTime1 is CT1/1000,
statistics(walltime,[_,WT1]), statistics(walltime,[_,WT1]),
WallTime1 is WT1/1000, WallTime1 is WT1/1000,
print_mem,
(Undef=yes-> (Undef=yes->
P=undef, P=undef,
CPUTime2=0.0, CPUTime2=0.0,
@ -148,6 +165,7 @@ sc(GL,GLC,P,CPUTime1,CPUTime2,WallTime1,WallTime2):-
WallTime2 is WT2/1000 WallTime2 is WT2/1000
) )
; ;
print_mem,
statistics(cputime,[_,CT1]), statistics(cputime,[_,CT1]),
CPUTime1 is CT1/1000, CPUTime1 is CT1/1000,
statistics(walltime,[_,WT1]), statistics(walltime,[_,WT1]),
@ -155,7 +173,9 @@ sc(GL,GLC,P,CPUTime1,CPUTime2,WallTime1,WallTime2):-
CPUTime2=0.0, CPUTime2=0.0,
WallTime2=0.0, WallTime2=0.0,
P=0.0 P=0.0
). ),
format(user_error,"~nMemory after inference~n",[]),
print_mem.
remove_head([],[]). remove_head([],[]).