From ead29987d604db255f14d925d5671ae9ad1f74fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Santos=20Costa?= Date: Fri, 5 Apr 2019 02:04:06 +0100 Subject: [PATCH] lbfgs --- CXX/yapi.cpp | 5 +-- packages/ProbLog/problog_examples/kbgraph.yap | 2 +- packages/ProbLog/problog_lbfgs.yap | 35 +++++++++---------- packages/yap-lbfgs/yap_lbfgs.c | 6 ++-- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/CXX/yapi.cpp b/CXX/yapi.cpp index a8601a122..6c5b4030e 100644 --- a/CXX/yapi.cpp +++ b/CXX/yapi.cpp @@ -252,10 +252,11 @@ YAPStringTerm::YAPStringTerm(wchar_t *s, size_t len) YAPApplTerm::YAPApplTerm(YAPFunctor f, YAPTerm ts[]) { BACKUP_H(); arity_t arity = ArityOfFunctor(f.f); - Term o = Yap_MkNewApplTerm(f.f, arity); + Term o = AbsAppl(HR); + *HR++ = (CELL)f.f; Term *tt = RepAppl(o) + 1; for (arity_t i = 0; i < arity; i++) - tt[i] = ts[i].term(); + *HR++ = ts[i].term(); mk(o); RECOVER_H(); } diff --git a/packages/ProbLog/problog_examples/kbgraph.yap b/packages/ProbLog/problog_examples/kbgraph.yap index f1b6e0eb6..5bb2b22fb 100644 --- a/packages/ProbLog/problog_examples/kbgraph.yap +++ b/packages/ProbLog/problog_examples/kbgraph.yap @@ -41,7 +41,7 @@ cvt_to_id([E0,E1],VId*true, [Id-VId]) :- cvt_to_id([E0,E1|Es], VId*Ids, [Id-VId|VIds]) :- problog:problog_dir_edge(Id,E0,E1,_Pr), !, - cvt_to_id([E1|Es],Id*Ids, VIds). + cvt_to_id([E1|Es],Ids, VIds). cvt_to_id([E0,E1|Es], VId*Ids, [Id-VId|VIds]) :- problog:problog_dir_edge(Id,E1,E0,_Pr), !, diff --git a/packages/ProbLog/problog_lbfgs.yap b/packages/ProbLog/problog_lbfgs.yap index 028227a6f..e7c4fd8e1 100644 --- a/packages/ProbLog/problog_lbfgs.yap +++ b/packages/ProbLog/problog_lbfgs.yap @@ -489,7 +489,8 @@ init_learning :- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % build BDD script for every example %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - once(init_queries), + empty_bdd_directory, + init_queries, %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % done @@ -550,7 +551,7 @@ empty_bdd_directory. init_queries :- - %empty_bdd_directory, + empty_bdd_directory, format_learning(2,'Build BDDs for examples~n',[]), forall(user:test_example(ID,Query,_Prob,_),init_one_query(ID,Query,test)), forall(user:example(ID,Query,_Prob,_),init_one_query(ID,Query,training)). @@ -584,6 +585,7 @@ init_one_query(QueryID,Query,_Type) :- add_bdd(QueryID,Query, Bdd) :- Bdd = bdd(Dir, Tree0,MapList), user:graph2bdd(Query,1,Bdd), + Bdd \= [], !, reverse(Tree0,Tree), %rb_new(H0), @@ -592,21 +594,12 @@ init_one_query(QueryID,Query,_Type) :- % ; % Bdd = bdd(-1,[],[]), % Grad=[] - store_bdd(QueryID, Dir, Tree, MapList). -init_one_query(_,_,_). + store_bdd(QueryID, Dir, Tree, MapList). store_bdd(QueryID, Dir, Tree, MapList) :- (QueryID mod 100 =:= 0 ->writeln(QueryID) ; true), - ( - recorded(QueryID, Bdd0, R), - arg(3, Bdd0, MapList0), variant(MapList0,MapList) - -> - put_char('.') - ; - (nonvar(R) -> erase(R);true), recorda(QueryID,bdd(Dir, Tree, MapList),_), - put_char('.') - ). + put_char('.'). %======================================================================== @@ -786,11 +779,9 @@ inv_sigmoid(T,Slope,InvSig) :- % vsc: avoid silly search gradient_descent :- - problog_flag(sigmoid_slope,Slope), -% current_iteration(Iteration), findall(FactID,tunable_fact(FactID,_GroundTruth),L), length(L,N), - lbfgs_run(N,X,_BestF), + lbfgs_run(N,_X,_BestF), mse_trainingset, mse_testset. @@ -830,8 +821,15 @@ user:evaluate(LLH_Training_Queries, X,Grad,N,_,_) :- %Handle = user_error, N1 is N-1, forall(between(0,N1,I),(Grad[I]<==0.0)), - go( X,Grad, LLs), - sum_list( LLs, LLH_Training_Queries). + catch( + go( X,Grad, LLs), + Error, + (writeln(Error), throw(Error) )), + length(LLs,NN), + V <== array[NN] of LLs, + LLH_Training_Queries <== sum(V), +writeln( LLH_Training_Queries). +% sum_list( LLs, LLH_Training_Queries), test :- S =.. [f,0-0.9,1-0.8,2-0.6,3-0.7,4-0.5,5-0.4,6-0.7,7-0.2], @@ -862,6 +860,7 @@ compute_gradient( Grad, X, Slope, LL) :- user:example(QueryID,_Query,QueryProb,_), recorded(QueryID,BDD,_), BDD = bdd(_,_,MapList), + MapList = [_|_], bind_maplist(MapList, Slope, X), query_probabilities( BDD, BDDProb), LL is (BDDProb-QueryProb)*(BDDProb-QueryProb), diff --git a/packages/yap-lbfgs/yap_lbfgs.c b/packages/yap-lbfgs/yap_lbfgs.c index b513b77c1..6312e7112 100644 --- a/packages/yap-lbfgs/yap_lbfgs.c +++ b/packages/yap-lbfgs/yap_lbfgs.c @@ -75,6 +75,7 @@ static lbfgsfloatval_t evaluate(void *instance, const lbfgsfloatval_t *x, rc = YAP_IntOfTerm(o); else rc = YAP_FloatOfTerm(o); + YAP_ShutdownGoal(true); YAP_RecoverSlots(1, sl); return rc; } @@ -123,9 +124,10 @@ static int progress(void *instance, const lbfgsfloatval_t *local_x, if (YAP_IsIntTerm(o)) { int v = YAP_IntOfTerm(o); - return (int)v; + YAP_ShutdownGoal(true); + return (int)v; } - + YAP_ShutdownGoal(true); fprintf(stderr, "ERROR: The progress call back function did not return an " "integer as last argument\n"); return 1;