From 10307c27fe572e475a8f35a598917dd59800c0f3 Mon Sep 17 00:00:00 2001 From: Vitor Santos Costa Date: Tue, 2 Apr 2019 15:32:50 +0100 Subject: [PATCH] fixes --- C/globals.c | 25 +++++++++++++++++++ library/nb.yap | 1 + misc/editors/codemirror/prolog.js | 2 +- packages/ProbLog/CMakeLists.txt | 1 + packages/ProbLog/problog.yap | 2 +- packages/ProbLog/problog/lbdd.yap | 12 +++++++-- packages/ProbLog/problog_examples/kbgraph.yap | 6 +++-- .../problog_examples/learn_graph_lbdd.pl | 2 +- packages/ProbLog/problog_lbfgs.yap | 22 ++++++++++------ 9 files changed, 59 insertions(+), 14 deletions(-) diff --git a/C/globals.c b/C/globals.c index 0a5031fe2..e06dd5f3c 100644 --- a/C/globals.c +++ b/C/globals.c @@ -1840,6 +1840,15 @@ static Term MkZeroApplTerm(Functor f, UInt sz USES_REGS) { return tf; } + /** + * @pred nb_heap(+_Size_,-_Heap_) is deterministic. + * + * Initialize a new binomial heap of size _Size_. + * The Heap resides in the Prolog stack, but the state of the + * Heap is not backtrable. + * + */ + static Int p_nb_heap(USES_REGS1) { Term heap_arena, heap, *ar, *nar; UInt hsize; @@ -1881,6 +1890,21 @@ static Int p_nb_heap(USES_REGS1) { return TRUE; } + /** + * @pred nb_heap_reset(+_Heap_) is deterministic. + * + * Set the number if entries in the heap to 0. Allows reusing + * the same space for several heaps. + */ +static Int p_nb_heap_reset(USES_REGS1) { + CELL *qd = GetHeap(ARG1, "reset_heap"); + + if (!qd) + return FALSE; + qd[HEAP_SIZE] = MkIntTerm(0); + return true; +} + static Int p_nb_heap_close(USES_REGS1) { Term t = Deref(ARG1); if (!IsVarTerm(t)) { @@ -2796,6 +2820,7 @@ void Yap_InitGlobals(void) { Yap_InitCPred("nb_heap_peek", 3, p_nb_heap_peek, SafePredFlag); Yap_InitCPred("nb_heap_empty", 1, p_nb_heap_empty, SafePredFlag); Yap_InitCPred("nb_heap_size", 2, p_nb_heap_size, SafePredFlag); + Yap_InitCPred("nb_heap_reset", 1, p_nb_heap_reset, SafePredFlag); Yap_InitCPred("nb_beam", 2, p_nb_beam, 0L); Yap_InitCPred("nb_beam_close", 1, p_nb_beam_close, SafePredFlag); Yap_InitCPred("nb_beam_add", 3, p_nb_beam_add_to_beam, 0L); diff --git a/library/nb.yap b/library/nb.yap index 8e245502b..6678a807d 100644 --- a/library/nb.yap +++ b/library/nb.yap @@ -45,6 +45,7 @@ nb_heap_del/3, nb_heap_peek/3, nb_heap_empty/1, + nb_heap_reset/1, nb_heap_size/2, nb_beam/2, nb_beam_close/1, diff --git a/misc/editors/codemirror/prolog.js b/misc/editors/codemirror/prolog.js index 8245ba492..f228fd5c5 100644 --- a/misc/editors/codemirror/prolog.js +++ b/misc/editors/codemirror/prolog.js @@ -145,7 +145,7 @@ for ( [key,v] of singletonVars.entries()) { console.log("reset"); } - CodeMirror.registerHelper("lint", "prolog", exportErrors); + //CodeMirror.registerHelper("lint", "prolog", exportErrors); /******************************* * CHARACTER ESCAPES * diff --git a/packages/ProbLog/CMakeLists.txt b/packages/ProbLog/CMakeLists.txt index 1a5e419fb..390a99102 100644 --- a/packages/ProbLog/CMakeLists.txt +++ b/packages/ProbLog/CMakeLists.txt @@ -30,6 +30,7 @@ set (PROBLOG_PROGRAMS problog/version_control.yap problog/nestedtries.yap problog/utils.yap + problog/lbdd.yap problog/utils_lbdd.yap problog/ad_converter.yap problog/termhandling.yap diff --git a/packages/ProbLog/problog.yap b/packages/ProbLog/problog.yap index 23e527daa..020a8a03c 100644 --- a/packages/ProbLog/problog.yap +++ b/packages/ProbLog/problog.yap @@ -1330,7 +1330,7 @@ set_fact_probability(ID,Prob) :- retract(ProblogTerm), ProblogTerm =.. [ProblogName|ProblogTermArgs], nth1(ProblogArity,ProblogTermArgs,_,KeepArgs), - NewLogProb is log(Prob), + (isnan(Prob) -> NewLogProb = 0.0 ; NewLogProb is log(Prob)), nth1(ProblogArity,NewProblogTermArgs,NewLogProb,KeepArgs), NewProblogTerm =.. [ProblogName|NewProblogTermArgs], assertz(NewProblogTerm). diff --git a/packages/ProbLog/problog/lbdd.yap b/packages/ProbLog/problog/lbdd.yap index 1b572c9b2..df0f94f4a 100644 --- a/packages/ProbLog/problog/lbdd.yap +++ b/packages/ProbLog/problog/lbdd.yap @@ -68,10 +68,18 @@ log2prob(X,Slope,FactID,V) :- sigmoid(V0, Slope, V). bind_maplist([], _Slope, _X). -bind_maplist([Node-(Node-Pr)|MapList], Slope, X) :- +bind_maplist([Node-(Node-NPr)|MapList], Slope, X) :- SigPr <== X[Node], sigmoid(SigPr, Slope, Pr), - bind_maplist(MapList, Slope, X). + (Pr > 0.999 + -> + NPr = 0.999 + ; + Pr < 0.001 + -> + NPr = 0.001 ; + Pr = NPr ), +bind_maplist(MapList, Slope, X). %get_prob(Node, Prob) :- diff --git a/packages/ProbLog/problog_examples/kbgraph.yap b/packages/ProbLog/problog_examples/kbgraph.yap index a9bded8d9..b606ff72f 100644 --- a/packages/ProbLog/problog_examples/kbgraph.yap +++ b/packages/ProbLog/problog_examples/kbgraph.yap @@ -2,7 +2,6 @@ :- ensure_loaded(library(lists)). :- ensure_loaded(library(rbtrees)). :- ensure_loaded(library(tries)). -:- ensure_loaded(('../problog/ptree')). :- ensure_loaded(library(trie_sp)). :- ensure_loaded(library(bdd)). :- ensure_loaded(library(bhash)). @@ -29,6 +28,8 @@ graph2bdd(Query,1,bdd(D,T,Vs)) :- :- set_problog_flag(init_method,(Q,N,Bdd,user:graph2bdd(Q,N,Bdd))). +:- nb_heap(100000,Q), nb_setval(heap,Q). + %:- leash(0), spy graph2bdd. @@ -58,7 +59,8 @@ graph(X,Y,Trie_Completed_Proofs,Vs) :- !, export_answer([Y|Final], Trie_Completed_Proofs,Vs). graph(X,Y,Trie_Completed_Proofs, Vs) :- - nb_heap(100000,Q), + nb_getval(heap, Q), + nb_heap_reset(Q), path(X,Y,X,[X],Final, 0, _Pr, Q), !, export_answer(Final, Trie_Completed_Proofs, Vs). diff --git a/packages/ProbLog/problog_examples/learn_graph_lbdd.pl b/packages/ProbLog/problog_examples/learn_graph_lbdd.pl index 688f2ea9e..c91e644ac 100644 --- a/packages/ProbLog/problog_examples/learn_graph_lbdd.pl +++ b/packages/ProbLog/problog_examples/learn_graph_lbdd.pl @@ -17,7 +17,7 @@ :- use_module('../problog_lbfgs'). - :- if(false). + :- if(true). :- use_module('kbgraph'). diff --git a/packages/ProbLog/problog_lbfgs.yap b/packages/ProbLog/problog_lbfgs.yap index a5fd499a9..9ade55f45 100644 --- a/packages/ProbLog/problog_lbfgs.yap +++ b/packages/ProbLog/problog_lbfgs.yap @@ -800,6 +800,20 @@ gradient_descent :- set_fact(FactID, Slope, P ) :- X <== P[FactID], sigmoid(X, Slope, Pr), + (Pr > 0.999 + -> + NPr = 0.999 + ; + Pr < 0.001 + -> + NPr = 0.001 ; + Pr = NPr ), + set_fact_probability(FactID, NPr). + + +set_tunable(I,Slope,P) :- + X <== P[I], + sigmoid(X,Slope,Pr), (Pr > 0.99 -> NPr = 0.99 @@ -808,13 +822,7 @@ set_fact(FactID, Slope, P ) :- -> NPr = 0.01 ; Pr = NPr ), - set_fact_probability(FactID, NPr). - - -set_tunable(I,Slope,P) :- - X <== P[I], - sigmoid(X,Slope,Pr), - set_fact_probability(I,Pr). + set_fact_probability(I,NPr). :- include(problog/lbdd).