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/CMakeLists.txt b/CMakeLists.txt index 9d7fbeed1..f81f79b5e 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -731,7 +731,13 @@ MY_set_target_properties(libYap # file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/packages/python/swig/yap4py) if (WITH_PYTHON AND PYTHONLIBS_FOUND AND SWIG_FOUND) - set( ENV{PYTHONPATH} ${CMAKE_BINARY_DIR}/packages/python/swig:${CMAKE_BINARY_DIR}/packages/python/yap_kernel:. ) + if (CONDA) + set(bdist bdist_conda) +else() + set(bdist bdist_wheel) +endif() + +set( ENV{PYTHONPATH} ${CMAKE_BINARY_DIR}/packages/python/swig:${CMAKE_BINARY_DIR}/packages/python/yap_kernel:. ) add_subdirectory(packages/python/swig) include(FindPythonModule) diff --git a/CXX/yapa.hh b/CXX/yapa.hh index c4f76e465..4c6c77b71 100644 --- a/CXX/yapa.hh +++ b/CXX/yapa.hh @@ -94,7 +94,9 @@ public: /// get name of (other way) inline const char *text(void) { return getName(); } ; /// get prop of type - Prop getProp( PropTag tag ) { return Yap_GetAProp( a , (PropFlags)tag ); } + Prop getProp( PropTag tag ) { return Yap_GetAProp( a , (PropFlags)tag ); }; + /// as Atom + Atom asAtom() { return a; }; }; /** @@ -158,12 +160,15 @@ public: /// Getter: extract name of functor as an atom /// /// this is for external usage. - YAPAtom name(void) { return YAPAtom(NameOfFunctor(f)); } + inline YAPAtom name() { return YAPAtom(NameOfFunctor(f)); }; /// Getter: extract arity of functor as an unsigned integer /// /// this is for external usage. - uintptr_t arity(void) { return ArityOfFunctor(f); } + inline arity_t arity() { return ArityOfFunctor(f); }; + /// Getter: extract functor as C pointer + /// + /// inline Functor functor() { return f; }; }; diff --git a/CXX/yapi.cpp b/CXX/yapi.cpp index df03d1e4b..a8601a122 100644 --- a/CXX/yapi.cpp +++ b/CXX/yapi.cpp @@ -744,6 +744,27 @@ YAPQuery::YAPQuery(YAPFunctor f, YAPTerm mod, YAPTerm ts[]) RECOVER_MACHINE_REGS(); } +YAPQuery::YAPQuery(YAPFunctor f, YAPTerm mod, Term ts[]) + : YAPPredicate(f, mod) { + + /* ignore flags for now */ + BACKUP_MACHINE_REGS(); + Term goal; + + if (ts) { + size_t arity = f.arity(); + goal = Yap_MkApplTerm(Yap_MkFunctor(f.name().asAtom(),arity), arity, ts); + nts = RepAppl(goal) + 1; + for (arity_t i = 0; i < arity; i++) + XREGS[i + 1] = ts[i]; + } else { + goal = MkVarTerm(); + } + openQuery(); + names = YAPPairTerm(TermNil); + RECOVER_MACHINE_REGS(); +} + #if 0 YAPQuery::YAPQuery(YAPFunctor f, YAPTerm ts[]) : YAPPredicate(f) { /* ignore flags for now */ diff --git a/CXX/yapq.hh b/CXX/yapq.hh index 35474603b..d77256888 100644 --- a/CXX/yapq.hh +++ b/CXX/yapq.hh @@ -76,6 +76,7 @@ public: /// least /// the same arity as the functor. YAPQuery(YAPPredicate p, YAPTerm t[]); + /// /// full constructor, /// /// @@ -83,6 +84,9 @@ public: /// least /// the same arity as the functor. YAPQuery(YAPFunctor f, YAPTerm mod, YAPTerm t[]); + /// often, this is more efficient + /// + YAPQuery(YAPFunctor f, YAPTerm mod, Term t[]); /// functor/term constructor, /// /// It is given a functor, and an array of terms that must have at least diff --git a/console/yap.c b/console/yap.c index 9f5b41def..3bcda15ea 100755 --- a/console/yap.c +++ b/console/yap.c @@ -147,6 +147,7 @@ int main(int argc, char **argv) YAP_Reset(YAP_FULL_RESET, false); /* End preprocessor code */ + mtrace(); bool rc = exec_top_level(BootMode, &init_args); if (!rc) return 1; 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). diff --git a/packages/python/CMakeLists.txt b/packages/python/CMakeLists.txt index a648b535e..dd8cd846e 100644 --- a/packages/python/CMakeLists.txt +++ b/packages/python/CMakeLists.txt @@ -11,7 +11,6 @@ ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/os ${CMAKE_SOURCE_DIR}/H ${CMAKE #talk to python.pl add_library(YAPPython pyload.c ${PYTHON_HEADERS} ) - if (WIN32) add_library (Py4YAP OBJECT ${PYTHON_SOURCES} ${PYTHON_HEADERS}) else() diff --git a/packages/python/swig/CMakeLists.txt b/packages/python/swig/CMakeLists.txt index a852c48b3..2308d99b4 100644 --- a/packages/python/swig/CMakeLists.txt +++ b/packages/python/swig/CMakeLists.txt @@ -29,10 +29,7 @@ configure_file(yap4py/__init__.py.in yap4py/__init__.py) INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH} ${CMAKE_CURRENT_BINARY_DIR}/yap4py/include ) - - - - SET(SWIG_SOURCES + SET(SWIG_SOURCES ${CMAKE_SOURCE_DIR}/packages/swig/yap.i ) @@ -46,36 +43,37 @@ INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH} ${CMAKE_CURRENT_BINARY_DIR}/yap4py/i # LIBRARY DESTINATION ${PYTHON_MODULE_PATH} # ) -if (CONDA) - set(bdist bdist_conda) -else() - set(bdist bdist_wheel) -endif() - - add_custom_target( YAP4PY ALL - COMMAND ${SWIG_EXECUTABLE} -c++ -python -O -py3 -module "yap" -addextern -I${CMAKE_SOURCE_DIR}/H -I${CMAKE_SOURCE_DIR}/H/generated -I${CMAKE_SOURCE_DIR}/include - -I${CMAKE_SOURCE_DIR}/OPTYap -I${CMAKE_SOURCE_DIR}/os -I${CMAKE_SOURCE_DIR}/utf8proc -I.././.. -I${CMAKE_SOURCE_DIR}/CXX -I${CMAKE_SOURCE_DIR}/packages/python - -outdir ${CMAKE_CURRENT_BINARY_DIR}/yap4py -I${GMP_INCLUDE_DIRS} -DX_API="" -o ${CMAKE_CURRENT_BINARY_DIR}/yap4py/yap_wrap.cxx -oh ${CMAKE_CURRENT_BINARY_DIR}/yap4py/yap_wrap.hh ${SWIG_SOURCES} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - DEPENDS ${SWIG_SOURCES} Py4YAP YAP++ yap4py/yapi.cpp YAP4PY_PY - ) - - add_custom_command( OUTPUT yap4py/yapi.cpp COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/CXX/yapi.cpp ${CMAKE_CURRENT_BINARY_DIR}/yap4py DEPENDS ${CMAKE_SOURCE_DIR}/CXX/yapi.cpp ) - add_custom_command( OUTPUT YAP4PY_PY - COMMAND ${CMAKE_COMMAND} -E copy ${PYTHON_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/yap4py - DEPENDS ${PYTHON_SOURCES} +add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/yap4py/yap_wrap.cxx ${CMAKE_CURRENT_BINARY_DIR}/yap4py/yap_wrap.hh + COMMAND ${SWIG_EXECUTABLE} -c++ -python -O -py3 -module "yap" -addextern -I${CMAKE_SOURCE_DIR}/H -I${CMAKE_SOURCE_DIR}/H/generated -I${CMAKE_SOURCE_DIR}/include + -I${CMAKE_SOURCE_DIR}/OPTYap -I${CMAKE_SOURCE_DIR}/os -I${CMAKE_SOURCE_DIR}/utf8proc -I.././.. -I${CMAKE_SOURCE_DIR}/CXX -I${CMAKE_SOURCE_DIR}/packages/python + -outdir ${CMAKE_CURRENT_BINARY_DIR}/yap4py -I${GMP_INCLUDE_DIRS} -DX_API="" -o ${CMAKE_CURRENT_BINARY_DIR}/yap4py/yap_wrap.cxx -oh ${CMAKE_CURRENT_BINARY_DIR}/yap4py/yap_wrap.hh ${SWIG_SOURCES} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + DEPENDS ${SWIG_SOURCES} yap4py/yapi.cpp ) + +add_custom_target( YAP4PY ALL + DEPENDS ${CMAKE_SOURCE_DIR}/CXX/yapi.cpp Py4YAP YAP++ yap4py/yapi.cpp ${CMAKE_CURRENT_BINARY_DIR}/yap4py/yap_wrap.cxx ${CMAKE_CURRENT_BINARY_DIR}/yap4py/yap_wrap.hh + ) + + +add_custom_command( TARGET YAP4PY + PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${PYTHON_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/yap4py + COMMAND ${PYTHON_EXECUTABLE} setup.py sdist ${bdist} + DEPENDS ${CMAKE_SOURCE_DIR}/CXX/yapi.cpp Py4YAP YAP++ yap4py/yapi.cpp YAP4PY_PY ${CMAKE_CURRENT_BINARY_DIR}/yap4py/yap_wrap.cxx ${CMAKE_CURRENT_BINARY_DIR}/yap4py/yap_wrap.hh ${PYTHON_SOURCES} Py4YAP STARTUP libYap + ) + + install(CODE "execute_process( - COMMAND ${PYTHON_EXECUTABLE} setup.py sdist ${bdist} COMMAND ${PYTHON_EXECUTABLE} -m pip install ${PYTHON_USER_INSTALL} --ignore-installed . - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})" - DEPENDS Py4YAP ${CMAKE_BINARY_DIR}/${YAP_STARTUP} ${YAP_INSTALL_LIBDIR} ) + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})") + install(FILES ${YAP4PY_PL} DESTINATION ${YAP_INSTALL_DATADIR} ) diff --git a/packages/python/swig/yap4py/yapi.py b/packages/python/swig/yap4py/yapi.py index 460d3a30f..dceea6685 100644 --- a/packages/python/swig/yap4py/yapi.py +++ b/packages/python/swig/yap4py/yapi.py @@ -1,6 +1,10 @@ import readline import copy -from yap4py.yap import * +try: + from yap4py.yap import * +except Exception as e: + print(e) + exit(0) from yap4py.systuples import python_query, show_answer, library, prolog_library, v0, compile, namedtuple from os.path import join, dirname diff --git a/packages/python/yap_kernel/CMakeLists.txt b/packages/python/yap_kernel/CMakeLists.txt index f491c20b2..a607aaab0 100644 --- a/packages/python/yap_kernel/CMakeLists.txt +++ b/packages/python/yap_kernel/CMakeLists.txt @@ -1,7 +1,7 @@ set (PYTHON_SOURCES -core/yap_kernel/__init__.py -core/yap_kernel/getipython.py -core/__init__.py +#core/yap_kernel/__init__.py +#core/yap_kernel/getipython.py +#core/__init__.py _version.py yap_kernel/datapub.py yap_kernel/serialize.py @@ -62,7 +62,7 @@ yap_kernel/pylab/__init__.py yap_kernel/__main__.py yap_kernel.py kernelspec.py -__init__.py +#__init__.py yap_kernel_launcher.py docs/conf.py setup.py @@ -431,20 +431,18 @@ endforeach() -add_custom_target(YAP_KERNEL ALL +add_custom_target(YAP_KERNEL + ALL WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - COMMAND ${PYTHON_EXECUTABLE} ${SETUP_PY} build sdist bdist - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/logo-32x32.png ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/logo-64x64.png ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/kernel.js ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/prolog.js ${OUTS} YAP4PY + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/logo-32x32.png ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/logo-64x64.png ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/kernel.js ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/prolog.js ${OUTS} YAP4PY + COMMAND ${PYTHON_EXECUTABLE} ${SETUP_PY} sdist ${bdist} ) - -set(REAL_SOURCES real.c) - - install(CODE "execute_process( - COMMAND ${PYTHON_EXECUTABLE} -m pip install ${PYTHON_USER_INSTALL} --ignore-installed --no-deps . + install(CODE "execute_process( + COMMAND ${PYTHON_EXECUTABLE} -m pip install ${PYTHON_USER_INSTALL} --ignore-installed . COMMAND ${PYTHON_EXECUTABLE} -m yap_kernel.kernelspec ERROR_VARIABLE setupErr OUTPUT_VARIABLE setupOut - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})") + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})") install(FILES ${PL_SOURCES} DESTINATION ${YAP_INSTALL_DATADIR} ) diff --git a/packages/python/yap_kernel/setup.py b/packages/python/yap_kernel/setup.py index 9e0b36d09..7d94950f1 100644 --- a/packages/python/yap_kernel/setup.py +++ b/packages/python/yap_kernel/setup.py @@ -34,12 +34,20 @@ import os import shutil from distutils.core import setup +from glob import glob +from shutil import copy pjoin = os.path.join here = os.path.abspath(os.path.dirname(__file__)) packages = ['yap_kernel','yap_ipython'] # pkg_root = pjoin(here, name) +try: + copy(glob(pjoin(here,"../swig/build/lib*/_yap*"))[0],here) + copy(glob(pjoin(here,"../../../libYap*"))[-1],here) +except: + pass + for d, _, _ in os.walk(pjoin(here, 'yap_kernel')): if os.path.exists(pjoin(d, '__init__.py')): packages.append(d[len(here)+1:].replace(os.path.sep, '.')) diff --git a/packages/python/yap_kernel/setup.py.cmake b/packages/python/yap_kernel/setup.py.cmake index 69418dd25..eb381f7f0 100644 --- a/packages/python/yap_kernel/setup.py.cmake +++ b/packages/python/yap_kernel/setup.py.cmake @@ -14,6 +14,7 @@ name = 'yap_kernel' #----------------------------------------------------------------------------- import sys +import os v = sys.version_info if v[:2] < (2,7) or (v[0] >= 3 and v[:2] < (3,3)): @@ -28,10 +29,13 @@ PY3 = (sys.version_info[0] >= 3) #----------------------------------------------------------------------------- import os -from glob import glob - +from glob import globx +from shutil import copy from distutils.core import setup +copy(glob("../swig/build/lib/_yap*")[0],"../swig/yap4py") +copy(glob("../../libYap*")[-1],"../swig/yap4py") + packages = ["${CMAKE_CURRENT_SOURCE_DIR}"] version_ns = {} @@ -53,9 +57,8 @@ setup_args = dict( 'Intended Audience :: Developers', 'Intended Audience :: System Administrators', 'Intended Audience :: Science/Research', - 'License :: OSI Approved :: BSD License', + 'License :: OSI Approved :: Perl License', 'Programming Language :: Prolog', - 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', ], ) @@ -79,4 +82,5 @@ if 'setuptools' in sys.modules: setup_args.update(setuptools_args) if __name__ == '__main__': + sys.path += ['../swig'] setup(**setup_args) diff --git a/packages/real/yap4r/src/yap4r.cpp b/packages/real/yap4r/src/yap4r.cpp index 26b6cffbd..ed9e36eb5 100644 --- a/packages/real/yap4r/src/yap4r.cpp +++ b/packages/real/yap4r/src/yap4r.cpp @@ -20,14 +20,19 @@ class yap4r { std::vector args; bool failed; + public: + + SEXP qsexp; yap4r(); - bool query(std::string p_name,std::string p_module,Rcpp::GenericVector sexps); + bool query(std::string p_name, GenericVector sexps=R_NilValue, std::string p_module="user"); bool more(); bool done(); SEXP peek(int i); + bool compile(std::string s); + bool library(std::string s); }; - + yap4r::yap4r() { YAPEngineArgs *yargs = new YAPEngineArgs(); yap = new YAPEngine(yargs); @@ -36,25 +41,57 @@ public: - bool yap4r::query(std::string p_name,std::string p_module,Rcpp::GenericVector sexps) { - +bool yap4r::query(std::string p_name, GenericVector sexps, std::string p_module) { if (q) { q->close(); - q = NULL; + q = nullptr; } - std::vector args = std::vector(); + yhandle_t t; + arity_t arity; + if (sexps.isNULL()) { + YAPTerm qt = YAPAtomTerm(p_name.c_str()); + q = new YAPQuery(qt); +t =qt.handle(); + } else { +arity = sexps.length(); + std::vector args = std::vector(); yhandle_t sls = Yap_NewHandles(sexps.length()); for (int i=0; inext(); + if (!rc) { + failed = true; + q = nullptr; + } + if(rc) + qsexp = term_to_sexp(t, false); + + return rc; } - +bool yap4r::compile(std::string s) { + YAPTerm fs[1]; + fs[0] = YAPAtomTerm(s.c_str()); + return yap->mgoal(YAPApplTerm("compile",fs).term(), USER_MODULE); + +} +bool yap4r::library(std::string s) { + YAPTerm fs[1], l[1]; + l[0] = YAPAtomTerm(s.c_str()); + fs[0] = YAPApplTerm("library", l); + return yap->mgoal(YAPApplTerm("compile",fs).term(), USER_MODULE); + +} bool yap4r::more() { bool rc = true; @@ -83,6 +120,8 @@ public: SEXP yap4r::peek(int i) { if (failed || q==nullptr) return R_MissingArg; + if (i==0) + return qsexp; return term_to_sexp(Yap_InitSlot(Yap_XREGS[i]), false); } @@ -93,6 +132,8 @@ public: .method( "query", &yap4r::query, "create an active query within the engine") .method( "more", &yap4r::more, "ask for an extra solution") .method( "done", &yap4r::done, "terminate the query") + .method( "compile", &yap4r::compile, "compile the file") + .method( "library", &yap4r::library, "compile the library") .method( "peek", &yap4r::peek, "load arg[i] into R") ; } diff --git a/packages/yap-lbfgs/lbfgs.pl b/packages/yap-lbfgs/lbfgs.pl index 1d5e39452..a64a6abff 100644 --- a/packages/yap-lbfgs/lbfgs.pl +++ b/packages/yap-lbfgs/lbfgs.pl @@ -26,10 +26,9 @@ lbfgs_finalize/1, - lbfgs_set_parameter/3, - lbfgs_get_parameter/3, - lbfgs_parameters/0, - lbfgs_parameters/1]). + lbfgs_set_parameter/2, + lbfgs_get_parameter/2, + lbfgs_parameters/0]). % switch on all the checks to reduce bug searching time % :- yap_flag(unknown,error). @@ -187,12 +186,12 @@ lbfgs_finalize(t(_N,X,_U,Params)) :- run the algorithm. output the final score of the function being optimised */ -lbfgs_run(t(N,X,U,Params),FX) :- - lbfgs(N,X, Params, U, FX). +lbfgs_run(t(N,X,U),FX) :- + lbfgs(N,X, U, FX). -/** @pred lbfgs_parameters/1 +/** @pred lbfgs_parameters/0 Prints a table with the current parameters. See the documentation of libLBFGS for the meaning of each parameter. @@ -220,47 +219,43 @@ int orthantwise_end -1 End index for computing the L1 norm ~~~~ */ lbfgs_parameters :- - lbfgs_defaults(Params), - lbfgs_parameters(t(_X,_,_,Params)). - -lbfgs_parameters(t(_,_,_,Params)) :- - lbfgs_get_parameter(m,M ,Params), - lbfgs_get_parameter(epsilon,Epsilon ,Params), - lbfgs_get_parameter(past,Past ,Params), - lbfgs_get_parameter(delta,Delta ,Params), - lbfgs_get_parameter(max_iterations,Max_Iterations ,Params), - lbfgs_get_parameter(linesearch,Linesearch ,Params), - lbfgs_get_parameter(max_linesearch,Max_Linesearch ,Params), - lbfgs_get_parameter(min_step,Min_Step ,Params), - lbfgs_get_parameter(max_step,Max_Step ,Params), - lbfgs_get_parameter(ftol,Ftol ,Params), - lbfgs_get_parameter(gtol,Gtol ,Params), - lbfgs_get_parameter(xtol,Xtol ,Params), - lbfgs_get_parameter(orthantwise_c,Orthantwise_C ,Params), - lbfgs_get_parameter(orthantwise_start,Orthantwise_Start ,Params), - lbfgs_get_parameter(orthantwise_end,Orthantwise_End ,Params), + lbfgs_get_parameter(m,M ), + lbfgs_get_parameter(epsilon,Epsilon ), + lbfgs_get_parameter(past,Past ), + lbfgs_get_parameter(delta,Delta ), + lbfgs_get_parameter(max_iterations,Max_Iterations ), + lbfgs_get_parameter(linesearch,Linesearch ), + lbfgs_get_parameter(max_linesearch,Max_Linesearch ), + lbfgs_get_parameter(min_step,Min_Step ), + lbfgs_get_parameter(max_step,Max_Step ), + lbfgs_get_parameter(ftol,Ftol ), + lbfgs_get_parameter(gtol,Gtol ), + lbfgs_get_parameter(xtol,Xtol ), + lbfgs_get_parameter(orthantwise_c,Orthantwise_C ), + lbfgs_get_parameter(orthantwise_start,Orthantwise_Start ), + lbfgs_get_parameter(orthantwise_end,Orthantwise_End ), format('/******************************************************************************************~n',[] ), - print_param('Name','Value','Description','Type' ,Params), + print_param('Name','Value','Description','Type' ), format('******************************************************************************************~n',[] ), - print_param(m,M,'The number of corrections to approximate the inverse hessian matrix.',int ,Params), - print_param(epsilon,Epsilon,'Epsilon for convergence test.',float ,Params), - print_param(past,Past,'Distance for delta-based convergence test.',int ,Params), - print_param(delta,Delta,'Delta for convergence test.',float ,Params), - print_param(max_iterations,Max_Iterations,'The maximum number of iterations',int ,Params), - print_param(linesearch,Linesearch,'The line search algorithm.',int ,Params), - print_param(max_linesearch,Max_Linesearch,'The maximum number of trials for the line search.',int ,Params), - print_param(min_step,Min_Step,'The minimum step of the line search routine.',float ,Params), - print_param(max_step,Max_Step,'The maximum step of the line search.',float ,Params), - print_param(ftol,Ftol,'A parameter to control the accuracy of the line search routine.',float ,Params), - print_param(gtol,Gtol,'A parameter to control the accuracy of the line search routine.',float ,Params), - print_param(xtol,Xtol,'The machine precision for floating-point values.',float ,Params), - print_param(orthantwise_c,Orthantwise_C,'Coefficient for the L1 norm of variables',float ,Params), - print_param(orthantwise_start,Orthantwise_Start,'Start index for computing the L1 norm of the variables.',int ,Params), - print_param(orthantwise_end,Orthantwise_End,'End index for computing the L1 norm of the variables.',int ,Params), + print_param(m,M,'The number of corrections to approximate the inverse hessian matrix.',int ), + print_param(epsilon,Epsilon,'Epsilon for convergence test.',float ), + print_param(past,Past,'Distance for delta-based convergence test.',int ), + print_param(delta,Delta,'Delta for convergence test.',float ), + print_param(max_iterations,Max_Iterations,'The maximum number of iterations',int ), + print_param(linesearch,Linesearch,'The line search algorithm.',int ), + print_param(max_linesearch,Max_Linesearch,'The maximum number of trials for the line search.',int ), + print_param(min_step,Min_Step,'The minimum step of the line search routine.',float ), + print_param(max_step,Max_Step,'The maximum step of the line search.',float ), + print_param(ftol,Ftol,'A parameter to control the accuracy of the line search routine.',float ), + print_param(gtol,Gtol,'A parameter to control the accuracy of the line search routine.',float ), + print_param(xtol,Xtol,'The machine precision for floating-point values.',float ), + print_param(orthantwise_c,Orthantwise_C,'Coefficient for the L1 norm of variables',float ), + print_param(orthantwise_start,Orthantwise_Start,'Start index for computing the L1 norm of the variables.',int ), + print_param(orthantwise_end,Orthantwise_End,'End index for computing the L1 norm of the variables.',int ), format('******************************************************************************************/~n',[]), - format(' use lbfgs_set_parameter(Name,Value,Solver) to change parameters~n',[]), - format(' use lbfgs_get_parameter(Name,Value,Solver) to see current parameters~n',[]), + format(' use lbfgs_set_parameter(Name,Value) to change parameters~n',[]), + format(' use lbfgs_get_parameter(Name,Value) to see current parameters~n',[]), format(' use lbfgs_parameters to print this overview~2n',[]). diff --git a/packages/yap-lbfgs/yap_lbfgs.c b/packages/yap-lbfgs/yap_lbfgs.c index a5db1344d..2b30610d5 100644 --- a/packages/yap-lbfgs/yap_lbfgs.c +++ b/packages/yap-lbfgs/yap_lbfgs.c @@ -39,14 +39,14 @@ static lbfgsfloatval_t evaluate(void *instance, const lbfgsfloatval_t *x, YAP_Term call; YAP_Bool result; lbfgsfloatval_t rc; - YAP_Term v; + YAP_Term v, t1, t12; YAP_Term t[6], t2[2]; t[0] = v = YAP_MkVarTerm(); - t[1] = YAP_MkIntTerm((YAP_Int)x); - t[1] = YAP_MkApplTerm(ffloats, 1, t + 1); - t[2] = YAP_MkIntTerm((YAP_Int)g_tmp); - t[2] = YAP_MkApplTerm(ffloats, 1, t + 2); + t1 = YAP_MkIntTerm((YAP_Int)x); + t[1] = YAP_MkApplTerm(ffloats, 1, &t1); + t12 = YAP_MkIntTerm((YAP_Int)g_tmp); + t[2] = YAP_MkApplTerm(ffloats, 1, &t12); t[3] = YAP_MkIntTerm(n); t[4] = YAP_MkFloatTerm(step); t[5] = YAP_MkIntTerm((YAP_Int)instance); @@ -310,8 +310,10 @@ static YAP_Bool p_lbfgs(void) { s = "A logic error (negative line-search step) occurred."; break; } - fprintf(stderr, "optimization terminated with code %d: %s\n", ret, s); - + char ss[1024]; + snprintf(ss, 1023, "optimization terminated with code %d: %s\n", ret, s); + fputs(ss, stderr); + return true; } @@ -326,16 +328,8 @@ static YAP_Bool lbfgs_grab(void) { return YAP_Unify(YAP_ARG2, YAP_MkApplTerm(ffloats, 1, &t)); } -static YAP_Bool lbfgs_parameters(void) { - lbfgs_parameter_t *x = malloc(sizeof(lbfgs_parameter_t)); - lbfgs_parameter_init(x); - return YAP_Unify(YAP_ARG1, YAP_MkIntTerm((YAP_Int)x)); -} +static lbfgs_parameter_t parms; -static YAP_Bool lbfgs_release_parameters(void) { - free((void *)YAP_IntOfTerm(YAP_ARG1)); - return true; -} static YAP_Bool lbfgs_release(void) { /* if (lbfgs_status == LBFGS_STATUS_NONE) { */ @@ -349,11 +343,11 @@ static YAP_Bool lbfgs_release(void) { return TRUE; /* return FALSE; */ } +static YAP_Bool lbfgs_defaults(void) { -static lbfgs_parameter_t *get_params(YAP_Term t) { - YAP_Int ar = YAP_ArityOfFunctor(YAP_FunctorOfTerm(t)); - YAP_Term arg = YAP_ArgOfTerm(ar, t); - return (lbfgs_parameter_t *)YAP_IntOfTerm(arg); + lbfgs_parameter_init(&parms); + return TRUE; + /* return FALSE; */ } /** @pred lbfgs_set_parameter(+Name,+Value,+Parameters) @@ -363,7 +357,7 @@ is not running. static YAP_Bool lbfgs_set_parameter(void) { YAP_Term t1 = YAP_ARG1; YAP_Term t2 = YAP_ARG2; - lbfgs_parameter_t *param = get_params(YAP_ARG3); + lbfgs_parameter_t *param = &parms; /* if (lbfgs_status != LBFGS_STATUS_NONE && lbfgs_status != * LBFGS_STATUS_INITIALIZED){ */ /* printf("ERROR: Lbfgs is running right now. Please wait till it is @@ -523,9 +517,9 @@ Get the current Value for Name static YAP_Bool lbfgs_get_parameter(void) { YAP_Term t1 = YAP_ARG1; YAP_Term t2 = YAP_ARG2; - lbfgs_parameter_t *param = get_params(YAP_ARG3); + lbfgs_parameter_t *param = &parms; - if (!YAP_IsAtomTerm(t1)) { + if (!YAP_IsAtomTerm(t1)) { return FALSE; } @@ -575,14 +569,14 @@ X_API void init_lbfgs_predicates(void) { tuser = YAP_MkAtomTerm(YAP_LookupAtom("user")); // Initialize the parameters for the L-BFGS optimization. - // lbfgs_parameter_init(¶m); + lbfgs_parameter_init(&parms); YAP_UserCPredicate("lbfgs_grab", lbfgs_grab, 2); YAP_UserCPredicate("lbfgs", p_lbfgs, 5); YAP_UserCPredicate("lbfgs_release", lbfgs_release, 1); - YAP_UserCPredicate("lbfgs_defaults", lbfgs_parameters, 1); - YAP_UserCPredicate("lbfgs_release_parameters", lbfgs_release_parameters, 1); - YAP_UserCPredicate("lbfgs_set_parameter", lbfgs_set_parameter, 3); - YAP_UserCPredicate("lbfgs_get_parameter", lbfgs_get_parameter, 3); + YAP_UserCPredicate("lbfgs_defaults", lbfgs_defaults, 0); + + YAP_UserCPredicate("lbfgs_set_parameter", lbfgs_set_parameter, 2); + YAP_UserCPredicate("lbfgs_get_parameter", lbfgs_get_parameter, 2); }