Merge branch 'master' of ssh://yap.git.sourceforge.net/gitroot/yap/yap-6.3

This commit is contained in:
Tiago Gomes 2012-09-24 22:23:48 +01:00
commit 265766277f
34 changed files with 5240 additions and 15407 deletions

View File

@ -478,7 +478,8 @@ X_API void STD_PROTO(YAP_EndConsult,(IOSTREAM *));
X_API Term STD_PROTO(YAP_Read, (IOSTREAM *)); X_API Term STD_PROTO(YAP_Read, (IOSTREAM *));
X_API void STD_PROTO(YAP_Write, (Term, IOSTREAM *, int)); X_API void STD_PROTO(YAP_Write, (Term, IOSTREAM *, int));
X_API Term STD_PROTO(YAP_CopyTerm, (Term)); X_API Term STD_PROTO(YAP_CopyTerm, (Term));
X_API Term STD_PROTO(YAP_WriteBuffer, (Term, char *, unsigned int, int)); X_API int STD_PROTO(YAP_WriteBuffer, (Term, char *, size_t, int));
X_API char *STD_PROTO(YAP_WriteDynamicBuffer, (Term, char *, size_t, size_t *, int *, int));
X_API char *STD_PROTO(YAP_CompileClause, (Term)); X_API char *STD_PROTO(YAP_CompileClause, (Term));
X_API void STD_PROTO(YAP_PutValue, (Atom,Term)); X_API void STD_PROTO(YAP_PutValue, (Atom,Term));
X_API Term STD_PROTO(YAP_GetValue, (Atom)); X_API Term STD_PROTO(YAP_GetValue, (Atom));
@ -2799,13 +2800,33 @@ YAP_CopyTerm(Term t)
return tn; return tn;
} }
X_API Term X_API int
YAP_WriteBuffer(Term t, char *buf, unsigned int sze, int flags) YAP_WriteBuffer(Term t, char *buf, size_t sze, int flags)
{ {
int enc;
size_t length;
char *b;
BACKUP_MACHINE_REGS(); BACKUP_MACHINE_REGS();
t = Yap_TermToString(t, buf, sze, flags); if ((b = Yap_TermToString(t, buf, sze, &length, &enc, flags)) != buf) {
if (b) free(b);
RECOVER_MACHINE_REGS(); RECOVER_MACHINE_REGS();
return t; return FALSE;
}
RECOVER_MACHINE_REGS();
return TRUE;
}
X_API char *
YAP_WriteDynamicBuffer(Term t, char *buf, size_t sze, size_t *lengthp, int *encp, int flags)
{
int enc;
char *b;
BACKUP_MACHINE_REGS();
b = Yap_TermToString(t, buf, sze, lengthp, encp, flags);
RECOVER_MACHINE_REGS();
return b;
} }
X_API char * X_API char *
@ -3165,7 +3186,7 @@ YAP_Init(YAP_init_args *yap_init)
Yap_AttsSize = 2048*sizeof(CELL); Yap_AttsSize = 2048*sizeof(CELL);
if (restore_result == DO_ONLY_CODE) { if (restore_result == DO_ONLY_CODE) {
/* first, initialise the saved state */ /* first, initialise the saved state */
Term t_goal = MkAtomTerm(AtomStartupSavedState); Term t_goal = MkAtomTerm(AtomInitProlog);
YAP_RunGoalOnce(t_goal); YAP_RunGoalOnce(t_goal);
Yap_InitYaamRegs(); Yap_InitYaamRegs();
/* reset stacks */ /* reset stacks */

View File

@ -1090,6 +1090,24 @@ Yap_InitBackIO (void)
{ {
} }
/* used to test writebuffer
static Int
p_write_string( USES_REGS1 )
{
Term in = Deref(ARG1);
char *s;
size_t length;
int encoding;
char buf[256];
if ((s = Yap_TermToString( in, NULL, 0, &length, &encoding, 0)))
fprintf(stderr,"%ld %s\n",length, s);
if ((s = Yap_TermToString( in, buf, 256, &length, &encoding, 0)))
fprintf(stderr,"%ld %s\n",length, s);
return TRUE;
}
*/
void void
Yap_InitIOPreds(void) Yap_InitIOPreds(void)
@ -1101,6 +1119,7 @@ Yap_InitIOPreds(void)
Yap_InitCPred ("$get_read_error_handler", 1, p_get_read_error_handler, SafePredFlag|SyncPredFlag|HiddenPredFlag); Yap_InitCPred ("$get_read_error_handler", 1, p_get_read_error_handler, SafePredFlag|SyncPredFlag|HiddenPredFlag);
Yap_InitCPred ("$read", 7, p_read, SyncPredFlag|HiddenPredFlag|UserCPredFlag); Yap_InitCPred ("$read", 7, p_read, SyncPredFlag|HiddenPredFlag|UserCPredFlag);
Yap_InitCPred ("$read", 8, p_read2, SyncPredFlag|HiddenPredFlag|UserCPredFlag); Yap_InitCPred ("$read", 8, p_read2, SyncPredFlag|HiddenPredFlag|UserCPredFlag);
/* test predicate Yap_InitCPred ("write_string", 2, p_write_string, SyncPredFlag|UserCPredFlag); */
Yap_InitCPred ("$start_line", 1, p_startline, SafePredFlag|SyncPredFlag|HiddenPredFlag); Yap_InitCPred ("$start_line", 1, p_startline, SafePredFlag|SyncPredFlag|HiddenPredFlag);
Yap_InitCPred ("$change_type_of_char", 2, p_change_type_of_char, SafePredFlag|SyncPredFlag|HiddenPredFlag); Yap_InitCPred ("$change_type_of_char", 2, p_change_type_of_char, SafePredFlag|SyncPredFlag|HiddenPredFlag);
Yap_InitCPred ("$type_of_char", 2, p_type_of_char, SafePredFlag|SyncPredFlag|HiddenPredFlag); Yap_InitCPred ("$type_of_char", 2, p_type_of_char, SafePredFlag|SyncPredFlag|HiddenPredFlag);

View File

@ -836,7 +836,72 @@ PL_get_chars(term_t t, char **s, unsigned flags)
{ return PL_get_nchars(t, NULL, s, flags); { return PL_get_nchars(t, NULL, s, flags);
} }
char *Yap_TermToString(Term t, char *s, size_t sz, size_t *length, int *encoding, int flags);
char *
Yap_TermToString(Term t, char *s, size_t sz, size_t *length, int *encoding, int flags)
{
CACHE_REGS
Int l;
Yap_StartSlots( PASS_REGS1 );
l = Yap_InitSlot(t);
{ IOENC encodings[3];
IOENC *enc;
char *r, buf[256];
encodings[0] = ENC_ISO_LATIN_1;
encodings[1] = ENC_WCHAR;
encodings[2] = ENC_UNKNOWN;
for(enc = encodings; *enc != ENC_UNKNOWN; enc++)
{
int64_t size;
IOSTREAM *fd;
if (s) {
r = s;
} else {
r = buf;
}
fd = Sopenmem(&r, &sz, "w");
fd->encoding = *enc;
if ( PL_write_term(fd, l, 1200, flags) &&
Sputcode(EOS, fd) >= 0 &&
Sflush(fd) >= 0 )
{ *encoding = *enc;
size = Stell64(fd);
if ( *enc == ENC_ISO_LATIN_1 )
{
*length = size-1;
} else
{
*length = (size/sizeof(pl_wchar_t))-1;
}
/* found, just check if using local space */
if (r == buf) {
char *bf = malloc(*length+1);
if (!bf)
return NULL;
strncpy(bf,buf,*length+1);
r = bf;
}
/* go away */
Yap_CloseSlots( PASS_REGS1 );
return r;
} else
{ Sclose(fd);
}
}
/* failed */
if ( r != s && r != buf ) {
Sfree(r);
}
}
Yap_CloseSlots( PASS_REGS1 );
return NULL;
}
X_API int X_API int

View File

@ -999,9 +999,13 @@ p_read_module_preds( USES_REGS1 )
} }
static void static void
ReInitCatch(void) ReInitProlog(void)
{ {
Term t = Yap_MkNewApplTerm(PredHandleThrow->FunctorOfPred, PredHandleThrow->ArityOfPE); Term t = MkAtomTerm(AtomInitProlog);
#if defined(YAPOR) || defined(TABLING)
Yap_init_root_frames();
#endif /* YAPOR || TABLING */
Yap_InitYaamRegs();
YAP_RunGoalOnce(t); YAP_RunGoalOnce(t);
} }
@ -1030,7 +1034,7 @@ p_read_program( USES_REGS1 )
Sclose( stream ); Sclose( stream );
/* back to the top level we go */ /* back to the top level we go */
Yap_CloseSlots(PASS_REGS1); Yap_CloseSlots(PASS_REGS1);
ReInitCatch(); ReInitProlog();
Yap_RestartYap( 3 ); Yap_RestartYap( 3 );
return TRUE; return TRUE;
} }
@ -1044,7 +1048,6 @@ Yap_Restore(char *s, char *lib_dir)
return -1; return -1;
read_module(stream); read_module(stream);
Sclose( stream ); Sclose( stream );
ReInitCatch();
return DO_ONLY_CODE; return DO_ONLY_CODE;
} }

View File

@ -135,6 +135,7 @@
AtomId = Yap_LookupAtom("id"); AtomId = Yap_LookupAtom("id");
AtomInf = Yap_LookupAtom("inf"); AtomInf = Yap_LookupAtom("inf");
AtomInitGoal = Yap_FullLookupAtom("$init_goal"); AtomInitGoal = Yap_FullLookupAtom("$init_goal");
AtomInitProlog = Yap_FullLookupAtom("$init_prolog");
AtomInStackExpansion = Yap_LookupAtom("in stack expansion"); AtomInStackExpansion = Yap_LookupAtom("in stack expansion");
AtomInput = Yap_LookupAtom("input"); AtomInput = Yap_LookupAtom("input");
AtomInstantiationError = Yap_LookupAtom("instantiation_error"); AtomInstantiationError = Yap_LookupAtom("instantiation_error");

View File

@ -135,6 +135,7 @@
AtomId = AtomAdjust(AtomId); AtomId = AtomAdjust(AtomId);
AtomInf = AtomAdjust(AtomInf); AtomInf = AtomAdjust(AtomInf);
AtomInitGoal = AtomAdjust(AtomInitGoal); AtomInitGoal = AtomAdjust(AtomInitGoal);
AtomInitProlog = AtomAdjust(AtomInitProlog);
AtomInStackExpansion = AtomAdjust(AtomInStackExpansion); AtomInStackExpansion = AtomAdjust(AtomInStackExpansion);
AtomInput = AtomAdjust(AtomInput); AtomInput = AtomAdjust(AtomInput);
AtomInstantiationError = AtomAdjust(AtomInstantiationError); AtomInstantiationError = AtomAdjust(AtomInstantiationError);

View File

@ -268,6 +268,8 @@
#define AtomInf Yap_heap_regs->AtomInf_ #define AtomInf Yap_heap_regs->AtomInf_
Atom AtomInitGoal_; Atom AtomInitGoal_;
#define AtomInitGoal Yap_heap_regs->AtomInitGoal_ #define AtomInitGoal Yap_heap_regs->AtomInitGoal_
Atom AtomInitProlog_;
#define AtomInitProlog Yap_heap_regs->AtomInitProlog_
Atom AtomInStackExpansion_; Atom AtomInStackExpansion_;
#define AtomInStackExpansion Yap_heap_regs->AtomInStackExpansion_ #define AtomInStackExpansion Yap_heap_regs->AtomInStackExpansion_
Atom AtomInput_; Atom AtomInput_;

View File

@ -278,11 +278,11 @@ int STD_PROTO(Yap_GetCharForSIGINT,(void));
Int STD_PROTO(Yap_StreamToFileNo,(Term)); Int STD_PROTO(Yap_StreamToFileNo,(Term));
Term STD_PROTO(Yap_OpenStream,(FILE *,char *,Term,int)); Term STD_PROTO(Yap_OpenStream,(FILE *,char *,Term,int));
Term STD_PROTO(Yap_StringToTerm,(char *,Term *)); Term STD_PROTO(Yap_StringToTerm,(char *,Term *));
Term STD_PROTO(Yap_TermToString,(Term,char *,unsigned int,int)); char *Yap_TermToString(Term t, char *s, size_t sz, size_t *length, int *encoding, int flags);
int STD_PROTO(Yap_GetFreeStreamD,(void)); int Yap_GetFreeStreamD(void);
int STD_PROTO(Yap_GetFreeStreamDForReading,(void)); int Yap_GetFreeStreamDForReading(void);
Term STD_PROTO(Yap_WStringToList,(wchar_t *)); Term Yap_WStringToList(wchar_t *);
Term STD_PROTO(Yap_WStringToListOfAtoms,(wchar_t *)); Term STD_PROTO(Yap_WStringToListOfAtoms,(wchar_t *));
Atom STD_PROTO(Yap_LookupWideAtom,(wchar_t *)); Atom STD_PROTO(Yap_LookupWideAtom,(wchar_t *));

View File

@ -714,6 +714,7 @@ all: startup.yss
@ENABLE_REAL@ (cd packages/real; $(MAKE)) @ENABLE_REAL@ (cd packages/real; $(MAKE))
@ENABLE_CLPBN_BP@ (cd packages/CLPBN/horus; $(MAKE)) @ENABLE_CLPBN_BP@ (cd packages/CLPBN/horus; $(MAKE))
@ENABLE_MINISAT@ (cd packages/swi-minisat2/C; $(MAKE)) @ENABLE_MINISAT@ (cd packages/swi-minisat2/C; $(MAKE))
@ENABLE_LIBARCHIVE@ @INSTALL_DLLS@ (cd packages/archive; $(MAKE))
@ENABLE_ZLIB@ @INSTALL_DLLS@ (cd packages/zlib; $(MAKE)) @ENABLE_ZLIB@ @INSTALL_DLLS@ (cd packages/zlib; $(MAKE))
@ENABLE_CPLINT@ (cd packages/cplint/approx/simplecuddLPADs; $(MAKE)) @ENABLE_CPLINT@ (cd packages/cplint/approx/simplecuddLPADs; $(MAKE))
@ENABLE_CPLINT@ (cd packages/cplint; $(MAKE)) @ENABLE_CPLINT@ (cd packages/cplint; $(MAKE))
@ -785,6 +786,7 @@ install_unix: startup.yss libYap.a
@ENABLE_SEMWEB@ @INSTALL_DLLS@ (cd packages/semweb; $(MAKE) install) @ENABLE_SEMWEB@ @INSTALL_DLLS@ (cd packages/semweb; $(MAKE) install)
@ENABLE_SGML@ @INSTALL_DLLS@ (cd packages/sgml; $(MAKE) install) @ENABLE_SGML@ @INSTALL_DLLS@ (cd packages/sgml; $(MAKE) install)
@ENABLE_ZLIB@ @INSTALL_DLLS@ (cd packages/zlib; $(MAKE) @ZLIB_INSTALL@) @ENABLE_ZLIB@ @INSTALL_DLLS@ (cd packages/zlib; $(MAKE) @ZLIB_INSTALL@)
@ENABLE_LIBARCHIVE@ @INSTALL_DLLS@ (cd packages/archive; $(MAKE) install)
@ENABLE_CLPBN_BP@ @INSTALL_DLLS@ (cd packages/CLPBN/horus; $(MAKE) install) @ENABLE_CLPBN_BP@ @INSTALL_DLLS@ (cd packages/CLPBN/horus; $(MAKE) install)
@ENABLE_MINISAT@ (cd packages/swi-minisat2/C; $(MAKE) install) @ENABLE_MINISAT@ (cd packages/swi-minisat2/C; $(MAKE) install)
@INSTALL_MATLAB@ (cd library/matlab; $(MAKE) install) @INSTALL_MATLAB@ (cd library/matlab; $(MAKE) install)

19047
configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -657,6 +657,7 @@ AC_CHECK_TOOL(MPI_CC,mpicc,${CC})
AC_PATH_PROG(INSTALL_INFO,install-info,true,$PATH:/sbin:/usr/sbin:/usr/etc:/usr/local/sbin) AC_PATH_PROG(INSTALL_INFO,install-info,true,$PATH:/sbin:/usr/sbin:/usr/etc:/usr/local/sbin)
AC_PATH_PROG(SHELL,sh) AC_PATH_PROG(SHELL,sh)
dnl Check for libraries. dnl Check for libraries.
dnl mingw does not get along well with libm dnl mingw does not get along well with libm
dnl cygnus and mingw32 also need wsock32 to use sockets. dnl cygnus and mingw32 also need wsock32 to use sockets.
@ -725,16 +726,29 @@ else
AC_CHECK_LIB(nss_files,main) AC_CHECK_LIB(nss_files,main)
AC_CHECK_LIB(nss_dns,main) AC_CHECK_LIB(nss_dns,main)
AC_CHECK_LIB(resolv,main) AC_CHECK_LIB(resolv,main)
if test "$prefix" != "NONE"; then
if test -d "${prefix}/lib64" -a "$YAP_TARGET" = amd64; then
LDFLAGS="$LDFLAGS -L${prefix}/lib64"
fi
LDFLAGS="$LDFLAGS -L${prefix}/lib"
CPPFLAGS="$CPPFLAGS -I${prefix}/include"
fi
if test "$exec_prefix" != "NONE"; then
if test -d "${exec_prefix}/lib64" -a "$YAP_TARGET" = amd64; then
LDFLAGS="$LDFLAGS -L${exec_prefix}/lib64"
fi
LDFLAGS="$LDFLAGS -L${exec_prefix}/lib"
fi
fi fi
if test "$yap_cv_readline" != "no" if test "$yap_cv_readline" != "no"
then then
AC_CHECK_LIB([ncurses], [main],[ AC_CHECK_LIB([ncurses], [main],[
LIBS="$LIBS -lncurses" LDFLAGS="$LDFLAGS -lncurses"
]) ])
AC_CHECK_LIB([readline], [main],[ AC_CHECK_LIB([readline], [main],[
AC_DEFINE([HAVE_LIBREADLINE], [1],[Define if you have libreadline]) AC_DEFINE([HAVE_LIBREADLINE], [1],[Define if you have libreadline])
LIBS="$LIBS -lreadline" LIBS="$LDFLAGS -lreadline"
], ],
[if test "x$with_readline" != xcheck; then [if test "x$with_readline" != xcheck; then
AC_MSG_FAILURE( AC_MSG_FAILURE(
@ -951,6 +965,12 @@ else
fi fi
AC_SUBST(ENABLE_PRISM) AC_SUBST(ENABLE_PRISM)
if test -e "$srcdir"/packages/archive/Makefile.in; then
ENABLE_LIBARCHIVE=""
else
ENABLE_LIBARCHIVE="@# "
fi
if test "$use_chr" = no; then if test "$use_chr" = no; then
ENABLE_CHR="@# " ENABLE_CHR="@# "
elif test -e "$srcdir"/packages/chr/Makefile.in; then elif test -e "$srcdir"/packages/chr/Makefile.in; then
@ -1038,20 +1058,20 @@ elif test -e "$srcdir"/packages/jpl/Makefile.in; then
else else
JAVALIBS="\"$JAVA_HOME\"/lib/jvm.lib" JAVALIBS="\"$JAVA_HOME\"/lib/jvm.lib"
fi fi
JAVACFLAGS="-I\"$JAVA_HOME\"/include -I\"$JAVA_HOME\"/include/win32" JPLCFLAGS="-I\"$JAVA_HOME\"/include -I\"$JAVA_HOME\"/include/win32"
;; ;;
*darwin*) *darwin*)
LIBS="$LIBS -framework JavaVM" LIBS="$LIBS -framework JavaVM"
JAVALIBS="-L/System/Library/Frameworks/JavaVM.framework/Libraries -Wl,-framework,JavaVM" JAVALIBS="-L/System/Library/Frameworks/JavaVM.framework/Libraries -Wl,-framework,JavaVM"
JAVACFLAGS="-I/System/Library/Frameworks/JavaVM.framework/Headers" JPLCFLAGS="-I/System/Library/Frameworks/JavaVM.framework/Headers"
;; ;;
*) *)
case "$target_os" in case "$target_os" in
*linux*) *linux*)
JAVACFLAGS="-I\"$JAVA_HOME\"/include -I\"$JAVA_HOME\"/include/linux" JPLCFLAGS="-I\"$JAVA_HOME\"/include -I\"$JAVA_HOME\"/include/linux"
;; ;;
*solaris*) *solaris*)
JAVACFLAGS="-I\"$JAVA_HOME\"/include -I\"$JAVA_HOME\"/include/solaris" JPLCFLAGS="-I\"$JAVA_HOME\"/include -I\"$JAVA_HOME\"/include/solaris"
;; ;;
esac esac
JAVALIBS="-L$JAVA_HOME/jre/lib/$YAP_TARGET -L$JAVA_HOME/jre/lib/$YAP_TARGET/client -L$JAVA_HOME/jre/lib/$YAP_TARGET/server -Wl,-R,$JAVA_HOME/jre/lib/$YAP_TARGET -ljava -lverify -ljvm " JAVALIBS="-L$JAVA_HOME/jre/lib/$YAP_TARGET -L$JAVA_HOME/jre/lib/$YAP_TARGET/client -L$JAVA_HOME/jre/lib/$YAP_TARGET/server -Wl,-R,$JAVA_HOME/jre/lib/$YAP_TARGET -ljava -lverify -ljvm "
@ -1607,39 +1627,6 @@ AC_SUBST(ENABLE_CPLINT)
AC_SUBST(INSTALL_ENV) AC_SUBST(INSTALL_ENV)
AC_SUBST(PRE_INSTALL_ENV) AC_SUBST(PRE_INSTALL_ENV)
dnl zlib
if test "$ENABLE_ZLIB" = ""
then
AC_CHECK_LIB(z, zlibVersion,
ZLIBS="-lz"
ZLIB=yes,
ZLIB=no)
if test "$ZLIB" = yes; then
ZLIB_TARGETS="zlib4pl.$SO"
ZLIB_PLTARGETS='zlib.pl'
ZLIB_INSTALL=install
else
ZLIB_TARGETS=nolib
ZLIB_INSTALL=nolib
cat << EOF
##################################################################
# ERROR: Could not find library zlib (-lz). Dropped library(zlib)
# Library zlib is available from http://www.zlib.net/
# Most Unix/Linux distributions are shipped with binaries. Make
# sure to have the development library installed.
##################################################################
EOF
fi
AC_SUBST(ZLIBS)
AC_SUBST(ZLIB_TARGETS)
AC_SUBST(ZLIB_PLTARGETS)
AC_SUBST(ZLIB_INSTALL)
fi
dnl Checks for header files. dnl Checks for header files.
AC_HEADER_STDC AC_HEADER_STDC
AC_HEADER_SYS_WAIT AC_HEADER_SYS_WAIT
@ -1725,6 +1712,7 @@ fi
AC_SUBST(M4) AC_SUBST(M4)
AC_SUBST(M4GENHDRS) AC_SUBST(M4GENHDRS)
CMDEXT=sh
dnl SWI compatibility, I don't know why just use host... dnl SWI compatibility, I don't know why just use host...
changequote(,)dnl changequote(,)dnl
if test "x$ARCH" = "x"; then if test "x$ARCH" = "x"; then
@ -1743,6 +1731,8 @@ fi
changequote([,])dnl changequote([,])dnl
AC_SUBST(ARCH) AC_SUBST(ARCH)
CMDEXT=sh
dnl System stuff for dynamic linking. dnl System stuff for dynamic linking.
dnl dnl
dnl Exports: dnl Exports:
@ -1804,13 +1794,16 @@ AC_SUBST(MPI_OBJS)
AC_SUBST(MPI_LIBS) AC_SUBST(MPI_LIBS)
AC_SUBST(INSTALL_COMMAND) AC_SUBST(INSTALL_COMMAND)
AC_SUBST(INSTALLCLP) AC_SUBST(INSTALLCLP)
AC_SUBST(JPLCFLAGS)
AC_SUBST(JPLLIBS)
AC_SUBST(JAVALIBS) AC_SUBST(JAVALIBS)
AC_SUBST(JAVACFLAGS) AC_SUBST(JPLCFLAGS)
AC_SUBST(LAMOBJS) AC_SUBST(LAMOBJS)
AC_SUBST(MAX_WORKERS) AC_SUBST(MAX_WORKERS)
AC_SUBST(STATIC_MODE) AC_SUBST(STATIC_MODE)
AC_SUBST(ENABLE_WINCONSOLE) AC_SUBST(ENABLE_WINCONSOLE)
AC_SUBST(EXTRA_INCLUDES_FOR_WIN32) AC_SUBST(EXTRA_INCLUDES_FOR_WIN32)
AC_SUBST(CMDEXT)
AC_SUBST(ENABLE_CUDD) AC_SUBST(ENABLE_CUDD)
AC_SUBST(ENABLE_BDDLIB) AC_SUBST(ENABLE_BDDLIB)
@ -2281,6 +2274,104 @@ else
ENABLE_MINISAT="" ENABLE_MINISAT=""
fi fi
dnl zlib
if test "$ENABLE_ZLIB" = ""
then
AC_CHECK_LIB(z, zlibVersion,
ZLIBS="-lz"
ZLIB=yes,
ZLIB=no)
if test "$ZLIB" = yes; then
ZLIB_TARGETS="zlib4pl.$SO"
ZLIB_PLTARGETS='zlib.pl'
ZLIB_INSTALL=install
else
ZLIB_TARGETS=nolib
ZLIB_INSTALL=nolib
cat << EOF
##################################################################
# ERROR: Could not find library zlib (-lz). Dropped library(zlib)
# Library zlib is available from http://www.zlib.net/
# Most Unix/Linux distributions are shipped with binaries. Make
# sure to have the development library installed.
##################################################################
EOF
fi
AC_SUBST(ZLIBS)
AC_SUBST(ZLIB_TARGETS)
AC_SUBST(ZLIB_PLTARGETS)
AC_SUBST(ZLIB_INSTALL)
fi
dnl zlib
if test "$ENABLE_LIBARCHIVE" = ""
then
OLD_LIBS=$LIBS
AC_CHECK_HEADER(archive.h,
[ AC_DEFINE([HAVE_ARCHIVE_H], 1,
[Define to 1 if you have <archive.h>.])
ARCHIVEH=yes
],
ARCHIVEH=no)
if test "$ARCHIVEH" = yes; then
AC_CHECK_LIB(archive, archive_read_new,
ARCHIVE_LIBS="-larchive"
ARCHIVELIB=yes,
ARCHIVELIB=no)
fi
AC_CHECK_FUNCS(archive_read_support_compression_bzip2 \
archive_read_support_compression_compress \
archive_read_support_compression_gzip \
archive_read_support_compression_lzma \
archive_read_support_compression_none \
archive_read_support_compression_xz)
AC_CHECK_FUNCS(archive_read_support_format_ar \
archive_read_support_format_cpio \
archive_read_support_format_empty \
archive_read_support_format_iso9660 \
archive_read_support_format_mtree \
archive_read_support_format_raw \
archive_read_support_format_tar \
archive_read_support_format_zip)
if test "$ARCHIVELIB" = yes; then
ARCHIVE_TARGETS="archive4pl.$SO"
ARCHIVE_PLTARGETS=archive.pl
else
ARCHIVE_TARGETS=nolib
cat << EOF
##################################################################
# ERROR: Could not find library archive (-larchive). Dropped
# library(archive). Library archive is available from
# http://code.google.com/p/libarchive/
#
# Most Unix/Linux distributions are shipped with binaries. Make
# sure to have the development library installed. E.g.
#
# Debian/Ubuntu/Mint: aptitude install libarchive-dev
# Fedora/... yum install libarchive-devel
# MacOS (Macports): port install libarchive
##################################################################
EOF
fi
AC_SUBST(ARCHIVE_LIBS)
AC_SUBST(ARCHIVE_TARGETS)
AC_SUBST(ARCHIVE_PLTARGETS)
fi
AC_SUBST(ENABLE_LIBARCHIVE)
mkdir -p library/lammpi mkdir -p library/lammpi
mkdir -p library/matrix mkdir -p library/matrix
mkdir -p library/matlab mkdir -p library/matlab
@ -2340,6 +2431,7 @@ mkdir -p packages/semweb
mkdir -p packages/sgml mkdir -p packages/sgml
mkdir -p packages/xml mkdir -p packages/xml
mkdir -p packages/zlib mkdir -p packages/zlib
mkdir -p packages/archive
AC_CONFIG_FILES([Makefile]) AC_CONFIG_FILES([Makefile])
AC_CONFIG_FILES([GPL/Makefile]) AC_CONFIG_FILES([GPL/Makefile])
@ -2418,6 +2510,10 @@ if test "$ENABLE_ZLIB" = ""; then
AC_CONFIG_FILES([packages/zlib/Makefile]) AC_CONFIG_FILES([packages/zlib/Makefile])
fi fi
if test "$ENABLE_LIBARCHIVE" = ""; then
AC_CONFIG_FILES([packages/archive/Makefile])
fi
if test "$ENABLE_CUDD" = ""; then if test "$ENABLE_CUDD" = ""; then
AC_CONFIG_FILES([packages/bdd/Makefile]) AC_CONFIG_FILES([packages/bdd/Makefile])

View File

@ -9651,12 +9651,21 @@ applying the predicate @var{Pred} to all list elements on which
Calls @var{Pred} on all elements of @code{List} and collects a result in Calls @var{Pred} on all elements of @code{List} and collects a result in
@var{X} and @var{Y}. @var{X} and @var{Y}.
@item foldl3(:@var{Pred}, +@var{List}, ?@var{X0}, ?@var{X}, ?@var{Y0}, ?@var{Y}, ?@var{Z0}, ?@var{Z}) @item foldl2(:@var{Pred}, +@var{List}, ?@var{List1}, ?@var{X0}, ?@var{X}, ?@var{Y0}, ?@var{Y})
@findex foldl2/7
@snindex foldl2/7
@cnindex foldl2/7
Calls @var{Pred} on all elements of @code{List} and collects a result in
@var{X} and @var{Y}.
@item foldl3(:@var{Pred}, +@var{List1}, ?@var{List2}, ?@var{X0},
?@var{X}, ?@var{Y0}, ?@var{Y}, ?@var{Z0}, ?@var{Z})
@findex foldl3/6 @findex foldl3/6
@snindex foldl3/6 @snindex foldl3/6
@cnindex foldl3/6 @cnindex foldl3/6
Calls @var{Pred} on all elements of @code{List} and collects a result in Calls @var{Pred} on all elements of @code{List} and collects a
@var{X}, @var{Y} and @var{Z}. result in @var{X}, @var{Y} and @var{Z}.
@item scanl(:@var{Pred}, +@var{List}, +@var{V0}, ?@var{Values}) @item scanl(:@var{Pred}, +@var{List}, +@var{V0}, ?@var{Values})
@findex scanl/4 @findex scanl/4
@ -17725,14 +17734,28 @@ characters. The term is written according to a mask of the following
flags in the @code{flag} argument: @code{YAP_WRITE_QUOTED}, flags in the @code{flag} argument: @code{YAP_WRITE_QUOTED},
@code{YAP_WRITE_HANDLE_VARS}, @code{YAP_WRITE_USE_PORTRAY}, and @code{YAP_WRITE_IGNORE_OPS}. @code{YAP_WRITE_HANDLE_VARS}, @code{YAP_WRITE_USE_PORTRAY}, and @code{YAP_WRITE_IGNORE_OPS}.
@item @code{void} YAP_WriteBuffer(@code{YAP_Term} @var{t}, @code{char *} @item @code{int} YAP_WriteBuffer(@code{YAP_Term} @var{t}, @code{char *}
@var{buff}, @code{unsigned int} @var{buff}, @code{size_t}
@var{size}, @code{int} @var{flags}) @var{size}, @code{int} @var{flags})
@findex YAP_WriteBuffer/4 @findex YAP_WriteBuffer/4
Write a YAP_Term @var{t} to buffer @var{buff} with size @var{size}. The Write a YAP_Term @var{t} to buffer @var{buff} with size
term is written according to a mask of the following flags in the @var{size}. The term is written
@code{flag} argument: @code{YAP_WRITE_QUOTED}, according to a mask of the following flags in the @code{flag}
@code{YAP_WRITE_HANDLE_VARS}, and @code{YAP_WRITE_IGNORE_OPS}. argument: @code{YAP_WRITE_QUOTED}, @code{YAP_WRITE_HANDLE_VARS},
@code{YAP_WRITE_USE_PORTRAY}, and @code{YAP_WRITE_IGNORE_OPS}. The
function will fail if it does not have enough space in the buffer.
@item @code{char *} YAP_WriteDynamicBuffer(@code{YAP_Term} @var{t}, @code{char *}
@var{buff}, @code{size_t}
@var{size}, @code{size_t}
@var{*lengthp}, @code{size_t}
@var{*encodingp}, @code{int} @var{flags})
@findex YAP_WriteDynamicBuffer/6
Write a YAP_Term @var{t} to buffer @var{buff} with size
@var{size}. The code will allocate an extra buffer if @var{buff} is
@code{NULL} or if @code{buffer} does not have enough room. The
variable @code{lengthp} is assigned the size of the resulting buffer,
and @code{encodingp} will receive the type of encoding (currently only @code{PL_ENC_ISO_LATIN_1} and @code{PL_ENC_WCHAR} are supported)
@item @code{void} YAP_InitConsult(@code{int} @var{mode}, @code{char *} @var{filename}) @item @code{void} YAP_InitConsult(@code{int} @var{mode}, @code{char *} @var{filename})
@findex YAP_InitConsult/2 @findex YAP_InitConsult/2

View File

@ -329,7 +329,7 @@ extern X_API YAP_Term PROTO(YAP_Read,(void *));
extern X_API void PROTO(YAP_Write,(YAP_Term,void *,int)); extern X_API void PROTO(YAP_Write,(YAP_Term,void *,int));
/* void YAP_WriteBufffer(YAP_Term,char *,unsgined int,int) */ /* void YAP_WriteBufffer(YAP_Term,char *,unsgined int,int) */
extern X_API void PROTO(YAP_WriteBuffer,(YAP_Term,char *,unsigned int,int)); extern X_API int PROTO(YAP_WriteBuffer,(YAP_Term,char *,size_t,int));
/* void YAP_Term(YAP_Term) */ /* void YAP_Term(YAP_Term) */
extern X_API YAP_Term PROTO(YAP_CopyTerm,(YAP_Term)); extern X_API YAP_Term PROTO(YAP_CopyTerm,(YAP_Term));

View File

@ -255,6 +255,21 @@ typedef enum
YAPC_COMPILE_ALL /* compile all predicates */ YAPC_COMPILE_ALL /* compile all predicates */
} yapc_exec_mode; } yapc_exec_mode;
/********* encoding ***********************/
typedef enum
{ PL_ENC_UNKNOWN = 0, /* invalid/unknown */
PL_ENC_OCTET, /* raw 8 bit input */
PL_ENC_ASCII, /* US-ASCII (0..127) */
PL_ENC_ISO_LATIN_1, /* ISO Latin-1 (0..256) */
PL_ENC_ANSI, /* default (multibyte) codepage */
PL_ENC_UTF8,
PL_ENC_UNICODE_BE, /* big endian unicode file */
PL_ENC_UNICODE_LE, /* little endian unicode file */
PL_ENC_WCHAR /* pl_wchar_t */
} PL_IOENC;
/********* YAP C-Flags ***********************/ /********* YAP C-Flags ***********************/
typedef enum typedef enum

View File

@ -2868,22 +2868,6 @@ Yap_read_term(term_t t, IOSTREAM *st, term_t *excep, term_t vs)
return TRUE; return TRUE;
} }
Term
Yap_TermToString(Term t, char *s, unsigned int sz, int flags)
{
CACHE_REGS
IOSTREAM *stream = Sopen_string(NULL, s, sz, "w");
int out;
if (!stream)
return FALSE;
Yap_StartSlots( PASS_REGS1 );
out = PL_write_term(stream, Yap_InitSlot(t PASS_REGS), 1200, 0);
Yap_CloseSlots( PASS_REGS1 );
Sclose(stream);
return out;
}
extern atom_t fileNameStream(IOSTREAM *s); extern atom_t fileNameStream(IOSTREAM *s);
extern Atom Yap_FileName(IOSTREAM *s); extern Atom Yap_FileName(IOSTREAM *s);

View File

@ -140,6 +140,7 @@ A IOMode N "io_mode"
A Id N "id" A Id N "id"
A Inf N "inf" A Inf N "inf"
A InitGoal F "$init_goal" A InitGoal F "$init_goal"
A InitProlog F "$init_prolog"
A InStackExpansion N "in stack expansion" A InStackExpansion N "in stack expansion"
A Input N "input" A Input N "input"
A InstantiationError N "instantiation_error" A InstantiationError N "instantiation_error"

View File

@ -57,6 +57,7 @@ CLPBN_PROGRAMS= \
$(CLPBN_SRCDIR)/horus_lifted.yap \ $(CLPBN_SRCDIR)/horus_lifted.yap \
$(CLPBN_SRCDIR)/jt.yap \ $(CLPBN_SRCDIR)/jt.yap \
$(CLPBN_SRCDIR)/matrix_cpt_utils.yap \ $(CLPBN_SRCDIR)/matrix_cpt_utils.yap \
$(CLPBN_SRCDIR)/numbers.yap \
$(CLPBN_SRCDIR)/pgrammar.yap \ $(CLPBN_SRCDIR)/pgrammar.yap \
$(CLPBN_SRCDIR)/table.yap \ $(CLPBN_SRCDIR)/table.yap \
$(CLPBN_SRCDIR)/topsort.yap \ $(CLPBN_SRCDIR)/topsort.yap \

View File

@ -65,7 +65,8 @@
:- use_module('clpbn/bdd', :- use_module('clpbn/bdd',
[bdd/3, [bdd/3,
init_bdd_solver/4, init_bdd_solver/4,
run_bdd_solver/3 run_bdd_solver/3,
call_bdd_ground_solver/6
]). ]).
%% :- use_module('clpbn/bnt', %% :- use_module('clpbn/bnt',
@ -306,7 +307,7 @@ write_out(jt, GVars, AVars, DiffVars) :-
write_out(bdd, GVars, AVars, DiffVars) :- write_out(bdd, GVars, AVars, DiffVars) :-
bdd(GVars, AVars, DiffVars). bdd(GVars, AVars, DiffVars).
write_out(bp, _GVars, _AVars, _DiffVars) :- write_out(bp, _GVars, _AVars, _DiffVars) :-
writeln('interface not supported anymore'). writeln('interface not supported any longer').
%bp(GVars, AVars, DiffVars). %bp(GVars, AVars, DiffVars).
write_out(gibbs, GVars, AVars, DiffVars) :- write_out(gibbs, GVars, AVars, DiffVars) :-
gibbs(GVars, AVars, DiffVars). gibbs(GVars, AVars, DiffVars).
@ -318,13 +319,15 @@ write_out(fove, GVars, AVars, DiffVars) :-
% call a solver with keys, not actual variables % call a solver with keys, not actual variables
call_ground_solver(bp, GVars, GoalKeys, Keys, Factors, Evidence) :- !, call_ground_solver(bp, GVars, GoalKeys, Keys, Factors, Evidence) :- !,
call_horus_ground_solver(GVars, GoalKeys, Keys, Factors, Evidence, _Answ). call_horus_ground_solver(GVars, GoalKeys, Keys, Factors, Evidence, _Answ).
call_ground_solver(bdd, GVars, GoalKeys, Keys, Factors, Evidence) :- !,
call_bdd_ground_solver(GVars, GoalKeys, Keys, Factors, Evidence, _Answ).
call_ground_solver(Solver, GVars, _GoalKeys, Keys, Factors, Evidence) :- call_ground_solver(Solver, GVars, _GoalKeys, Keys, Factors, Evidence) :-
% traditional solver % traditional solver
b_hash_new(Hash0), b_hash_new(Hash0),
foldl(gvar_in_hash, GVars, Hash0, HashI), foldl(gvar_in_hash, GVars, Hash0, HashI),
foldl(key_to_var, Keys, AllVars, HashI, Hash1), foldl(key_to_var, Keys, AllVars, HashI, Hash1),
foldl(evidence_to_v, Evidence, _EVars, Hash1, Hash), foldl(evidence_to_v, Evidence, _EVars, Hash1, Hash),
writeln(Keys:AllVars), %writeln(Keys:AllVars),
maplist(factor_to_dist(Hash), Factors), maplist(factor_to_dist(Hash), Factors),
% evidence % evidence
retract(use_parfactors(on)), retract(use_parfactors(on)),

View File

@ -6,7 +6,8 @@
cpt_average/6, cpt_average/6,
cpt_average/7, cpt_average/7,
cpt_max/6, cpt_max/6,
cpt_min/6 cpt_min/6,
avg_factors/5
]). ]).
:- use_module(library(clpbn), [{}/1]). :- use_module(library(clpbn), [{}/1]).
@ -25,14 +26,22 @@
matrix_to_list/2, matrix_to_list/2,
matrix_set/3]). matrix_set/3]).
:- use_module(library('clpbn/dists'), :- use_module(library(clpbn/dists),
[ [
add_dist/6, add_dist/6,
get_dist_domain_size/2]). get_dist_domain_size/2]).
:- use_module(library('clpbn/matrix_cpt_utils'), :- use_module(library(clpbn/matrix_cpt_utils),
[normalise_CPT_on_lines/3]). [normalise_CPT_on_lines/3]).
:- use_module(library(pfl),
[skolem/2,
add_ground_factor/5]).
:- use_module(library(bhash)).
:- use_module(library(maplist)).
check_for_agg_vars([], []). check_for_agg_vars([], []).
check_for_agg_vars([V|Vs0], [V|Vs1]) :- check_for_agg_vars([V|Vs0], [V|Vs1]) :-
clpbn:get_atts(V, [key(K), dist(Id,Parents)]), !, clpbn:get_atts(V, [key(K), dist(Id,Parents)]), !,
@ -49,6 +58,87 @@ simplify_dist(avg(Domain), V, Key, Parents, Vs0, VsF) :- !,
clpbn:put_atts(V, [dist(Id,Ps)]). clpbn:put_atts(V, [dist(Id,Ps)]).
simplify_dist(_, _, _, _, Vs0, Vs0). simplify_dist(_, _, _, _, Vs0, Vs0).
%
avg_factors(Key, Parents, _Smoothing, NewParents, Id) :-
% we keep ev as a list
skolem(Key, Domain),
avg_table(Parents, Parents, Domain, Key, 0, 1.0, NewParents, [], _ExtraSkolems, Id).
% there are 4 cases:
% no evidence on top node
% evidence on top node compatible with values of parents
% evidence on top node *entailed* by values of parents (so there is no real connection)
% evidence incompatible with parents
query_evidence(Key, EvHash, MAT0, MAT, NewParents0, NewParents, Vs, IVs, NewVs) :-
b_hash_lookup(Key, Ev, EvHash), !,
normalise_CPT_on_lines(MAT0, MAT1, L1),
check_consistency(L1, Ev, MAT0, MAT1, L1, MAT, NewParents0, NewParents, Vs, IVs, NewVs).
query_evidence(_, _, MAT, MAT, NewParents, NewParents, _, Vs, Vs).
hash_ev(K=V, Es0, Es) :-
b_hash_insert(Es0, K, V, Es).
find_ev(Ev, Key, RemKeys, RemKeys, Ev0, EvF) :-
b_hash_lookup(Key, V, Ev), !,
EvF is Ev0+V.
find_ev(_Evs, Key, RemKeys, [Key|RemKeys], Ev, Ev).
% +Vars -> Keys without ev
% +all keys
% +domain to project to
% +ouput key
% +sum of evidence
% +softness
% +final CPT
% - New Parents
% + - list of new keys
%
avg_table(Vars, OVars, Domain, Key, TotEvidence, Softness, Vars, Vs, Vs, Id) :-
length(Domain, SDomain),
int_power(Vars, SDomain, 1, TabSize),
TabSize =< 256,
/* case gmp is not there !! */
TabSize > 0, !,
average_cpt(Vars, OVars, Domain, TotEvidence, Softness, CPT),
matrix_to_list(CPT, Mat),
add_ground_factor(bayes, Domain, [Key|OVars], Mat, Id).
avg_table(Vars, OVars, Domain, Key, TotEvidence, Softness, [V1,V2], Vs, [V1,V2|NewVs], Id) :-
length(Vars,L),
LL1 is L//2,
LL2 is L-LL1,
list_split(LL1, Vars, L1, L2),
Min = 0,
length(Domain,Max1), Max is Max1-1,
intermediate_table(LL1, sum(Min,Max), L1, V1, Key, 1.0, 0, I1, Vs, Vs1),
intermediate_table(LL2, sum(Min,Max), L2, V2, Key, 1.0, I1, _, Vs1, NewVs),
average_cpt([V1,V2], OVars, Domain, TotEvidence, Softness, CPT),
matrix_to_list(CPT, Mat),
add_ground_factor(bayes, Domain, [Key,V1,V2], Mat, Id).
intermediate_table(1,_,[V],V, _, _, I, I, Vs, Vs) :- !.
intermediate_table(2, Op, [V1,V2], V, Key, Softness, I0, If, Vs, Vs) :- !,
If is I0+1,
extra_key_factor(Op, 2, [V1,V2], V, Key, Softness, I0).
intermediate_table(N, Op, L, V, Key, Softness, I0, If, Vs, [V1,V2|NewVs]) :-
LL1 is N//2,
LL2 is N-LL1,
list_split(LL1, L, L1, L2),
I1 is I0+1,
intermediate_table(LL1, Op, L1, V1, Key, Softness, I1, I2, Vs, Vs1),
intermediate_table(LL2, Op, L2, V2, Key, Softness, I2, If, Vs1, NewVs),
extra_key_factor(Op, N, [V1,V2], V, Key, Softness, I0).
extra_key_factor(sum(Min,Max), N, [V1,V2], V, Key, Softness, I) :-
Lower is Min*N,
Upper is Max*N,
generate_list(Lower, Upper, Nbs),
sum_cpt([V1,V2], Nbs, Softness, CPT),
V = 'AVG'(I,Key),
add_ground_factor(bayes, Nbs, [V,V1,V2], CPT, Id),
assert(pfl:currently_defined(V)),
assert(pfl:f(bayes, Id, [V,V1,V2])).
cpt_average(AllVars, Key, Els0, Tab, Vs, NewVs) :- cpt_average(AllVars, Key, Els0, Tab, Vs, NewVs) :-
cpt_average(AllVars, Key, Els0, 1.0, Tab, Vs, NewVs). cpt_average(AllVars, Key, Els0, 1.0, Tab, Vs, NewVs).
@ -155,9 +245,6 @@ generate_tmp_random(max(Domain,CPT), _, [V1,V2], V, Key, I) :-
generate_tmp_random(min(Domain,CPT), _, [V1,V2], V, Key, I) :- generate_tmp_random(min(Domain,CPT), _, [V1,V2], V, Key, I) :-
generate_var('MIN'(I,Key), Domain, CPT, [V1,V2], V). generate_var('MIN'(I,Key), Domain, CPT, [V1,V2], V).
generate_var(VKey, Domain, CPT, Parents, VKey) :-
clpbn:use_parfactors(on), !,
pfl:add_ground_factor(bayes, Domain, [VKey|Parents], CPT).
generate_var(VKey, Domain, CPT, Parents, V) :- generate_var(VKey, Domain, CPT, Parents, V) :-
{ V = VKey with tab(Domain, CPT, Parents) }. { V = VKey with tab(Domain, CPT, Parents) }.
@ -282,6 +369,10 @@ fill_in_min(_,_).
get_vdist_size(V, Sz) :- get_vdist_size(V, Sz) :-
var(V), !,
clpbn:get_atts(V, [dist(Dist,_)]), clpbn:get_atts(V, [dist(Dist,_)]),
get_dist_domain_size(Dist, Sz). get_dist_domain_size(Dist, Sz).
get_vdist_size(V, Sz) :-
skolem(V, Dom),
length(Dom, Sz).

View File

@ -23,7 +23,8 @@ Va <- P*X1*Y1 + Q*X2*Y2 + ...
init_bdd_solver/4, init_bdd_solver/4,
run_bdd_solver/3, run_bdd_solver/3,
finalize_bdd_solver/1, finalize_bdd_solver/1,
check_if_bdd_done/1 check_if_bdd_done/1,
call_bdd_ground_solver/6
]). ]).
@ -63,6 +64,10 @@ Va <- P*X1*Y1 + Q*X2*Y2 + ...
:- use_module(library(matrix)). :- use_module(library(matrix)).
:- use_module(library(maplist)).
:- use_module(library(clpbn/numbers)).
:- dynamic network_counting/1. :- dynamic network_counting/1.
:- attribute order/1. :- attribute order/1.
@ -73,6 +78,39 @@ bdds(bdd).
check_if_bdd_done(_Var). check_if_bdd_done(_Var).
call_bdd_ground_solver(QueryVars, QueryKeys, AllKeys, Factors, Evidence, Output) :-
call_bdd_ground_solver_for_probabilities([QueryKeys], AllKeys, Factors, Evidence, Solutions),
clpbn_bind_vals([QueryVars], Solutions, Output).
call_bdd_ground_solver_for_probabilities(QueryKeys, AllKeys, Factors, Evidence, Solutions) :-
keys_to_numbers(AllKeys, Factors, Evidence, Hash4, Id4, FactorIds, EvidenceIds),
init_bdd(FactorIds, EvidenceIds, Hash4, Id4, BDD),
run_solver(QueryKeys, Solutions, BDD).
init_bdd(FactorIds, EvidenceIds, Hash, Id, bdd(Term, Leaves, Tops, Hash, Id)) :-
sort_keys(FactorIds, AllVars, Leaves),
rb_new(OrderVs0),
foldl2(order_key, AllVars, 0, _, OrderVs0, OrderVs),
rb_new(Vars0),
rb_new(Pars0),
rb_new(Ev0),
foldl(evtotree,EvidenceIds,Ev0,Ev),
rb_new(Fs0),
foldl(ftotree,FactorIds,Fs0,Fs),
init_tops(Leaves,Tops),
get_keys_info(AllVars, Ev, Fs, OrderVs, Vars0, _Vars, Pars0, _Pars, Leaves, Tops, Term, []).
order_key( Id, I0, I, OrderVs0, OrderVs) :-
I is I0+1,
rb_insert(OrderVs0, Id, I0, OrderVs).
evtotree(K=V,Ev0,Ev) :-
rb_insert(Ev0, K, V, Ev).
ftotree(F, Fs0, Fs) :-
F = f([K|_Parents],_,_,_),
rb_insert(Fs0, K, F, Fs).
bdd([[]],_,_) :- !. bdd([[]],_,_) :- !.
bdd([QueryVars], AllVars, AllDiffs) :- bdd([QueryVars], AllVars, AllDiffs) :-
init_bdd_solver(_, AllVars, _, BayesNet), init_bdd_solver(_, AllVars, _, BayesNet),
@ -90,6 +128,7 @@ init_bdd_solver(_, AllVars0, _, bdd(Term, Leaves, Tops)) :-
init_tops(Leaves,Tops), init_tops(Leaves,Tops),
get_vars_info(AllVars, Vars0, _Vars, Pars0, _Pars, Leaves, Tops, Term, []). get_vars_info(AllVars, Vars0, _Vars, Pars0, _Pars, Leaves, Tops, Term, []).
order_vars([], _). order_vars([], _).
order_vars([V|AllVars], I0) :- order_vars([V|AllVars], I0) :-
put_atts(V, [order(I0)]), put_atts(V, [order(I0)]),
@ -101,6 +140,19 @@ init_tops([],[]).
init_tops(_.Leaves,_.Tops) :- init_tops(_.Leaves,_.Tops) :-
init_tops(Leaves,Tops). init_tops(Leaves,Tops).
sort_keys(AllFs, AllVars, Leaves) :-
dgraph_new(Graph0),
foldl(add_node, AllFs, Graph0, Graph),
dgraph_leaves(Graph, Leaves),
dgraph_top_sort(Graph, AllVars).
add_node(f([K|Parents],_,_,_), Graph0, Graph) :-
dgraph_add_vertex(Graph0, K, Graph1),
foldl(add_edge(K), Parents, Graph1, Graph).
add_edge(K, K0, Graph0, Graph) :-
dgraph_add_edge(Graph0, K0, K, Graph).
sort_vars(AllVars0, AllVars, Leaves) :- sort_vars(AllVars0, AllVars, Leaves) :-
dgraph_new(Graph0), dgraph_new(Graph0),
build_graph(AllVars0, Graph0, Graph), build_graph(AllVars0, Graph0, Graph),
@ -121,6 +173,32 @@ add_parents(V0.Parents, V, Graph0, GraphF) :-
dgraph_add_edge(Graph0, V0, V, GraphI), dgraph_add_edge(Graph0, V0, V, GraphI),
add_parents(Parents, V, GraphI, GraphF). add_parents(Parents, V, GraphI, GraphF).
get_keys_info([], _, _, _, Vs, Vs, Ps, Ps, _, _) --> [].
get_keys_info([V|MoreVs], Evs, Fs, OrderVs, Vs, VsF, Ps, PsF, Lvs, Outs) -->
{ rb_lookup(V, F, Fs) }, !,
{ F = f([V|Parents], _, _, DistId) },
%{writeln(v:DistId:Parents)},
[DIST],
{ get_key_info(V, F, Fs, Evs, OrderVs, DistId, Parents, Vs, Vs2, Ps, Ps1, Lvs, Outs, DIST) },
get_keys_info(MoreVs, Evs, Fs, OrderVs, Vs2, VsF, Ps1, PsF, Lvs, Outs).
get_key_info(V, F, Fs, Evs, OrderVs, DistId, Parents0, Vs, Vs2, Ps, Ps1, Lvs, Outs, DIST) :-
reorder_keys(Parents0, OrderVs, Parents, Map),
check_key_p(DistId, F, Map, Parms, _ParmVars, Ps, Ps1),
writeln(v),
unbound_parms(Parms, ParmVars),
F = f(_,[Size|_],_,_),
check_key(V, Size, DIST, Vs, Vs1),
DIST = info(V, Tree, Ev, Values, Formula, ParmVars, Parms),
% get a list of form [[P00,P01], [P10,P11], [P20,P21]]
writeln(ps:Parents),
foldl(get_key_parent(Fs), Parents, PVars, Vs1, Vs2),
cross_product(Values, Ev, PVars, ParmVars, Formula0),
% (numbervars(Formula0,0,_),writeln(formula0:Ev:Formula0), fail ; true),
writeln(ev:Evs),
get_key_evidence(V, Evs, DistId, Tree, Ev, Formula0, Formula, Lvs, Outs).
%, (numbervars(Formula,0,_),writeln(formula:Formula), fail ; true)
get_vars_info([], Vs, Vs, Ps, Ps, _, _) --> []. get_vars_info([], Vs, Vs, Ps, Ps, _, _) --> [].
get_vars_info([V|MoreVs], Vs, VsF, Ps, PsF, Lvs, Outs) --> get_vars_info([V|MoreVs], Vs, VsF, Ps, PsF, Lvs, Outs) -->
{ clpbn:get_atts(V, [dist(DistId, Parents)]) }, !, { clpbn:get_atts(V, [dist(DistId, Parents)]) }, !,
@ -160,20 +238,25 @@ get_var_info(V, DistId, Parents0, Vs, Vs2, Ps, Ps1, Lvs, Outs, DIST) :-
% %
% position zero is output % position zero is output
% %
reorder_vars(Vs, OVs, Map) :- reorder_keys(Vs, Order, OVs, Map) :-
add_pos(Vs, 1, PVs), foldl(add_key_pos(Order), Vs, PVs, 1, _),
keysort(PVs, SVs), keysort(PVs, SVs),
remove_key(SVs, OVs, Map). maplist(remove_key,SVs, OVs, Map).
add_pos([], _, []). add_key_pos(Order, V, K-(I0,V), I0, I) :-
add_pos([V|Vs], I0, [K-(I0,V)|PVs]) :- rb_lookup(V, K, Order),
I is I0+1.
reorder_vars(Vs, OVs, Map) :-
foldl(add_pos, Vs, PVs, 1, _),
keysort(PVs, SVs),
maplist(remove_key, SVs, OVs, Map).
add_pos(V, K-(I0,V), I0, I) :-
get_atts(V,[order(K)]), get_atts(V,[order(K)]),
I is I0+1, I is I0+1.
add_pos(Vs, I, PVs).
remove_key([], [], []). remove_key(_-(I,V), V, I).
remove_key([_-(I,V)|SVs], [V|OVs], [I|Map]) :-
remove_key(SVs, OVs, Map).
%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%
% %
@ -499,6 +582,23 @@ to_disj2([V,V1|Vs], V0, Out) :-
to_disj2([V1|Vs], V0+V, Out). to_disj2([V1|Vs], V0+V, Out).
%
% look for parameters in the rb-tree, or add a new.
% distid is the key
%
check_key_p(DistId, _, Map, Parms, ParmVars, Ps, Ps) :-
rb_lookup(DistId-Map, theta(Parms, ParmVars), Ps), !.
check_key_p(DistId, f(_, Sizes, Parms0, _DistId), Map, Parms, ParmVars, Ps, PsF) :-
swap_parms(Parms0, Sizes, [0|Map], Parms1),
length(Parms1, L0),
get_dist_domain_size(DistId, Size),
L1 is L0 div Size,
L is L0-L1,
initial_maxes(L1, Multipliers),
copy(L, Multipliers, NextMults, NextMults, Parms1, Parms, ParmVars),
%writeln(t:Size:Parms0:Parms:ParmVars),
rb_insert(Ps, DistId-Map, theta(Parms, ParmVars), PsF).
% %
% look for parameters in the rb-tree, or add a new. % look for parameters in the rb-tree, or add a new.
% distid is the key % distid is the key
@ -580,6 +680,19 @@ get_parents(V.Parents, Values.PVars, Vs0, Vs) :-
INFO = info(V, _Parent, _Ev, Values, _, _, _), INFO = info(V, _Parent, _Ev, Values, _, _, _),
get_parents(Parents, PVars, Vs1, Vs). get_parents(Parents, PVars, Vs1, Vs).
get_key_parent(Fs, V, Values, Vs0, Vs) :-
INFO = info(V, _Parent, _Ev, Values, _, _, _),
rb_lookup(V, f(_, [Size|_], _, _), Fs),
check_key(V, Size, INFO, Vs0, Vs).
check_key(V, _, INFO, Vs, Vs) :-
rb_lookup(V, INFO, Vs), !.
check_key(V, Size, INFO, Vs0, Vs) :-
length(Values, Size),
length(Ev, Size),
INFO = info(V, _Tree, Ev, Values, _Formula, _, _),
rb_insert(Vs0, V, INFO, Vs).
% %
% construct the formula, this is the key... % construct the formula, this is the key...
% %
@ -602,7 +715,7 @@ expand([H|L1], LN) -->
expand(L1, LN). expand(L1, LN).
concatenate_all(_H, []) --> []. concatenate_all(_H, []) --> [].
concatenate_all(H, L.LN) --> concatenate_all(H, [L|LN]) -->
[[H|L]], [[H|L]],
concatenate_all(H, LN). concatenate_all(H, LN).
@ -684,6 +797,22 @@ skim_for_theta([[P|Other]], not(P), [Other], _) :- !.
skim_for_theta([[P|Other]|More], not(P)*Ps, [Other|Left], New ) :- skim_for_theta([[P|Other]|More], not(P)*Ps, [Other|Left], New ) :-
skim_for_theta(More, Ps, Left, New ). skim_for_theta(More, Ps, Left, New ).
get_key_evidence(V, Evs, _, Tree, Ev, F0, F, Leaves, Finals) :-
rb_lookup(Evs, V, Pos), !,
zero_pos(0, Pos, Ev),
insert_output(Leaves, V, Finals, Tree, Outs, SendOut),
get_outs(F0, F, SendOut, Outs).
% hidden deterministic node, can be removed.
%% get_key_evidence(V, _, DistId, _Tree, Ev, F0, [], _Leaves, _Finals) :-
%% deterministic(V, DistId),
%% !,
%% one_list(Ev),
%% eval_outs(F0).
%% no evidence !!!
get_key_evidence(V, _, _, Tree, _Values, F0, F1, Leaves, Finals) :-
insert_output(Leaves, V, Finals, Tree, Outs, SendOut),
get_outs(F0, F1, SendOut, Outs).
get_evidence(V, Tree, Ev, F0, F, Leaves, Finals) :- get_evidence(V, Tree, Ev, F0, F, Leaves, Finals) :-
clpbn:get_atts(V, [evidence(Pos)]), !, clpbn:get_atts(V, [evidence(Pos)]), !,
zero_pos(0, Pos, Ev), zero_pos(0, Pos, Ev),
@ -737,10 +866,18 @@ eval_outs((V=F).Outs) :-
V = NF, V = NF,
eval_outs(Outs). eval_outs(Outs).
run_solver(Qs, LLPs, bdd(Term, Leaves, Nodes, Hash, Id)) :-
lists_of_keys_to_ids(Qs, QIds, Hash, _, Id, _),
findall(LPs,
(member(Q, QIds),
run_bdd_solver([Q],LPs,bdd(Term,Leaves,Nodes))),
LLPs), writeln(LLPs).
run_bdd_solver([[V]], LPs, bdd(Term, _Leaves, Nodes)) :- run_bdd_solver([[V]], LPs, bdd(Term, _Leaves, Nodes)) :-
build_out_node(Nodes, Node), build_out_node(Nodes, Node),
findall(Prob, get_prob(Term, Node, V, Prob),TermProbs), findall(Prob, get_prob(Term, Node, V, Prob),TermProbs),
sumlist(TermProbs, Sum), sumlist(TermProbs, Sum),
writeln(LPs:TermProbs),
normalise(TermProbs, Sum, LPs). normalise(TermProbs, Sum, LPs).
build_out_node([_Top], []). build_out_node([_Top], []).

View File

@ -30,6 +30,9 @@
defined_in_factor/2, defined_in_factor/2,
skolem/2]). skolem/2]).
:- use_module(library(clpbn/aggregates), [
avg_factors/5]).
:- use_module(library(clpbn/dists), [ :- use_module(library(clpbn/dists), [
dist/4]). dist/4]).
@ -101,35 +104,12 @@ collect(Keys, Factors) :-
findall(K, currently_defined(K), Keys), findall(K, currently_defined(K), Keys),
findall(f(FType,FId,FKeys), f(FType,FId,FKeys), Factors). findall(f(FType,FId,FKeys), f(FType,FId,FKeys), Factors).
ground_all_keys([], _).
ground_all_keys([V|GVars], AllKeys) :-
clpbn:get_atts(V,[key(Key)]),
\+ ground(Key), !,
member(Key, AllKeys),
ground_all_keys(GVars, AllKeys).
ground_all_keys([_V|GVars], AllKeys) :-
ground_all_keys(GVars, AllKeys).
keys([], []).
keys([Var|QueryVars], [Key|QueryKeys]) :-
clpbn:get_atts(Var,[key(Key)]),
keys(QueryVars, QueryKeys).
initialize_evidence([]).
initialize_evidence([V|EVars]) :-
clpbn:get_atts(V, [key(K)]),
ground(K),
queue_in(K),
initialize_evidence(EVars).
% %
% gets key K, and collects factors that define it % gets key K, and collects factors that define it
queue_in(K) :- queue_in(K) :-
queue(K), !. queue(K), !.
queue_in(K) :- queue_in(K) :-
writeln(+K), %writeln(+K),
assert(queue(K)), assert(queue(K)),
fail. fail.
queue_in(_). queue_in(_).
@ -139,8 +119,6 @@ propagate :-
do_propagate(K). do_propagate(K).
propagate. propagate.
do_propagate(agg(_)) :- !,
propagate.
do_propagate(K) :- do_propagate(K) :-
%writeln(-K), %writeln(-K),
\+ currently_defined(K), \+ currently_defined(K),
@ -152,9 +130,7 @@ do_propagate(K) :-
true true
; ;
throw(error(no_defining_factor(K))) throw(error(no_defining_factor(K)))
) ),
,
writeln(Ks),
member(K1, Ks), member(K1, Ks),
\+ currently_defined(K1), \+ currently_defined(K1),
queue_in(K1), queue_in(K1),
@ -163,18 +139,19 @@ do_propagate(_K) :-
propagate. propagate.
add_factor(factor(Type, Id, Ks, _, _Phi, Constraints), NKs) :- add_factor(factor(Type, Id, Ks, _, _Phi, Constraints), NKs) :-
( Ks = [K,agg(Els)] %writeln(+Ks),
( Ks = [K,Els], var(Els)
-> ->
NKs=[K|Els] once(run(Constraints)),
avg_factors(K, Els, 0.0, NewKeys, NewId),
NKs = [K|NewKeys]
; ;
NKs = Ks once(run(Constraints)),
NKs = Ks,
Id = NewId
), ),
run(Constraints), !, \+ f(Type, NewId, NKs),
\+ f(Type, Id, NKs), assert(f(Type, NewId, NKs)).
assert(f(Type, Id, NKs)).
fetch_list((A,agg(B)), A, B).
run([Goal|Goals]) :- run([Goal|Goals]) :-
call(user:Goal), call(user:Goal),

View File

@ -36,6 +36,7 @@ warning :-
set_solver(ve) :- set_clpbn_flag(solver,ve). set_solver(ve) :- set_clpbn_flag(solver,ve).
set_solver(bdd) :- set_clpbn_flag(solver,bdd).
set_solver(jt) :- set_clpbn_flag(solver,jt). set_solver(jt) :- set_clpbn_flag(solver,jt).
set_solver(gibbs) :- set_clpbn_flag(solver,gibbs). set_solver(gibbs) :- set_clpbn_flag(solver,gibbs).
set_solver(fove) :- set_clpbn_flag(solver,fove), set_horus_flag(lifted_solver, fove). set_solver(fove) :- set_clpbn_flag(solver,fove), set_horus_flag(lifted_solver, fove).
@ -43,7 +44,7 @@ set_solver(lbp) :- set_clpbn_flag(solver,fove), set_horus_flag(lifted_solver,
set_solver(hve) :- set_clpbn_flag(solver,bp), set_horus_flag(ground_solver, ve). set_solver(hve) :- set_clpbn_flag(solver,bp), set_horus_flag(ground_solver, ve).
set_solver(bp) :- set_clpbn_flag(solver,bp), set_horus_flag(ground_solver, bp). set_solver(bp) :- set_clpbn_flag(solver,bp), set_horus_flag(ground_solver, bp).
set_solver(cbp) :- set_clpbn_flag(solver,bp), set_horus_flag(ground_solver, cbp). set_solver(cbp) :- set_clpbn_flag(solver,bp), set_horus_flag(ground_solver, cbp).
set_solver(S) :- throw(error('unknow solver ', S)). set_solver(S) :- throw(error('unknown solver ', S)).
set_horus_flag(K,V) :- cpp_set_horus_flag(K,V). set_horus_flag(K,V) :- cpp_set_horus_flag(K,V).

View File

@ -40,14 +40,17 @@
:- use_module(library('clpbn/aggregates'), :- use_module(library('clpbn/aggregates'),
[check_for_agg_vars/2]). [check_for_agg_vars/2]).
:- use_module(library(clpbn/numbers)).
:- use_module(library(charsio), :- use_module(library(charsio),
[term_to_atom/2]). [term_to_atom/2]).
:- use_module(library(pfl), :- use_module(library(pfl),
[skolem/2, [skolem/2
get_pfl_parameters/2
]). ]).
:- use_module(library(maplist)).
:- use_module(library(lists)). :- use_module(library(lists)).
:- use_module(library(atts)). :- use_module(library(atts)).
@ -59,119 +62,36 @@ call_horus_ground_solver(QueryVars, QueryKeys, AllKeys, Factors, Evidence, Outpu
call_horus_ground_solver_for_probabilities([QueryKeys], AllKeys, Factors, Evidence, Solutions), call_horus_ground_solver_for_probabilities([QueryKeys], AllKeys, Factors, Evidence, Solutions),
clpbn_bind_vals([QueryVars], Solutions, Output). clpbn_bind_vals([QueryVars], Solutions, Output).
call_horus_ground_solver_for_probabilities(QueryKeys, _AllKeys, Factors, Evidence, Solutions) :- call_horus_ground_solver_for_probabilities(QueryKeys, AllKeys, Factors, Evidence, Solutions) :-
attributes:all_attvars(AVars),
keys(AVars, AllKeys),
b_hash_new(Hash0),
keys_to_ids(AllKeys, 0, Id1, Hash0, Hash1),
get_factors_type(Factors, Type), get_factors_type(Factors, Type),
evidence_to_ids(Evidence, Hash1, Hash2, Id1, Id2, EvidenceIds), keys_to_numbers(AllKeys, Factors, Evidence, Hash4, Id4, FactorIds, EvidenceIds),
%writeln(evidence:Evidence:EvidenceIds),
factors_to_ids(Factors, Hash2, Hash3, Id2, Id3, FactorIds),
%writeln(queryKeys:QueryKeys), writeln(''),
%% writeln(type:Type), writeln(''),
%% writeln(allKeys:AllKeys), writeln(''),
sort(AllKeys,SKeys), %% writeln(allSortedKeys:SKeys), writeln(''),
keys_to_ids(SKeys, Id3, Id4, Hash3, Hash4),
%b_hash:b_hash_to_list(Hash1,_L4), writeln(h1:_L4),
%writeln(factors:Factors), writeln(''),
%writeln(factorIds:FactorIds), writeln(''),
%writeln(evidence:Evidence), writeln(''), %writeln(evidence:Evidence), writeln(''),
%writeln(evidenceIds:EvidenceIds), writeln(''), %writeln(evidenceIds:EvidenceIds), writeln(''),
%writeln(factorIds:FactorIds), writeln(''),
cpp_create_ground_network(Type, FactorIds, EvidenceIds, Network), cpp_create_ground_network(Type, FactorIds, EvidenceIds, Network),
get_vars_information(AllKeys, StatesNames), maplist(get_var_information, AllKeys, StatesNames),
terms_to_atoms(AllKeys, KeysAtoms), maplist(term_to_atom, AllKeys, KeysAtoms),
%writeln(s1:KeysAtoms:KeysAtoms:StatesNames),
cpp_set_vars_information(KeysAtoms, StatesNames), cpp_set_vars_information(KeysAtoms, StatesNames),
%writeln(network:(Type, FactorIds, EvidenceIds, Network)), writeln(''), %writeln(network:(Type, FactorIds, EvidenceIds, Network)), writeln(''),
run_solver(ground(Network,Hash4,Id4), QueryKeys, Solutions), run_solver(ground(Network,Hash4,Id4), QueryKeys, Solutions),
cpp_free_ground_network(Network). cpp_free_ground_network(Network).
keys([], []).
keys([V|AVars], [K|AllKeys]) :-
clpbn:get_atts(V,[key(K)]), !,
keys(AVars, AllKeys).
keys([_V|AVars], AllKeys) :-
keys(AVars, AllKeys).
run_solver(ground(Network,Hash,Id), QueryKeys, Solutions) :- run_solver(ground(Network,Hash,Id), QueryKeys, Solutions) :-
%get_dists_parameters(DistIds, DistsParams), %get_dists_parameters(DistIds, DistsParams),
%cpp_set_factors_params(Network, DistsParams), %cpp_set_factors_params(Network, DistsParams),
list_of_keys_to_ids(QueryKeys, Hash, _, Id, _, QueryIds), lists_of_keys_to_ids(QueryKeys, QueryIds, Hash, _, Id, _),
%writeln(queryKeys:QueryKeys), writeln(''), %writeln(queryKeys:QueryKeys), writeln(''),
% writeln(queryIds:QueryIds), writeln(''), % writeln(queryIds:QueryIds), writeln(''),
cpp_run_ground_solver(Network, QueryIds, Solutions). cpp_run_ground_solver(Network, QueryIds, Solutions).
keys_to_ids([], Id, Id, Hash, Hash).
keys_to_ids([Key|AllKeys], I0, I, Hash0, Hash) :-
b_hash_lookup(Key, _, Hash0), !,
keys_to_ids(AllKeys, I0, I, Hash0, Hash).
keys_to_ids([Key|AllKeys], I0, I, Hash0, Hash) :-
b_hash_insert(Hash0, Key, I0, HashI),
I1 is I0+1,
keys_to_ids(AllKeys, I1, I, HashI, Hash).
get_factors_type([f(bayes, _, _)|_], bayes) :- ! . get_factors_type([f(bayes, _, _)|_], bayes) :- ! .
get_factors_type([f(markov, _, _)|_], markov) :- ! . get_factors_type([f(markov, _, _)|_], markov) :- ! .
list_of_keys_to_ids([], H, H, I, I, []). get_var_information(Key, Domain) :-
list_of_keys_to_ids([List|Extra], Hash0, Hash, I0, I, [IdList|More]) :- skolem(Key, Domain).
List = [_|_], !,
list_of_keys_to_ids(List, Hash0, Hash1, I0, I1, IdList),
list_of_keys_to_ids(Extra, Hash1, Hash, I1, I, More).
list_of_keys_to_ids([Key|QueryKeys], Hash0, Hash, I0, I, [Id|QueryIds]) :-
b_hash_lookup(Key, Id, Hash0), !,
list_of_keys_to_ids(QueryKeys, Hash0, Hash, I0, I, QueryIds).
list_of_keys_to_ids([Key|QueryKeys], Hash0, Hash, I0, I, [I0|QueryIds]) :-
b_hash_insert(Hash0, Key, I0, Hash1),
I1 is I0+1,
list_of_keys_to_ids(QueryKeys, Hash1, Hash, I1, I, QueryIds).
factors_to_ids([], H, H, I, I, []).
factors_to_ids([f(_, DistId, Keys)|Fs], Hash0, Hash, I0, I, [f(Ids, Ranges, CPT, DistId)|NFs]) :-
list_of_keys_to_ids(Keys, Hash0, Hash1, I0, I1, Ids),
pfl:get_pfl_parameters(DistId, CPT),
get_ranges(Keys, Ranges),
factors_to_ids(Fs, Hash1, Hash, I1, I, NFs).
get_ranges([],[]).
get_ranges(K.Ks, Range.Rs) :- !,
skolem(K,Domain),
length(Domain,Range),
get_ranges(Ks, Rs).
evidence_to_ids([], H, H, I, I, []).
evidence_to_ids([Key=Ev|QueryKeys], Hash0, Hash, I0, I, [Id=Ev|QueryIds]) :-
b_hash_lookup(Key, Id, Hash0), !,
evidence_to_ids(QueryKeys, Hash0, Hash, I0, I, QueryIds).
evidence_to_ids([Key=Ev|QueryKeys], Hash0, Hash, I0, I, [I0=Ev|QueryIds]) :-
b_hash_insert(Hash0, Key, I0, Hash1),
I1 is I0+1,
evidence_to_ids(QueryKeys, Hash1, Hash, I1, I, QueryIds).
get_vars_information([], []).
get_vars_information(Key.QueryKeys, Domain.StatesNames) :-
pfl:skolem(Key, Domain),
get_vars_information(QueryKeys, StatesNames).
terms_to_atoms([], []).
terms_to_atoms(K.Ks, Atom.As) :-
term_to_atom(K,Atom),
terms_to_atoms(Ks,As).
finalize_horus_ground_solver(bp(Network, _)) :- finalize_horus_ground_solver(bp(Network, _)) :-

View File

@ -0,0 +1,60 @@
:- module(clpbn_numbers,
[
keys_to_numbers/7,
keys_to_numbers/9,
lists_of_keys_to_ids/6
]).
:- use_module(library(bhash)).
:- use_module(library(maplist)).
:- use_module(library(pfl),
[skolem/2,
get_pfl_cpt/5
]).
%
% convert key representation into numeric representation
% (+keys, +all factors, +all evidence, -ConvTable, -NextId, -FactorsWithIds, -EvidenceWithIds)
%
keys_to_numbers(AllKeys, Factors, Evidence, Hash, Id4, FactorIds, EvidenceIds) :-
b_hash_new(Hash0),
keys_to_numbers(AllKeys, Factors, Evidence, Hash0, Hash, 0, Id4, FactorIds, EvidenceIds).
keys_to_numbers(AllKeys, Factors, Evidence, Hash0, Hash4, Id0, Id4, FactorIds, EvidenceIds) :-
foldl2(key_to_id, AllKeys, _Ids, Hash0, Hash1, Id0, Id1),
foldl2(evidence_to_id, Evidence, EvidenceIds, Hash1, Hash2, Id1, Id2),
foldl2(factor_to_id(Evidence), Factors, FactorIds, Hash2, Hash3, Id2, Id3),
sort(AllKeys,SKeys), %% writeln(allSortedKeys:SKeys), writeln(''),
foldl2(key_to_id, SKeys, _, Hash3, Hash4, Id3, Id4).
lists_of_keys_to_ids(QueryKeys, QueryIds, Hash0, Hash, Id0, Id) :-
foldl2(list_of_keys_to_ids, QueryKeys, QueryIds, Hash0, Hash, Id0, Id).
list_of_keys_to_ids(List, IdList, Hash0, Hash, I0, I) :-
foldl2(key_to_id, List, IdList, Hash0, Hash, I0, I).
key_to_id(Key, Id, Hash0, Hash0, I0, I0) :-
b_hash_lookup(Key, Id, Hash0), !.
key_to_id(Key, I0, Hash0, Hash, I0, I) :-
b_hash_insert(Hash0, Key, I0, Hash),
I is I0+1.
factor_to_id(Ev, f(_, DistId, Keys), f(Ids, Ranges, CPT, DistId), Hash0, Hash, I0, I) :-
get_pfl_cpt(DistId, Keys, Ev, NKeys, CPT),
foldl2(key_to_id, NKeys, Ids, Hash0, Hash, I0, I),
maplist(get_range, Keys, Ranges).
get_range(K, Range) :-
skolem(K,Domain),
length(Domain,Range).
evidence_to_id(Key=Ev, Id=Ev, Hash0, Hash0, I0, I0) :-
b_hash_lookup(Key, Id, Hash0), !.
evidence_to_id(Key=Ev, I0=Ev, Hash0, Hash, I0, I) :-
b_hash_insert(Hash0, Key, I0, Hash),
I is I0+1.

View File

@ -96,9 +96,8 @@ ve(LLVs,Vs0,AllDiffs) :-
% Vmap is the map V->I % Vmap is the map V->I
% %
init_ve_solver(Qs, Vs0, _, state(IQs, LVIs, VMap, Bigraph, Ev)) :- init_ve_solver(Qs, Vs0, _, state(IQs, LVIs, VMap, Bigraph, Ev)) :-
check_for_agg_vars(Vs0, Vs1),
% LVi will have a list of CLPBN variables % LVi will have a list of CLPBN variables
init_influences(Vs1, Graph, TGraph), init_influences(Vs0, Graph, TGraph),
maplist(init_ve_solver_for_question(Graph, TGraph), Qs, LVs), maplist(init_ve_solver_for_question(Graph, TGraph), Qs, LVs),
init_vmap(VMap0), init_vmap(VMap0),
lvars_to_numbers(LVs, LVIs, VMap0, VMap1), lvars_to_numbers(LVs, LVIs, VMap0, VMap1),
@ -301,7 +300,7 @@ replace_factor(_F,_NF,OF, OF).
eliminate(QVs, digraph(Vs0, I, Fs0), Dist) :- eliminate(QVs, digraph(Vs0, I, Fs0), Dist) :-
find_best(Vs0, QVs, BestV, VFs), !, find_best(Vs0, QVs, BestV, VFs), !,
%writeln(best:BestV:QVs), %writeln(best:BestV:VFs),
% delete all factors that touched the variable % delete all factors that touched the variable
foldl2(del_fac, VFs, Fs0, Fs1, Vs0, Vs1), foldl2(del_fac, VFs, Fs0, Fs1, Vs0, Vs1),
% delete current variable % delete current variable
@ -325,11 +324,16 @@ best_var(QVs, I, _Node, Info, Info) :-
!. !.
% pick the variable with less factors % pick the variable with less factors
best_var(_Qs, I, Node, i(ValSoFar,_,_), i(NewVal,I,Node)) :- best_var(_Qs, I, Node, i(ValSoFar,_,_), i(NewVal,I,Node)) :-
length(Node, NewVal), foldl(szfac,Node,1,NewVal),
%length(Node, NewVal),
NewVal < ValSoFar, NewVal < ValSoFar,
!. !.
best_var(_, _I, _Node, Info, Info). best_var(_, _I, _Node, Info, Info).
szfac(f(_,Vs,_), I0, I) :-
length(Vs,L),
I is I0*L.
% delete one factor, need to also touch all variables % delete one factor, need to also touch all variables
del_fac(f(I,FVs,_), Fs0, Fs, Vs0, Vs) :- del_fac(f(I,FVs,_), Fs0, Fs, Vs0, Vs) :-
rb_delete(Fs0, I, Fs), rb_delete(Fs0, I, Fs),

View File

@ -15,9 +15,7 @@ schema.yap: the PFL schema
tables: CPTs tables: CPTs
=============================================================================
professor_ability(p0,X). professor_ability(p0,X).

View File

@ -29,9 +29,9 @@ bayes grade(C,S)::[a,b,c,d], int(S), diff(C) ; grade_table ; [registration(_,C,S
bayes satisfaction(C,S)::[h,m,l], abi(P), grade(C,S) ; sat_table ; [reg_satisfaction(C,S,P)]. bayes satisfaction(C,S)::[h,m,l], abi(P), grade(C,S) ; sat_table ; [reg_satisfaction(C,S,P)].
bayes rat(C) :: [h,m,l], agg(Sats) ; avg ; [course_rat(C, Sats)]. bayes rat(C) :: [h,m,l], Sats ; avg ; [course_rat(C, Sats)].
bayes rank(S) :: [a,b,c,d], agg(Grades) ; avg ; [student_ranking(S,Grades)]. bayes rank(S) :: [a,b,c,d], Grades ; avg ; [student_ranking(S,Grades)].
grade(Key, Grade) :- grade(Key, Grade) :-
@ -44,8 +44,8 @@ reg_satisfaction(CKey, SKey, PKey) :-
course_rat(CKey, Sats) :- course_rat(CKey, Sats) :-
course(CKey, _), course(CKey, _),
setof(satisfaction(CKey,SKey,PKey), setof(satisfaction(CKey,SKey),
reg_satisfaction(CKey, SKey, PKey), PKey^reg_satisfaction(CKey, SKey, PKey),
Sats). Sats).
student_ranking(SKey, Grades) :- student_ranking(SKey, Grades) :-

View File

@ -21,6 +21,8 @@ total_students(256).
%:- clpbn_horus:set_solver(fove). %:- clpbn_horus:set_solver(fove).
%:- clpbn_horus:set_solver(hve). %:- clpbn_horus:set_solver(hve).
:- clpbn_horus:set_solver(bp). :- clpbn_horus:set_solver(bp).
:- clpbn_horus:set_solver(bdd).
%:- clpbn_horus:set_solver(ve).
%:- clpbn_horus:set_solver(cbp). %:- clpbn_horus:set_solver(cbp).
:- ensure_loaded(school32_data). :- ensure_loaded(school32_data).

View File

@ -4,25 +4,20 @@
% %
:- module(pfl, [ :- module(pfl, [
op(550,yfx,@),
op(550,yfx,::),
op(1150,fx,bayes),
op(1150,fx,markov),
factor/6, factor/6,
skolem/2, skolem/2,
defined_in_factor/2, defined_in_factor/2,
get_pfl_cpt/5, % given id and keys, return new keys and cpt
get_pfl_parameters/2, % given id return par factor parameter get_pfl_parameters/2, % given id return par factor parameter
new_pfl_parameters/2, % given id set new parameters new_pfl_parameters/2, % given id set new parameters
get_first_pvariable/2, % given id get firt pvar (useful in bayesian) get_first_pvariable/2, % given id get firt pvar (useful in bayesian)
get_factor_pvariable/2, % given id get any pvar get_factor_pvariable/2, % given id get any pvar
add_ground_factor/4, %add a new bayesian variable (for now) add_ground_factor/5 %add a new bayesian variable (for now)
op(550,yfx,@), ]).
op(550,yfx,::),
op(1150,fx,bayes),
op(1150,fx,markov)]).
:- use_module(library(lists),
[nth0/3,
append/3,
member/2]).
:- dynamic factor/6, skolem_in/2, skolem/2, preprocess/3, evidence/2, id/1.
:- reexport(library(clpbn), :- reexport(library(clpbn),
[clpbn_flag/2 as pfl_flag, [clpbn_flag/2 as pfl_flag,
@ -31,6 +26,10 @@
:- reexport(library(clpbn/horus), :- reexport(library(clpbn/horus),
[set_solver/1]). [set_solver/1]).
:- reexport(library(clpbn/aggregates),
[avg_factors/5]).
:- ( % if clp(bn) has done loading, we're top-level :- ( % if clp(bn) has done loading, we're top-level
predicate_property(set_pfl_flag(_,_), imported_from(clpbn)) predicate_property(set_pfl_flag(_,_), imported_from(clpbn))
-> ->
@ -42,6 +41,14 @@
true true
). ).
:- use_module(library(lists),
[nth0/3,
append/3,
member/2]).
:- dynamic factor/6, skolem_in/2, skolem/2, preprocess/3, evidence/2, id/1.
user:term_expansion( bayes((Formula ; Phi ; Constraints)), pfl:factor(bayes,Id,FList,FV,Phi,Constraints)) :- user:term_expansion( bayes((Formula ; Phi ; Constraints)), pfl:factor(bayes,Id,FList,FV,Phi,Constraints)) :-
!, !,
term_variables(Formula, FreeVars), term_variables(Formula, FreeVars),
@ -70,11 +77,12 @@ Id@N :-
fail. fail.
_Id@_N. _Id@_N.
add_ground_factor(bayes, Domain, Vars, CPT) :- add_ground_factor(bayes, Domain, Vars, CPT, Id) :-
Vars = [K|_], Vars = [K|_],
( skolem(K,_Domain) -> true ; assert(skolem(K, Domain)) ), ( skolem(K,_Domain) -> true ; assert(skolem(K, Domain)) ),
new_id(Id), new_id(Id),
assert(factor(bayes, Id, Vars, [], CPT, true)). asserta(skolem_in(K, Id)),
assert(factor(bayes, Id, Vars, [], CPT, [])).
defined_in_factor(Key, Factor) :- defined_in_factor(Key, Factor) :-
skolem_in(Key, Id), skolem_in(Key, Id),
@ -104,6 +112,10 @@ new_id(Id) :-
process_args(V, _Id, _I0, _I ) --> { var(V) }, !, process_args(V, _Id, _I0, _I ) --> { var(V) }, !,
{ throw(error(instantiation_error,pfl:process_args)) }. { throw(error(instantiation_error,pfl:process_args)) }.
process_args((Arg1,V), Id, I0, I ) --> { var(V) }, !,
{ I is I0+1 },
process_arg(Arg1, Id, I),
[V].
process_args((Arg1,Arg2), Id, I0, I ) --> !, process_args((Arg1,Arg2), Id, I0, I ) --> !,
process_args(Arg1, Id, I0, I1), process_args(Arg1, Id, I0, I1),
process_args(Arg2, Id, I1, I). process_args(Arg2, Id, I1, I).
@ -161,10 +173,17 @@ add_evidence(Sk,Var) :-
clpbn:put_atts(_V,[key(Sk),evidence(E)]). clpbn:put_atts(_V,[key(Sk),evidence(E)]).
%% get_pfl_cpt(Id, Keys, Ev, NewKeys, Out) :-
%% factor(_Type,Id,[Key|_],_FV,avg,_Constraints), !,
%% Keys = [Key|Parents],
%% writeln(Key:Parents),
%% avg_factors(Key, Parents, 0.0, Ev, NewKeys, Out).
get_pfl_cpt(Id, Keys, _, Keys, Out) :-
get_pfl_parameters(Id,Out).
get_pfl_parameters(Id,Out) :- get_pfl_parameters(Id,Out) :-
factor(_Type,Id,_FList,_FV,Phi,_Constraints), factor(_Type,Id,_FList,_FV,Phi,_Constraints),
%writeln(factor(_Type,Id,_FList,_FV,_Phi,_Constraints)), ( Phi = [_|_] -> Phi = Out ; call(user:Phi, Out) ).
( is_list(Phi) -> Out = Phi ; call(user:Phi, Out) ).
new_pfl_parameters(Id, NewPhi) :- new_pfl_parameters(Id, NewPhi) :-

View File

@ -51,6 +51,8 @@ CFLAGS=$(COFLAGS) $(CWFLAGS) $(CMFLAGS) $(CIFLAGS) $(PKGCFLAGS) @DEFS@
LDSOFLAGS=@LDFLAGS@ @EXTRA_LIBS_FOR_SWIDLLS@ LDSOFLAGS=@LDFLAGS@ @EXTRA_LIBS_FOR_SWIDLLS@
LDFLAGS=$(PKGLDFLAGS) LDFLAGS=$(PKGLDFLAGS)
LIBPLEMBED=
MKINDEX=(cd $(srcdir) ; $(PL) -f none -g make -t halt) MKINDEX=(cd $(srcdir) ; $(PL) -f none -g make -t halt)
.txt.tex: .txt.tex:

@ -1 +1 @@
Subproject commit 2d0bbe41cd30c569856ea27c0934ad8a96ce2352 Subproject commit 270146c1f4117ebb58d20c2f06e58d7d23cbc9ca

@ -1 +1 @@
Subproject commit d3b6113d9ff5a90683415d2e888b5f71e4b453f1 Subproject commit 8b75ad1bed7cbdbb51516fd2b00209357d91c8c7

@ -1 +1 @@
Subproject commit 0acc051973932430e71e4f57c8c92c7d6cd114a8 Subproject commit 758eb8d7960684fe18e01cdff41013cce097f197

View File

@ -25,6 +25,9 @@ true :- true.
'$init_system', '$init_system',
'$do_live'. '$do_live'.
'$init_prolog' :-
'$init_system'.
'$do_live' :- '$do_live' :-
repeat, repeat,
'$current_module'(Module), '$current_module'(Module),
@ -35,7 +38,11 @@ true :- true.
), ),
'$system_catch'('$enter_top_level',Module,Error,user:'$Error'(Error)). '$system_catch'('$enter_top_level',Module,Error,user:'$Error'(Error)).
'$init_system' :- '$init_system' :-
'$nb_getval'('$yap_inited', on, fail), !.
'$init_system' :-
nb_setval('$yap_inited', on),
% do catch as early as possible % do catch as early as possible
( (
'$access_yap_flags'(15, 0), '$access_yap_flags'(15, 0),
@ -165,18 +172,23 @@ true :- true.
-> fail -> fail
; throw(E) ; throw(E)
))), ))),
( current_predicate(_, user:rl_add_history(_)) (
-> format(atom(CompleteLine), '~W~W', current_predicate(_, user:rl_add_history(_))
->
format(atom(CompleteLine), '~W~W',
[ Line, [partial(true)], [ Line, [partial(true)],
'.', [partial(true)] '.', [partial(true)]
]), ]),
call(user:rl_add_history(CompleteLine)) call(user:rl_add_history(CompleteLine))
; true ;
true
), ),
'$system_catch'(atom_to_term(Line, Goal, Bindings), prolog, E, '$system_catch'(
atom_to_term(Line, Goal, Bindings), prolog, E,
( print_message(error, E), ( print_message(error, E),
fail fail
)), !. )
), !.
% reset alarms when entering top-level. % reset alarms when entering top-level.