Merge branch 'master' of github.com:tacgomes/yap6.3

This commit is contained in:
Tiago Gomes 2013-01-09 11:12:41 +00:00
commit 91e8bcd4d7
122 changed files with 5089 additions and 4518 deletions

View File

@ -108,7 +108,7 @@ typedef struct regstore_t
yamop *CP_; /* 28 continuation program counter */ yamop *CP_; /* 28 continuation program counter */
CELL *ENV_; /* 1 current environment */ CELL *ENV_; /* 1 current environment */
#ifdef CUT_C #ifdef CUT_C
cut_c_str_ptr CUT_C_TOP; struct cut_c_str *CUT_C_TOP;
#endif #endif
#if defined CUT_C && (defined MYDDAS_ODBC || defined MYDDAS_MYSQL) #if defined CUT_C && (defined MYDDAS_ODBC || defined MYDDAS_MYSQL)
MYDDAS_GLOBAL MYDDAS_GLOBAL_POINTER; MYDDAS_GLOBAL MYDDAS_GLOBAL_POINTER;

View File

@ -50,7 +50,7 @@ DOCSDIR=$(SHAREDIR)/doc/Yap
# #
# check also optimisation options in INSTALL file. # check also optimisation options in INSTALL file.
# #
YAP_EXTRAS=-DCUT_C=1 @YAP_EXTRAS@ YAP_EXTRAS=@YAP_EXTRAS@
YAPSTARTUP=startup.yss YAPSTARTUP=startup.yss

238
configure vendored
View File

@ -1,9 +1,11 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69. # Generated by GNU Autoconf 2.68.
# #
# #
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
# Foundation, Inc.
# #
# #
# This configure script is free software; the Free Software Foundation # This configure script is free software; the Free Software Foundation
@ -132,31 +134,6 @@ export LANGUAGE
# CDPATH. # CDPATH.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# Use a proper internal environment variable to ensure we don't fall
# into an infinite loop, continuously re-executing ourselves.
if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
_as_can_reexec=no; export _as_can_reexec;
# We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
# works around shells that cannot unset nonexistent variables.
# Preserve -v and -x to the replacement shell.
BASH_ENV=/dev/null
ENV=/dev/null
(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
case $- in # ((((
*v*x* | *x*v* ) as_opts=-vx ;;
*v* ) as_opts=-v ;;
*x* ) as_opts=-x ;;
* ) as_opts= ;;
esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
as_fn_exit 255
fi
# We don't want this to propagate to other subprocesses.
{ _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then if test "x$CONFIG_SHELL" = x; then
as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
emulate sh emulate sh
@ -190,8 +167,7 @@ if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
else else
exitcode=1; echo positional parameters were not saved. exitcode=1; echo positional parameters were not saved.
fi fi
test x\$exitcode = x0 || exit 1 test x\$exitcode = x0 || exit 1"
test -x / || exit 1"
as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
@ -236,25 +212,21 @@ IFS=$as_save_IFS
if test "x$CONFIG_SHELL" != x; then : if test "x$CONFIG_SHELL" != x; then :
export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a
# We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also
# neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables.
# works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell.
# Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null
BASH_ENV=/dev/null ENV=/dev/null
ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL
case $- in # (((( case $- in # ((((
*v*x* | *x*v* ) as_opts=-vx ;; *v*x* | *x*v* ) as_opts=-vx ;;
*v* ) as_opts=-v ;; *v* ) as_opts=-v ;;
*x* ) as_opts=-x ;; *x* ) as_opts=-x ;;
* ) as_opts= ;; * ) as_opts= ;;
esac esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
fi fi
if test x$as_have_required = xno; then : if test x$as_have_required = xno; then :
@ -356,14 +328,6 @@ $as_echo X"$as_dir" |
} # as_fn_mkdir_p } # as_fn_mkdir_p
# as_fn_executable_p FILE
# -----------------------
# Test if FILE is an executable regular file.
as_fn_executable_p ()
{
test -f "$1" && test -x "$1"
} # as_fn_executable_p
# as_fn_append VAR VALUE # as_fn_append VAR VALUE
# ---------------------- # ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take # Append the text in VALUE to the end of the definition contained in VAR. Take
@ -485,10 +449,6 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
chmod +x "$as_me.lineno" || chmod +x "$as_me.lineno" ||
{ $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
# If we had to re-execute with $CONFIG_SHELL, we're ensured to have
# already done that, so ensure we don't try to do so again and fall
# in an infinite loop. This has already happened in practice.
_as_can_reexec=no; export _as_can_reexec
# Don't try to exec as it changes $[0], causing all sort of problems # Don't try to exec as it changes $[0], causing all sort of problems
# (the dirname of $[0] is not the place where we might find the # (the dirname of $[0] is not the place where we might find the
# original and so on. Autoconf is especially sensitive to this). # original and so on. Autoconf is especially sensitive to this).
@ -523,16 +483,16 @@ if (echo >conf$$.file) 2>/dev/null; then
# ... but there are two gotchas: # ... but there are two gotchas:
# 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
# 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
# In both cases, we have to default to `cp -pR'. # In both cases, we have to default to `cp -p'.
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
as_ln_s='cp -pR' as_ln_s='cp -p'
elif ln conf$$.file conf$$ 2>/dev/null; then elif ln conf$$.file conf$$ 2>/dev/null; then
as_ln_s=ln as_ln_s=ln
else else
as_ln_s='cp -pR' as_ln_s='cp -p'
fi fi
else else
as_ln_s='cp -pR' as_ln_s='cp -p'
fi fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null rmdir conf$$.dir 2>/dev/null
@ -544,8 +504,28 @@ else
as_mkdir_p=false as_mkdir_p=false
fi fi
as_test_x='test -x' if test -x / >/dev/null 2>&1; then
as_executable_p=as_fn_executable_p as_test_x='test -x'
else
if ls -dL / >/dev/null 2>&1; then
as_ls_L_option=L
else
as_ls_L_option=
fi
as_test_x='
eval sh -c '\''
if test -d "$1"; then
test -d "$1/.";
else
case $1 in #(
-*)set "./$1";;
esac;
case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
???[sx]*):;;*)false;;esac;fi
'\'' sh
'
fi
as_executable_p=$as_test_x
# Sed expression to map a string onto a valid CPP name. # Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@ -1335,6 +1315,8 @@ target=$target_alias
if test "x$host_alias" != x; then if test "x$host_alias" != x; then
if test "x$build_alias" = x; then if test "x$build_alias" = x; then
cross_compiling=maybe cross_compiling=maybe
$as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
If a cross compiler is detected then cross compile mode will be used" >&2
elif test "x$build_alias" != "x$host_alias"; then elif test "x$build_alias" != "x$host_alias"; then
cross_compiling=yes cross_compiling=yes
fi fi
@ -1625,9 +1607,9 @@ test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
configure configure
generated by GNU Autoconf 2.69 generated by GNU Autoconf 2.68
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2010 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it. gives unlimited permission to copy, distribute and modify it.
_ACEOF _ACEOF
@ -1938,7 +1920,7 @@ $as_echo "$ac_try_echo"; } >&5
test ! -s conftest.err test ! -s conftest.err
} && test -s conftest$ac_exeext && { } && test -s conftest$ac_exeext && {
test "$cross_compiling" = yes || test "$cross_compiling" = yes ||
test -x conftest$ac_exeext $as_test_x conftest$ac_exeext
}; then : }; then :
ac_retval=0 ac_retval=0
else else
@ -2041,8 +2023,7 @@ int
main () main ()
{ {
static int test_array [1 - 2 * !(($2) >= 0)]; static int test_array [1 - 2 * !(($2) >= 0)];
test_array [0] = 0; test_array [0] = 0
return test_array [0];
; ;
return 0; return 0;
@ -2058,8 +2039,7 @@ int
main () main ()
{ {
static int test_array [1 - 2 * !(($2) <= $ac_mid)]; static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0; test_array [0] = 0
return test_array [0];
; ;
return 0; return 0;
@ -2085,8 +2065,7 @@ int
main () main ()
{ {
static int test_array [1 - 2 * !(($2) < 0)]; static int test_array [1 - 2 * !(($2) < 0)];
test_array [0] = 0; test_array [0] = 0
return test_array [0];
; ;
return 0; return 0;
@ -2102,8 +2081,7 @@ int
main () main ()
{ {
static int test_array [1 - 2 * !(($2) >= $ac_mid)]; static int test_array [1 - 2 * !(($2) >= $ac_mid)];
test_array [0] = 0; test_array [0] = 0
return test_array [0];
; ;
return 0; return 0;
@ -2137,8 +2115,7 @@ int
main () main ()
{ {
static int test_array [1 - 2 * !(($2) <= $ac_mid)]; static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0; test_array [0] = 0
return test_array [0];
; ;
return 0; return 0;
@ -2322,7 +2299,7 @@ This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by $as_me, which was It was created by $as_me, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.68. Invocation command line was
$ $0 $@ $ $0 $@
@ -2698,7 +2675,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_CC="${ac_tool_prefix}gcc" ac_cv_prog_CC="${ac_tool_prefix}gcc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -2738,7 +2715,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_ac_ct_CC="gcc" ac_cv_prog_ac_ct_CC="gcc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -2791,7 +2768,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_CC="${ac_tool_prefix}cc" ac_cv_prog_CC="${ac_tool_prefix}cc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -2832,7 +2809,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
ac_prog_rejected=yes ac_prog_rejected=yes
continue continue
@ -2890,7 +2867,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_CC="$ac_tool_prefix$ac_prog" ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -2934,7 +2911,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_ac_ct_CC="$ac_prog" ac_cv_prog_ac_ct_CC="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -3380,7 +3357,8 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */ /* end confdefs.h. */
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
struct stat; #include <sys/types.h>
#include <sys/stat.h>
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
struct buf { int x; }; struct buf { int x; };
FILE * (*rcsopen) (struct buf *, struct stat *, int); FILE * (*rcsopen) (struct buf *, struct stat *, int);
@ -3493,7 +3471,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -3537,7 +3515,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_ac_ct_CXX="$ac_prog" ac_cv_prog_ac_ct_CXX="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -3740,7 +3718,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_AWK="$ac_prog" ac_cv_prog_AWK="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -4090,7 +4068,7 @@ do
for ac_prog in grep ggrep; do for ac_prog in grep ggrep; do
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
as_fn_executable_p "$ac_path_GREP" || continue { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
# Check for GNU ac_path_GREP and select it if it is found. # Check for GNU ac_path_GREP and select it if it is found.
# Check for GNU $ac_path_GREP # Check for GNU $ac_path_GREP
case `"$ac_path_GREP" --version 2>&1` in case `"$ac_path_GREP" --version 2>&1` in
@ -4156,7 +4134,7 @@ do
for ac_prog in egrep; do for ac_prog in egrep; do
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
as_fn_executable_p "$ac_path_EGREP" || continue { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
# Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU ac_path_EGREP and select it if it is found.
# Check for GNU $ac_path_EGREP # Check for GNU $ac_path_EGREP
case `"$ac_path_EGREP" --version 2>&1` in case `"$ac_path_EGREP" --version 2>&1` in
@ -5278,7 +5256,7 @@ case $as_dir/ in #((
# by default. # by default.
for ac_prog in ginstall scoinst install; do for ac_prog in ginstall scoinst install; do
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
if test $ac_prog = install && if test $ac_prog = install &&
grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
# AIX install. It has an incompatible calling convention. # AIX install. It has an incompatible calling convention.
@ -5351,7 +5329,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -5391,7 +5369,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_ac_ct_RANLIB="ranlib" ac_cv_prog_ac_ct_RANLIB="ranlib"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -5443,7 +5421,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_INDENT="${ac_tool_prefix}indent" ac_cv_prog_INDENT="${ac_tool_prefix}indent"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -5483,7 +5461,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_ac_ct_INDENT="indent" ac_cv_prog_ac_ct_INDENT="indent"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -5535,7 +5513,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_AR="${ac_tool_prefix}ar" ac_cv_prog_AR="${ac_tool_prefix}ar"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -5575,7 +5553,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_ac_ct_AR="ar" ac_cv_prog_ac_ct_AR="ar"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -5627,7 +5605,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_MPI_CC="${ac_tool_prefix}mpicc" ac_cv_prog_MPI_CC="${ac_tool_prefix}mpicc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -5667,7 +5645,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_ac_ct_MPI_CC="mpicc" ac_cv_prog_ac_ct_MPI_CC="mpicc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -5721,7 +5699,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_path_INSTALL_INFO="$as_dir/$ac_word$ac_exec_ext" ac_cv_path_INSTALL_INFO="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -5762,7 +5740,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_path_SHELL="$as_dir/$ac_word$ac_exec_ext" ac_cv_path_SHELL="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -6752,7 +6730,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_REXE="$ac_prog" ac_cv_prog_REXE="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -6873,7 +6851,7 @@ do
IFS=$as_save_IFS IFS=$as_save_IFS
test -z "$as_dir" && as_dir=. test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_PYTHON="$ac_prog" ac_cv_prog_PYTHON="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2 break 2
@ -8459,7 +8437,7 @@ fi
if test "$coroutining" = "yes" if test "$coroutining" = "yes"
then then
YAP_EXTRAS="$YAP_EXTRAS -DCOROUTINING=1" YAP_EXTRAS="$YAP_EXTRAS -DCOROUTINING=1 -DCUT_C=1"
fi fi
if test "$rationaltrees" = "yes" if test "$rationaltrees" = "yes"
@ -11854,16 +11832,16 @@ if (echo >conf$$.file) 2>/dev/null; then
# ... but there are two gotchas: # ... but there are two gotchas:
# 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
# 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
# In both cases, we have to default to `cp -pR'. # In both cases, we have to default to `cp -p'.
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
as_ln_s='cp -pR' as_ln_s='cp -p'
elif ln conf$$.file conf$$ 2>/dev/null; then elif ln conf$$.file conf$$ 2>/dev/null; then
as_ln_s=ln as_ln_s=ln
else else
as_ln_s='cp -pR' as_ln_s='cp -p'
fi fi
else else
as_ln_s='cp -pR' as_ln_s='cp -p'
fi fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null rmdir conf$$.dir 2>/dev/null
@ -11923,16 +11901,28 @@ else
as_mkdir_p=false as_mkdir_p=false
fi fi
if test -x / >/dev/null 2>&1; then
# as_fn_executable_p FILE as_test_x='test -x'
# ----------------------- else
# Test if FILE is an executable regular file. if ls -dL / >/dev/null 2>&1; then
as_fn_executable_p () as_ls_L_option=L
{ else
test -f "$1" && test -x "$1" as_ls_L_option=
} # as_fn_executable_p fi
as_test_x='test -x' as_test_x='
as_executable_p=as_fn_executable_p eval sh -c '\''
if test -d "$1"; then
test -d "$1/.";
else
case $1 in #(
-*)set "./$1";;
esac;
case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
???[sx]*):;;*)false;;esac;fi
'\'' sh
'
fi
as_executable_p=$as_test_x
# Sed expression to map a string onto a valid CPP name. # Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@ -11954,7 +11944,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by $as_me, which was This file was extended by $as_me, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.68. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_HEADERS = $CONFIG_HEADERS
@ -12016,10 +12006,10 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
config.status config.status
configured by $0, generated by GNU Autoconf 2.69, configured by $0, generated by GNU Autoconf 2.68,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2010 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it." gives unlimited permission to copy, distribute and modify it."
@ -12109,7 +12099,7 @@ fi
_ACEOF _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then if \$ac_cs_recheck; then
set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
shift shift
\$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
CONFIG_SHELL='$SHELL' CONFIG_SHELL='$SHELL'

View File

@ -1487,7 +1487,7 @@ fi
if test "$coroutining" = "yes" if test "$coroutining" = "yes"
then then
YAP_EXTRAS="$YAP_EXTRAS -DCOROUTINING=1" YAP_EXTRAS="$YAP_EXTRAS -DCOROUTINING=1 -DCUT_C=1"
fi fi
if test "$rationaltrees" = "yes" if test "$rationaltrees" = "yes"

View File

@ -81,10 +81,10 @@ getclauses1(File, Prog, _Opts) :-
'$bpe_process_pred'([], _F, N, Mode, _Delay, _Tabled, []) --> '$bpe_process_pred'([], _F, N, Mode, _Delay, _Tabled, []) -->
{ '$init_mode'(N, Mode) }. { '$init_mode'(N, Mode) }.
'$bpe_process_pred'(Call.Prog0, F,N,Modes,Delay,Tabled, Cls0) --> '$bpe_process_pred'([Call|Prog0], F,N, Modes, Delay, Tabled, Cls0) -->
{ '$get_pred'(Call, F, N, Modes, Delay, Tabled, Cls0, ClsI) }, !, { '$get_pred'(Call, F, N, Modes, Delay, Tabled, Cls0, ClsI) }, !,
'$bpe_process_pred'(Prog0, F,N,Modes,Delay,Tabled, ClsI). '$bpe_process_pred'(Prog0, F, N, Modes, Delay, Tabled, ClsI).
'$bpe_process_pred'(Call.Prog0, F,N,Modes,Delay,Tabled, Cls0) --> '$bpe_process_pred'([Call|Prog0], F, N, Modes, Delay, Tabled, Cls0) -->
[ Call ], [ Call ],
'$bpe_process_pred'(Prog0, F,N,Modes,Delay,Tabled, Cls0). '$bpe_process_pred'(Prog0, F,N,Modes,Delay,Tabled, Cls0).
@ -97,21 +97,22 @@ getclauses1(File, Prog, _Opts) :-
'$get_pred'((P :- Q), F, N, _Modes, _Delay, _Tabled) --> '$get_pred'((P :- Q), F, N, _Modes, _Delay, _Tabled) -->
{ functor(P, F, N), ! }, { functor(P, F, N), ! },
[(P:-Q)]. [(P:-Q)].
'$get_pred'((:- mode Q), F, N, _Modes, _Delay, _Tabled) --> '$get_pred'((:- mode Q), F, N, Modes, _Delay, _Tabled) -->
{ functor(Q, F, N), !, Q =.. [_|Modes0], { functor(Q, F, N), !, Q =.. [_|Modes0],
'$bpe_cvt_modes'(Modes0,Modes,[]) '$bpe_cvt_modes'(Modes0, Modes, [])
}, },
[]. [].
%'$get_pred'((:- table _), F, N, Modes, Delay, Tabled) --> %'$get_pred'((:- table _), F, N, Modes, Delay, Tabled) -->
% { functor(Q, F, N), !, Q =.. [_|Modes] }, % { functor(Q, F, N), !, Q =.. [_|Modes] },
% []. % [].
'$get_pred'((:- _), _F, _N, _Modes, _Delay, _Tabled) --> !, { fail }. '$get_pred'((:- Q), '$damon_load', 0, _Modes, _Delay, _Tabled) -->
[ ('$damon_load' :- '$query'( Q ) )].
'$get_pred'((P), F, N, _Modes, _Delay, _Tabled) --> '$get_pred'((P), F, N, _Modes, _Delay, _Tabled) -->
{ functor(P, F, N), ! }, { functor(P, F, N), ! },
[(P)]. [(P)].
'$bpe_cvt_modes'(Mode.Modes0) --> [NewMode], '$bpe_cvt_modes'([Mode|Modes0]) --> [NewMode],
{ '$bpe_cvt_mode'(Mode, NewMode) }, { '$bpe_cvt_mode'(Mode, NewMode) },
'$bpe_cvt_modes'(Modes0). '$bpe_cvt_modes'(Modes0).
'$bpe_cvt_modes'([]) --> []. '$bpe_cvt_modes'([]) --> [].
@ -127,20 +128,40 @@ preprocess_cl(Cl, Cl, _, _, _, _).
phase_1_process(Prog, Prog). phase_1_process(Prog, Prog).
compileProgToFile(_,_File,[]). compileProgToFile(_, _File, []).
compileProgToFile(_,File,pred(F,N,_,_,Tabled,Clauses).Prog2) :- compileProgToFile(_, File, [Pred|Prog2]) :-
consult_pred(Pred),
compileProgToFile(_, File, Prog2).
consult_preds([], L) :- !,
consult_preds(L).
consult_preds(L0, L) :-
writeln(consult_preds(L0,L)).
consult_preds([]).
consult_preds([P|L]) :-
consult_pred(P),
consult_preds(L).
consult_pred(pred(F,N,_Mode,_Delay,Tabled,Clauses)) :-
(nonvar(Tabled) -> table(F/N) ; true), (nonvar(Tabled) -> table(F/N) ; true),
functor(S,F,N), functor(S,F,N),
assert(b_IS_CONSULTED_c(S)), assert(b_IS_CONSULTED_c(S)),
'$assert_clauses'(Clauses), abolish(F/N),
compileProgToFile(_,File,Prog2). '$assert_clauses'(Clauses).
add_pred(Name, Arity, _Mode, _Delay, Tabled, Clauses) :-
'$assert_clauses'(Clauses).
'$assert_clauses'([]). '$assert_clauses'([]).
'$assert_clauses'(Cl.Clauses) :- '$assert_clauses'([Cl|Clauses]) :-
assert_static(Cl), assert_static(Cl),
'$assert_clauses'(Clauses). '$assert_clauses'(Clauses).
'$myload'(_F). '$myload'(_F) :-
'$damon_load'.
'$query'(G) :- call(G).
initialize_table :- abolish_all_tables. initialize_table :- abolish_all_tables.

View File

@ -28,9 +28,9 @@ INSTALL=@INSTALL@
INSTALL_DATA=@INSTALL_DATA@ INSTALL_DATA=@INSTALL_DATA@
INSTALL_PROGRAM=@INSTALL_PROGRAM@ INSTALL_PROGRAM=@INSTALL_PROGRAM@
srcdir=@srcdir@ srcdir=@srcdir@
PDFLATEX=pdflatex
CLPBN_TOP= $(srcdir)/clpbn.yap \ PFL_MANUAL = $(srcdir)/pfl
$(srcdir)/pfl.yap
CLPBN_SRCDIR = $(srcdir)/clpbn CLPBN_SRCDIR = $(srcdir)/clpbn
@ -38,6 +38,10 @@ CLPBN_LEARNING_SRCDIR = $(srcdir)/learning
CLPBN_EXDIR = $(srcdir)/examples CLPBN_EXDIR = $(srcdir)/examples
CLPBN_TOP= \
$(srcdir)/clpbn.yap \
$(srcdir)/pfl.yap
CLPBN_PROGRAMS= \ CLPBN_PROGRAMS= \
$(CLPBN_SRCDIR)/aggregates.yap \ $(CLPBN_SRCDIR)/aggregates.yap \
$(CLPBN_SRCDIR)/bdd.yap \ $(CLPBN_SRCDIR)/bdd.yap \
@ -74,12 +78,24 @@ CLPBN_LEARNING_PROGRAMS= \
$(CLPBN_LEARNING_SRCDIR)/learn_utils.yap \ $(CLPBN_LEARNING_SRCDIR)/learn_utils.yap \
$(CLPBN_LEARNING_SRCDIR)/mle.yap $(CLPBN_LEARNING_SRCDIR)/mle.yap
CLPBN_EXAMPLES= \
$(CLPBN_EXDIR)/burglary-alarm.fg \
$(CLPBN_EXDIR)/burglary-alarm.pfl \
$(CLPBN_EXDIR)/burglary-alarm.uai \
$(CLPBN_EXDIR)/cg.yap \
$(CLPBN_EXDIR)/city.pfl \
$(CLPBN_EXDIR)/comp_workshops.pfl \
$(CLPBN_EXDIR)/social_network1.pfl \
$(CLPBN_EXDIR)/social_network2.pfl \
$(CLPBN_EXDIR)/sprinkler.pfl \
$(CLPBN_EXDIR)/workshop_attrs.pfl
CLPBN_SCHOOL_EXAMPLES= \ CLPBN_SCHOOL_EXAMPLES= \
$(CLPBN_EXDIR)/School/README \ $(CLPBN_EXDIR)/School/README \
$(CLPBN_EXDIR)/School/evidence_128.yap \ $(CLPBN_EXDIR)/School/evidence_128.yap \
$(CLPBN_EXDIR)/School/parschema.pfl \ $(CLPBN_EXDIR)/School/parschema.pfl \
$(CLPBN_EXDIR)/School/school_128.yap \ $(CLPBN_EXDIR)/School/school_128.yap \
$(CLPBN_EXDIR)/School/school32.yap \ $(CLPBN_EXDIR)/School/school_32.yap \
$(CLPBN_EXDIR)/School/school_64.yap \ $(CLPBN_EXDIR)/School/school_64.yap \
$(CLPBN_EXDIR)/School/tables.yap $(CLPBN_EXDIR)/School/tables.yap
@ -99,20 +115,8 @@ CLPBN_LEARNING_EXAMPLES= \
$(CLPBN_EXDIR)/learning/sprinkler_params.yap \ $(CLPBN_EXDIR)/learning/sprinkler_params.yap \
$(CLPBN_EXDIR)/learning/train.yap $(CLPBN_EXDIR)/learning/train.yap
CLPBN_EXAMPLES= \
$(CLPBN_EXDIR)/burglary-alarm.fg \
$(CLPBN_EXDIR)/burglary-alarm.pfl \
$(CLPBN_EXDIR)/burglary-alarm.uai \
$(CLPBN_EXDIR)/cg.yap \
$(CLPBN_EXDIR)/city.pfl \
$(CLPBN_EXDIR)/comp_workshops.pfl \
$(CLPBN_EXDIR)/social_domain1.pfl \
$(CLPBN_EXDIR)/social_domain2.pfl \
$(CLPBN_EXDIR)/sprinkler.pfl \
$(CLPBN_EXDIR)/workshop_attrs.pfl
install: $(CLBN_TOP) $(CLBN_PROGRAMS) $(CLPBN_LEARNING_PROGRAMS) $(CLPBN_SCHOOL_EXAMPLES) $(CLPBN_HMMER_EXAMPLES) $(CLPBN_LEARNING_EXAMPLES)
install: $(CLBN_TOP) $(CLBN_PROGRAMS) $(CLPBN_PROGRAMS)
mkdir -p $(DESTDIR)$(SHAREDIR)/clpbn mkdir -p $(DESTDIR)$(SHAREDIR)/clpbn
mkdir -p $(DESTDIR)$(SHAREDIR)/clpbn/learning mkdir -p $(DESTDIR)$(SHAREDIR)/clpbn/learning
mkdir -p $(DESTDIR)$(EXDIR) mkdir -p $(DESTDIR)$(EXDIR)
@ -127,3 +131,13 @@ install: $(CLBN_TOP) $(CLBN_PROGRAMS) $(CLPBN_PROGRAMS)
for h in $(CLPBN_HMMER_EXAMPLES); do $(INSTALL_DATA) $$h $(DESTDIR)$(EXDIR)/HMMer; done for h in $(CLPBN_HMMER_EXAMPLES); do $(INSTALL_DATA) $$h $(DESTDIR)$(EXDIR)/HMMer; done
for h in $(CLPBN_LEARNING_EXAMPLES); do $(INSTALL_DATA) $$h $(DESTDIR)$(EXDIR)/learning; done for h in $(CLPBN_LEARNING_EXAMPLES); do $(INSTALL_DATA) $$h $(DESTDIR)$(EXDIR)/learning; done
docs: $(MANUAL)
$(PDFLATEX) $(PFL_MANUAL)
$(PDFLATEX) $(PFL_MANUAL)
rm pfl.aux pfl.bbl pfl.blg pfl.log pfl.out
install_docs: docs
$(INSTALL_DATA) pfl.pdf $(DESTDIR)$(EXDIR)

View File

@ -1,111 +0,0 @@
Prolog Factor Language (PFL)
Prolog Factor Language (PFL) is a extension of the Prolog language that
allows a natural representation of this first-order probabilistic models
(either directed or undirected). PFL is also capable of solving probabilistic
queries on this models through the implementation of several inference
techniques: variable elimination, belief propagation, lifted variable
elimination and lifted belief propagation.
Language
-------------------------------------------------------------------------------
A graphical model in PFL is represented using parfactors. A PFL parfactor
has the following four components:
Type ; Formulas ; Phi ; Constraint .
- Type refers the type of the network over which the parfactor is defined.
It can be bayes for directed networks, or markov for undirected ones.
- Formulas is a sequence of Prolog terms that define sets of random variables
under the constraint.
- Phi is either a list of parameters or a call to a Prolog goal that will
unify its last argument with a list of parameters.
- Constraint is a list (possible empty) of Prolog goals that will impose
bindings on the logical variables that appear in the formulas.
The "examples" directory contains some popular graphical models described
using PFL.
Querying
-------------------------------------------------------------------------------
Now we show how to use PFL to solve probabilistic queries. We will
use the burlgary alarm network as an example. First, we load the model:
$ yap -l examples/burglary-alarm.yap
Now let's suppose that we want to estimate the probability of a earthquake
ocurred given that mary called. We can do it with the following query:
?- earthquake(X), mary_calls(t).
Suppose now that we want the joint distribution for john_calls and
mary_calls. We can obtain this with the following query:
?- john_calls(X), mary_calls(Y).
Inference Options
-------------------------------------------------------------------------------
PFL supports both ground and lifted inference. The inference algorithm
can be chosen using the set_solver/1 predicate. The following algorithms
are supported:
- lve: generalized counting first-order variable elimination (GC-FOVE)
- hve: (ground) variable elimination
- lbp: lifted first-order belief propagation
- cbp: counting belief propagation
- bp: (ground) belief propagation
- lkc: lifted first-order knowledge compilation
For example, if we want to use ground variable elimination to solve some
query, we need to call first the following goal:
?- set_solver(hve).
It is possible to tweak several parameters of PFL through the
set_horus_flag/2 predicate. The first argument is a key that
identifies the parameter that we desire to tweak, while the second
is some possible value for this key.
The verbosity key controls the level of log information that will be
printed by the corresponding solver. Its possible values are positive
integers. The bigger the number, more log information will be printed.
For example, to view some basic log information we need to call the
following goal:
?- set_horus_flag(verbosity, 1).
The use_logarithms key controls whether the calculations performed
during inference should be done in the log domain or not. Its values
can be true or false. By default is false.
There are also keys specific to the inference algorithm. For example,
elim_heuristic key controls the elimination heuristic that will be
used by ground variable elimination. The following heuristics are
supported:
- sequential
- min_neighbors
- min_weight
- min_fill
- weighted_min_fill
An explanation of this heuristics can be found in Probabilistic Graphical
Models by Daphne Koller.
The schedule, accuracy and max_iter keys are specific for inference
algorithms based on message passing, namely lbp, cbp and bp.
The key schedule can be used to specify the order in which the messages
are sent in belief propagation. The possible values are:
- seq_fixed: at each iteration, all messages are sent in the same order
- seq_random: at each iteration, the messages are sent with a random order
- parallel: at each iteration, the messages are all calculated using the
values of the previous iteration.
- max_residual: the next message to be sent is the one with maximum residual,
(Residual Belief Propagation:Informed Scheduling for Asynchronous Message
Passing)
The max_iter key sets the maximum number of iterations. One iteration
consists in sending all possible messages. The accuracy key indicate
when we should stop sending messages. If the largest difference between
a message sent in the current iteration and one message sent in the previous
iteration is less that accuracy value given, we terminate belief propagation.

View File

@ -1,210 +1,242 @@
:- module(clpbn, [{}/1, :- module(clpbn,
clpbn_flag/2, [{}/1,
set_clpbn_flag/2, clpbn_flag/2,
clpbn_flag/3, set_clpbn_flag/2,
clpbn_key/2, set_solver/1,
clpbn_init_solver/4, set_em_solver/1,
clpbn_run_solver/3, clpbn_flag/3,
pfl_init_solver/6, clpbn_key/2,
pfl_run_solver/4, clpbn_init_graph/1,
clpbn_finalize_solver/1, clpbn_init_solver/4,
clpbn_init_solver/5, clpbn_run_solver/3,
clpbn_run_solver/4, pfl_init_solver/5,
clpbn_init_graph/1, pfl_run_solver/3,
probability/2, pfl_end_solver/1,
conditional_probability/3, probability/2,
use_parfactors/1, conditional_probability/3,
op( 500, xfy, with)]). use_parfactors/1,
op(500, xfy, with)
]).
:- use_module(library(atts)). :- use_module(library(atts)).
:- use_module(library(bhash)). :- use_module(library(bhash)).
:- use_module(library(lists)). :- use_module(library(lists)).
:- use_module(library(terms)). :- use_module(library(terms)).
:- use_module(library(maplist)). :- use_module(library(maplist)).
:- attribute key/1, dist/2, evidence/1.
:- use_module('clpbn/ve',
[ve/3,
check_if_ve_done/1,
init_ve_solver/4,
run_ve_solver/3,
init_ve_ground_solver/5,
run_ve_ground_solver/3,
call_ve_ground_solver/6
]).
:- use_module('clpbn/jt',
[jt/3,
init_jt_solver/4,
run_jt_solver/3
]).
:- use_module('clpbn/bdd',
[bdd/3,
init_bdd_solver/4,
run_bdd_solver/3,
init_bdd_ground_solver/5,
run_bdd_ground_solver/3,
call_bdd_ground_solver/6
]).
:- use_module('clpbn/gibbs',
[gibbs/3,
check_if_gibbs_done/1,
init_gibbs_solver/4,
run_gibbs_solver/3
]).
:- use_module('clpbn/pgrammar',
[pcg_init_graph/0,
init_pcg_solver/4,
run_pcg_solver/3
]).
:- use_module('clpbn/horus_ground',
[call_horus_ground_solver/6,
check_if_horus_ground_solver_done/1,
init_horus_ground_solver/5,
run_horus_ground_solver/3,
end_horus_ground_solver/1
]).
:- use_module('clpbn/horus_lifted',
[call_horus_lifted_solver/3,
check_if_horus_lifted_solver_done/1,
init_horus_lifted_solver/4,
run_horus_lifted_solver/3,
end_horus_lifted_solver/1
]).
%% :- use_module('clpbn/bnt',
%% [do_bnt/3,
%% check_if_bnt_done/1
%% ]).
:- use_module('clpbn/dists',
[dist/4,
get_dist/4,
get_evidence_position/3,
get_evidence_from_position/3,
additive_dists/6
]).
:- use_module('clpbn/evidence',
[store_evidence/1,
add_stored_evidence/2,
incorporate_evidence/2,
check_stored_evidence/2,
put_evidence/2
]).
:- use_module('clpbn/ground_factors',
[generate_network/5]).
:- use_module('clpbn/utils',
[sort_vars_by_key/3]).
:- use_module('clpbn/graphs',
[clpbn2graph/1]).
:- use_module('clpbn/graphviz',
[clpbn2gviz/4]).
% %
% avoid the overhead of using goal_expansion/2. % avoid the overhead of using goal_expansion/2.
% %
:- multifile :- multifile user:term_expansion/2.
user:term_expansion/2.
:- dynamic user:term_expansion/2.
:- dynamic :- dynamic
user:term_expansion/2. solver/1,
em_solver/1,
:- attribute key/1, dist/2, evidence/1. suppress_attribute_display/1,
parameter_softening/1,
use_parfactors/1,
:- use_module('clpbn/ve', output/1,
[ve/3, use/1.
check_if_ve_done/1,
init_ve_solver/4,
run_ve_solver/3,
init_ve_ground_solver/5,
run_ve_ground_solver/3,
call_ve_ground_solver/6
]).
:- use_module('clpbn/horus_ground',
[call_horus_ground_solver/6,
check_if_horus_ground_solver_done/1,
init_horus_ground_solver/5,
run_horus_ground_solver/4,
finalize_horus_ground_solver/1
]).
:- use_module('clpbn/horus_lifted',
[call_horus_lifted_solver/3,
check_if_horus_lifted_solver_done/1,
init_horus_lifted_solver/4,
run_horus_lifted_solver/3,
finalize_horus_lifted_solver/1
]).
:- use_module('clpbn/jt',
[jt/3,
init_jt_solver/4,
run_jt_solver/3
]).
:- use_module('clpbn/bdd',
[bdd/3,
init_bdd_solver/4,
run_bdd_solver/3,
init_bdd_ground_solver/5,
run_bdd_ground_solver/3,
call_bdd_ground_solver/6
]).
%% :- use_module('clpbn/bnt',
%% [do_bnt/3,
%% check_if_bnt_done/1
%% ]).
:- use_module('clpbn/gibbs',
[gibbs/3,
check_if_gibbs_done/1,
init_gibbs_solver/4,
run_gibbs_solver/3
]).
:- use_module('clpbn/pgrammar',
[init_pcg_solver/4,
run_pcg_solver/3,
pcg_init_graph/0
]).
:- use_module('clpbn/graphs',
[
clpbn2graph/1
]).
:- use_module('clpbn/dists',
[
dist/4,
get_dist/4,
get_evidence_position/3,
get_evidence_from_position/3,
additive_dists/6
]).
:- use_module('clpbn/evidence',
[
store_evidence/1,
add_stored_evidence/2,
incorporate_evidence/2,
check_stored_evidence/2,
put_evidence/2
]).
:- use_module('clpbn/utils',
[
sort_vars_by_key/3
]).
:- use_module('clpbn/graphviz',
[clpbn2gviz/4]).
:- use_module(clpbn/ground_factors,
[generate_network/5]).
:- dynamic solver/1,output/1,use/1,suppress_attribute_display/1, parameter_softening/1, em_solver/1, use_parfactors/1.
solver(ve).
em_solver(bp).
:- meta_predicate probability(:,-), conditional_probability(:,:,-). :- meta_predicate probability(:,-), conditional_probability(:,:,-).
%output(xbif(user_error)).
%output(gviz(user_error)). solver(hve).
output(no). em_solver(hve).
suppress_attribute_display(false). suppress_attribute_display(false).
parameter_softening(m_estimate(10)). parameter_softening(m_estimate(10)).
use_parfactors(off). use_parfactors(off).
output(no).
%output(xbif(user_error)).
%output(gviz(user_error)).
clpbn_flag(Flag,Option) :- ground_solver(ve).
ground_solver(hve).
ground_solver(jt).
ground_solver(bdd).
ground_solver(bp).
ground_solver(cbp).
ground_solver(gibbs).
lifted_solver(lve).
lifted_solver(lkc).
lifted_solver(lbp).
clpbn_flag(Flag, Option) :-
clpbn_flag(Flag, Option, Option). clpbn_flag(Flag, Option, Option).
set_clpbn_flag(Flag,Option) :- set_clpbn_flag(Flag,Option) :-
clpbn_flag(Flag, _, Option). clpbn_flag(Flag, _, Option).
clpbn_flag(output,Before,After) :-
retract(output(Before)),
assert(output(After)).
clpbn_flag(solver,Before,After) :- clpbn_flag(solver,Before,After) :-
retract(solver(Before)), retract(solver(Before)),
assert(solver(After)). assert(solver(After)).
clpbn_flag(em_solver,Before,After) :- clpbn_flag(em_solver,Before,After) :-
retract(em_solver(Before)), retract(em_solver(Before)),
assert(em_solver(After)). assert(em_solver(After)).
clpbn_flag(bnt_solver,Before,After) :- clpbn_flag(bnt_solver,Before,After) :-
retract(bnt:bnt_solver(Before)), retract(bnt:bnt_solver(Before)),
assert(bnt:bnt_solver(After)). assert(bnt:bnt_solver(After)).
clpbn_flag(bnt_path,Before,After) :- clpbn_flag(bnt_path,Before,After) :-
retract(bnt:bnt_path(Before)), retract(bnt:bnt_path(Before)),
assert(bnt:bnt_path(After)). assert(bnt:bnt_path(After)).
clpbn_flag(bnt_model,Before,After) :- clpbn_flag(bnt_model,Before,After) :-
retract(bnt:bnt_model(Before)), retract(bnt:bnt_model(Before)),
assert(bnt:bnt_model(After)). assert(bnt:bnt_model(After)).
clpbn_flag(suppress_attribute_display,Before,After) :- clpbn_flag(suppress_attribute_display,Before,After) :-
retract(suppress_attribute_display(Before)), retract(suppress_attribute_display(Before)),
assert(suppress_attribute_display(After)). assert(suppress_attribute_display(After)).
clpbn_flag(parameter_softening,Before,After) :- clpbn_flag(parameter_softening,Before,After) :-
retract(parameter_softening(Before)), retract(parameter_softening(Before)),
assert(parameter_softening(After)). assert(parameter_softening(After)).
clpbn_flag(use_factors,Before,After) :- clpbn_flag(use_factors,Before,After) :-
retract(use_parfactors(Before)), retract(use_parfactors(Before)),
assert(use_parfactors(After)). assert(use_parfactors(After)).
clpbn_flag(output,Before,After) :-
retract(output(Before)),
assert(output(After)).
set_solver(Solver) :-
set_clpbn_flag(solver,Solver).
set_em_solver(Solver) :-
set_clpbn_flag(em_solver,Solver).
{_} :- {_} :-
solver(none), !. solver(none), !.
{Var = Key with Dist} :- { Var = Key with Dist } :-
put_atts(El,[key(Key),dist(DistInfo,Parents)]), put_atts(El,[key(Key),dist(DistInfo,Parents)]),
dist(Dist, DistInfo, Key, Parents), dist(Dist, DistInfo, Key, Parents),
add_evidence(Var,Key,DistInfo,El) add_evidence(Var,Key,DistInfo,El)
% ,writeln({Var = Key with Dist}) % ,writeln({Var = Key with Dist})
. .
% %
% make sure a query variable is reachable by the garbage collector. % make sure a query variable is reachable by the garbage collector.
% %
% we use a mutable variable to avoid unnecessary trailing. % we use a mutable variable to avoid unnecessary trailing.
% %
store_var(El) :- store_var(El) :-
nb_current(clpbn_qvars, Mutable), nb_current(clpbn_qvars, Mutable),
nonvar(Mutable), !, nonvar(Mutable), !,
get_mutable(Tail, Mutable), get_mutable(Tail, Mutable),
update_mutable(El.Tail, Mutable). update_mutable(El.Tail, Mutable).
store_var(El) :- store_var(El) :-
init_clpbn_vars(El). init_clpbn_vars(El).
init_clpbn_vars(El) :- init_clpbn_vars(El) :-
create_mutable(El, Mutable), create_mutable(El, Mutable),
b_setval(clpbn_qvars, Mutable). b_setval(clpbn_qvars, Mutable).
check_constraint(Constraint, _, _, Constraint) :- var(Constraint), !. check_constraint(Constraint, _, _, Constraint) :-
check_constraint((A->D), _, _, (A->D)) :- var(A), !. var(Constraint), !.
check_constraint((A->D), _, _, (A->D)) :-
var(A), !.
check_constraint((([A|B].L)->D), Vars, NVars, (([A|B].NL)->D)) :- !, check_constraint((([A|B].L)->D), Vars, NVars, (([A|B].NL)->D)) :- !,
check_cpt_input_vars(L, Vars, NVars, NL). check_cpt_input_vars(L, Vars, NVars, NL).
check_constraint(Dist, _, _, Dist). check_constraint(Dist, _, _, Dist).
@ -240,17 +272,19 @@ clpbn_marginalise(V, Dist) :-
% %
project_attributes(GVars0, _AVars0) :- project_attributes(GVars0, _AVars0) :-
use_parfactors(on), use_parfactors(on),
clpbn_flag(solver, Solver), Solver \= fove, !, clpbn_flag(solver, Solver),
ground_solver(Solver),
generate_network(GVars0, GKeys, Keys, Factors, Evidence), generate_network(GVars0, GKeys, Keys, Factors, Evidence),
b_setval(clpbn_query_variables, f(GVars0,Evidence)), b_setval(clpbn_query_variables, f(GVars0,Evidence)),
simplify_query(GVars0, GVars), simplify_query(GVars0, GVars),
( GKeys = [] (
-> GKeys = []
->
GVars0 = [V|_], GVars0 = [V|_],
clpbn_display:put_atts(V, [posterior([],[],[],[])]) clpbn_display:put_atts(V, [posterior([],[],[],[])])
; ;
call_ground_solver(Solver, GVars, GKeys, Keys, Factors, Evidence) call_ground_solver(Solver, GVars, GKeys, Keys, Factors, Evidence)
). ).
project_attributes(GVars, AVars) :- project_attributes(GVars, AVars) :-
suppress_attribute_display(false), suppress_attribute_display(false),
AVars = [_|_], AVars = [_|_],
@ -264,11 +298,11 @@ project_attributes(GVars, AVars) :-
(output(xbif(XBifStream)) -> clpbn2xbif(XBifStream,ve,AllVars) ; true), (output(xbif(XBifStream)) -> clpbn2xbif(XBifStream,ve,AllVars) ; true),
(output(gviz(XBifStream)) -> clpbn2gviz(XBifStream,sort,AllVars,GVars) ; true), (output(gviz(XBifStream)) -> clpbn2gviz(XBifStream,sort,AllVars,GVars) ; true),
( (
Solver = graphs Solver = graphs
-> ->
write_out(Solver, [[]], AllVars, DiffVars) write_out(Solver, [[]], AllVars, DiffVars)
; ;
write_out(Solver, [CLPBNGVars], AllVars, DiffVars) write_out(Solver, [CLPBNGVars], AllVars, DiffVars)
). ).
project_attributes(_, _). project_attributes(_, _).
@ -322,37 +356,29 @@ get_rid_of_ev_vars([V|LVs0],[V|LVs]) :-
get_rid_of_ev_vars(LVs0,LVs). get_rid_of_ev_vars(LVs0,LVs).
% do nothing if we don't have query variables to compute. % Call a solver with keys, not actual variables
write_out(_, [], _, _) :- !.
write_out(graphs, _, AVars, _) :-
clpbn2graph(AVars).
write_out(ve, GVars, AVars, DiffVars) :-
ve(GVars, AVars, DiffVars).
write_out(jt, GVars, AVars, DiffVars) :-
jt(GVars, AVars, DiffVars).
write_out(bdd, GVars, AVars, DiffVars) :-
bdd(GVars, AVars, DiffVars).
write_out(bp, _GVars, _AVars, _DiffVars) :-
writeln('interface not supported any longer').
%bp(GVars, AVars, DiffVars).
write_out(gibbs, GVars, AVars, DiffVars) :-
gibbs(GVars, AVars, DiffVars).
write_out(bnt, GVars, AVars, DiffVars) :-
do_bnt(GVars, AVars, DiffVars).
write_out(fove, GVars, AVars, DiffVars) :-
call_horus_lifted_solver(GVars, AVars, DiffVars).
% call a solver with keys, not actual variables
call_ground_solver(bp, GVars, GoalKeys, Keys, Factors, Evidence) :- !,
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(ve, GVars, GoalKeys, Keys, Factors, Evidence) :- !, call_ground_solver(ve, GVars, GoalKeys, Keys, Factors, Evidence) :- !,
call_ve_ground_solver(GVars, GoalKeys, Keys, Factors, Evidence, _Answ). call_ve_ground_solver(GVars, GoalKeys, Keys, Factors, Evidence, _Answ).
call_ground_solver(hve, GVars, GoalKeys, Keys, Factors, Evidence) :- !,
clpbn_horus:set_horus_flag(ground_solver, ve),
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(bp, GVars, GoalKeys, Keys, Factors, Evidence) :- !,
clpbn_horus:set_horus_flag(ground_solver, bp),
call_horus_ground_solver(GVars, GoalKeys, Keys, Factors, Evidence, _Answ).
call_ground_solver(cbp, GVars, GoalKeys, Keys, Factors, Evidence) :- !,
clpbn_horus:set_horus_flag(ground_solver, cbp),
call_horus_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 % fall back to 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),
@ -362,13 +388,51 @@ call_ground_solver(Solver, GVars, _GoalKeys, Keys, Factors, Evidence) :-
write_out(Solver, [GVars], AllVars, _), write_out(Solver, [GVars], AllVars, _),
assert(use_parfactors(on)). assert(use_parfactors(on)).
% do nothing if we don't have query variables to compute.
write_out(_, [], _, _) :- !.
write_out(graphs, _, AVars, _) :- !,
clpbn2graph(AVars).
write_out(ve, GVars, AVars, DiffVars) :- !,
ve(GVars, AVars, DiffVars).
write_out(jt, GVars, AVars, DiffVars) :- !,
jt(GVars, AVars, DiffVars).
write_out(bdd, GVars, AVars, DiffVars) :- !,
bdd(GVars, AVars, DiffVars).
write_out(gibbs, GVars, AVars, DiffVars) :- !,
gibbs(GVars, AVars, DiffVars).
write_out(lve, GVars, AVars, DiffVars) :- !,
clpbn_horus:set_horus_flag(lifted_solver, lve),
call_horus_lifted_solver(GVars, AVars, DiffVars).
write_out(lkc, GVars, AVars, DiffVars) :- !,
clpbn_horus:set_horus_flag(lifted_solver, lkc),
call_horus_lifted_solver(GVars, AVars, DiffVars).
write_out(lbp, GVars, AVars, DiffVars) :- !,
clpbn_horus:set_horus_flag(lifted_solver, lbp),
call_horus_lifted_solver(GVars, AVars, DiffVars).
write_out(bnt, GVars, AVars, DiffVars) :- !,
do_bnt(GVars, AVars, DiffVars).
write_out(Solver, _, _, _) :-
format("Error: solver '~w' is unknown.", [Solver]),
fail.
% %
% convert a PFL network (without constraints) % convert a PFL network (without constraints)
% into CLP(BN) for evaluation % into CLP(BN) for evaluation
% %
gvar_in_hash(V, Hash0, Hash) :- gvar_in_hash(V, Hash0, Hash) :-
get_atts(V, [key(K)]), get_atts(V, [key(K)]),
b_hash_insert(Hash0, K, V, Hash). b_hash_insert(Hash0, K, V, Hash).
key_to_var(K, V, Hash0, Hash0) :- key_to_var(K, V, Hash0, Hash0) :-
b_hash_lookup(K, V, Hash0), !. b_hash_lookup(K, V, Hash0), !.
@ -429,15 +493,15 @@ find_var([_|DVars], V, Key, [_|DKeys]) :-
process_vars([], []). process_vars([], []).
process_vars([V|Vs], [K|Ks]) :- process_vars([V|Vs], [K|Ks]) :-
process_var(V, K), process_var(V, K),
process_vars(Vs, Ks). process_vars(Vs, Ks).
process_var(V, K) :- get_atts(V, [key(K)]), !. process_var(V, K) :- get_atts(V, [key(K)]), !.
% oops: this variable has no attributes. % oops: this variable has no attributes.
process_var(V, _) :- throw(error(instantiation_error,clpbn(attribute_goal(V)))). process_var(V, _) :- throw(error(instantiation_error,clpbn(attribute_goal(V)))).
% %
% unify a CLPBN variable with something. % unify a CLPBN variable with something.
% %
verify_attributes(Var, T, Goal) :- verify_attributes(Var, T, Goal) :-
get_atts(Var, [key(Key),dist(Dist,Parents)]), !, get_atts(Var, [key(Key),dist(Dist,Parents)]), !,
@ -452,28 +516,25 @@ bind_clpbn(T, Var, _, _, _, do_not_bind_variable([put_evidence(T,Var)])) :-
bind_clpbn(T, Var, Key, Dist, Parents, []) :- var(T), bind_clpbn(T, Var, Key, Dist, Parents, []) :- var(T),
get_atts(T, [key(Key1),dist(Dist1,Parents1)]), get_atts(T, [key(Key1),dist(Dist1,Parents1)]),
( (
bind_clpbns(Key, Dist, Parents, Key1, Dist1, Parents1) bind_clpbns(Key, Dist, Parents, Key1, Dist1, Parents1)
-> ->
( (
get_atts(T, [evidence(Ev1)]) -> get_atts(T, [evidence(Ev1)]) ->
bind_evidence_from_extra_var(Ev1,Var) bind_evidence_from_extra_var(Ev1,Var)
; ;
get_atts(Var, [evidence(Ev)]) -> get_atts(Var, [evidence(Ev)]) ->
bind_evidence_from_extra_var(Ev,T) bind_evidence_from_extra_var(Ev,T)
; ;
true true
) )
; ;
fail fail
). ).
bind_clpbn(_, Var, _, _, _, _, []) :-
use(bnt),
check_if_bnt_done(Var), !.
bind_clpbn(_, Var, _, _, _, _, []) :- bind_clpbn(_, Var, _, _, _, _, []) :-
use(ve), use(ve),
check_if_ve_done(Var), !. check_if_ve_done(Var), !.
bind_clpbn(_, Var, _, _, _, _, []) :- bind_clpbn(_, Var, _, _, _, _, []) :-
use(bp), use(hve),
check_if_horus_ground_solver_done(Var), !. check_if_horus_ground_solver_done(Var), !.
bind_clpbn(_, Var, _, _, _, _, []) :- bind_clpbn(_, Var, _, _, _, _, []) :-
use(jt), use(jt),
@ -481,12 +542,21 @@ bind_clpbn(_, Var, _, _, _, _, []) :-
bind_clpbn(_, Var, _, _, _, _, []) :- bind_clpbn(_, Var, _, _, _, _, []) :-
use(bdd), use(bdd),
check_if_bdd_done(Var), !. check_if_bdd_done(Var), !.
bind_clpbn(_, Var, _, _, _, _, []) :-
use(bp),
check_if_horus_ground_solver_done(Var), !.
bind_clpbn(_, Var, _, _, _, _, []) :-
use(cbp),
check_if_horus_ground_solver_done(Var), !.
bind_clpbn(_, Var, _, _, _, _, []) :-
use(bnt),
check_if_bnt_done(Var), !.
bind_clpbn(T, Var, Key0, _, _, _, []) :- bind_clpbn(T, Var, Key0, _, _, _, []) :-
get_atts(Var, [key(Key)]), !, get_atts(Var, [key(Key)]), !,
( (
Key = Key0 -> true Key = Key0 -> true
; ;
% let us not loose whatever we had. % let us not loose whatever we had.
put_evidence(T,Var) put_evidence(T,Var)
). ).
@ -495,8 +565,8 @@ fresh_attvar(Var, NVar) :-
put_atts(NVar, LAtts). put_atts(NVar, LAtts).
% I will now allow two CLPBN variables to be bound together. % I will now allow two CLPBN variables to be bound together.
%bind_clpbns(Key, Dist, Parents, Key, Dist, Parents). % bind_clpbns(Key, Dist, Parents, Key, Dist, Parents).
bind_clpbns(Key, Dist, Parents, Key1, Dist1, Parents1) :- bind_clpbns(Key, Dist, Parents, Key1, Dist1, Parents1) :-
Key == Key1, !, Key == Key1, !,
get_dist(Dist,_Type,_Domain,_Table), get_dist(Dist,_Type,_Domain,_Table),
get_dist(Dist1,_Type1,_Domain1,_Table1), get_dist(Dist1,_Type1,_Domain1,_Table1),
@ -525,13 +595,22 @@ bind_evidence_from_extra_var(Ev1,Var) :-
bind_evidence_from_extra_var(Ev1,Var) :- bind_evidence_from_extra_var(Ev1,Var) :-
put_atts(Var, [evidence(Ev1)]). put_atts(Var, [evidence(Ev1)]).
user:term_expansion((A :- {}), ( :- true )) :- !, % evidence user:term_expansion((A :- {}), ( :- true )) :- !, % evidence
prolog_load_context(module, M), prolog_load_context(module, M),
store_evidence(M:A). store_evidence(M:A).
clpbn_key(Var,Key) :- clpbn_key(Var,Key) :-
get_atts(Var, [key(Key)]). get_atts(Var, [key(Key)]).
%
% only useful for probabilistic context free grammars
%
clpbn_init_graph(pcg) :- !,
pcg_init_graph.
clpbn_init_graph(_).
% %
% This is a routine to start a solver, called by the learning procedures (ie, em). % This is a routine to start a solver, called by the learning procedures (ie, em).
% LVs is a list of lists of variables one is interested in eventually marginalising out % LVs is a list of lists of variables one is interested in eventually marginalising out
@ -544,94 +623,116 @@ clpbn_init_solver(LVs, Vs0, VarsWithUnboundKeys, State) :-
solver(Solver), solver(Solver),
clpbn_init_solver(Solver, LVs, Vs0, VarsWithUnboundKeys, State). clpbn_init_solver(Solver, LVs, Vs0, VarsWithUnboundKeys, State).
clpbn_init_solver(gibbs, LVs, Vs0, VarsWithUnboundKeys, State) :-
init_gibbs_solver(LVs, Vs0, VarsWithUnboundKeys, State).
clpbn_init_solver(ve, LVs, Vs0, VarsWithUnboundKeys, State) :- clpbn_init_solver(ve, LVs, Vs0, VarsWithUnboundKeys, State) :-
init_ve_solver(LVs, Vs0, VarsWithUnboundKeys, State). init_ve_solver(LVs, Vs0, VarsWithUnboundKeys, State).
clpbn_init_solver(bp, LVs, Vs0, VarsWithUnboundKeys, State) :-
init_horus_ground_solver(LVs, Vs0, VarsWithUnboundKeys, State).
clpbn_init_solver(jt, LVs, Vs0, VarsWithUnboundKeys, State) :- clpbn_init_solver(jt, LVs, Vs0, VarsWithUnboundKeys, State) :-
init_jt_solver(LVs, Vs0, VarsWithUnboundKeys, State). init_jt_solver(LVs, Vs0, VarsWithUnboundKeys, State).
clpbn_init_solver(bdd, LVs, Vs0, VarsWithUnboundKeys, State) :- clpbn_init_solver(bdd, LVs, Vs0, VarsWithUnboundKeys, State) :-
init_bdd_solver(LVs, Vs0, VarsWithUnboundKeys, State). init_bdd_solver(LVs, Vs0, VarsWithUnboundKeys, State).
clpbn_init_solver(gibbs, LVs, Vs0, VarsWithUnboundKeys, State) :-
init_gibbs_solver(LVs, Vs0, VarsWithUnboundKeys, State).
clpbn_init_solver(pcg, LVs, Vs0, VarsWithUnboundKeys, State) :- clpbn_init_solver(pcg, LVs, Vs0, VarsWithUnboundKeys, State) :-
init_pcg_solver(LVs, Vs0, VarsWithUnboundKeys, State). init_pcg_solver(LVs, Vs0, VarsWithUnboundKeys, State).
%
% This is a routine to start a solver, called by the learning procedures (ie, em).
% LVs is a list of lists of variables one is interested in eventually marginalising out
% Vs0 gives the original graph
% AllDiffs gives variables that are not fully constrainted, ie, we don't fully know
% the key. In this case, we assume different instances will be bound to different
% values at the end of the day.
%
pfl_init_solver(QueryKeys, AllKeys, Factors, Evidence, VE, bdd) :-
init_bdd_ground_solver(QueryKeys, AllKeys, Factors, Evidence, VE).
pfl_init_solver(QueryKeys, AllKeys, Factors, Evidence, VE, ve) :-
init_ve_ground_solver(QueryKeys, AllKeys, Factors, Evidence, VE).
pfl_init_solver(QueryKeys, AllKeys, Factors, Evidence, VE, bp) :-
init_horus_ground_solver(QueryKeys, AllKeys, Factors, Evidence, VE).
pfl_init_solver(QueryKeys, AllKeys, Factors, Evidence, VE, hve) :-
init_horus_ground_solver(QueryKeys, AllKeys, Factors, Evidence, VE).
% %
% LVs is the list of lists of variables to marginalise % LVs is the list of lists of variables to marginalise
% Vs is the full graph % Vs is the full graph
% Ps are the probabilities on LVs. % Ps are the probabilities on LVs.
%
% %
clpbn_run_solver(LVs, LPs, State) :- clpbn_run_solver(LVs, LPs, State) :-
solver(Solver), solver(Solver),
clpbn_run_solver(Solver, LVs, LPs, State). clpbn_run_solver(Solver, LVs, LPs, State).
clpbn_run_solver(gibbs, LVs, LPs, State) :-
run_gibbs_solver(LVs, LPs, State).
clpbn_run_solver(ve, LVs, LPs, State) :- clpbn_run_solver(ve, LVs, LPs, State) :-
run_ve_solver(LVs, LPs, State). run_ve_solver(LVs, LPs, State).
clpbn_run_solver(bp, LVs, LPs, State) :-
run_horus_ground_solver(LVs, LPs, State).
clpbn_run_solver(jt, LVs, LPs, State) :- clpbn_run_solver(jt, LVs, LPs, State) :-
run_jt_solver(LVs, LPs, State). run_jt_solver(LVs, LPs, State).
clpbn_run_solver(bdd, LVs, LPs, State) :- clpbn_run_solver(bdd, LVs, LPs, State) :-
run_bdd_solver(LVs, LPs, State). run_bdd_solver(LVs, LPs, State).
clpbn_run_solver(gibbs, LVs, LPs, State) :-
run_gibbs_solver(LVs, LPs, State).
clpbn_run_solver(pcg, LVs, LPs, State) :- clpbn_run_solver(pcg, LVs, LPs, State) :-
run_pcg_solver(LVs, LPs, State). run_pcg_solver(LVs, LPs, State).
pfl_run_solver(LVs, LPs, State, ve) :- %
% This is a routine to start a solver, called by the learning procedures (ie, em).
%
pfl_init_solver(QueryKeys, AllKeys, Factors, Evidence, State) :-
em_solver(Solver),
(lifted_solver(Solver) ->
format("Error: you cannot use a lifted solver for learning.", [Solver]), fail
;
true
),
(ground_solver(Solver) ->
true
;
format("Error: solver '~w' is unknown.", [Solver]), fail
),
pfl_init_solver(QueryKeys, AllKeys, Factors, Evidence, State, Solver).
pfl_init_solver(QueryKeys, AllKeys, Factors, Evidence, State, ve) :- !,
init_ve_ground_solver(QueryKeys, AllKeys, Factors, Evidence, State).
pfl_init_solver(QueryKeys, AllKeys, Factors, Evidence, State, hve) :- !,
clpbn_horus:set_horus_flag(ground_solver, ve),
init_horus_ground_solver(QueryKeys, AllKeys, Factors, Evidence, State).
pfl_init_solver(QueryKeys, AllKeys, Factors, Evidence, State, bdd) :- !,
init_bdd_ground_solver(QueryKeys, AllKeys, Factors, Evidence, State).
pfl_init_solver(QueryKeys, AllKeys, Factors, Evidence, State, bp) :- !,
clpbn_horus:set_horus_flag(ground_solver, bp),
init_horus_ground_solver(QueryKeys, AllKeys, Factors, Evidence, State).
pfl_init_solver(QueryKeys, AllKeys, Factors, Evidence, State, cbp) :- !,
clpbn_horus:set_horus_flag(ground_solver, cbp),
init_horus_ground_solver(QueryKeys, AllKeys, Factors, Evidence, State).
pfl_init_solver(_, _, _, _, _, Solver) :-
format("Error: solver '~w' can't be used for learning.", [Solver]),
fail.
pfl_run_solver(LVs, LPs, State) :-
em_solver(Solver),
pfl_run_solver(LVs, LPs, State, Solver).
pfl_run_solver(LVs, LPs, State, ve) :- !,
run_ve_ground_solver(LVs, LPs, State). run_ve_ground_solver(LVs, LPs, State).
pfl_run_solver(LVs, LPs, State, bdd) :-
pfl_run_solver(LVs, LPs, State, hve) :- !,
run_horus_ground_solver(LVs, LPs, State).
pfl_run_solver(LVs, LPs, State, bdd) :- !,
run_bdd_ground_solver(LVs, LPs, State). run_bdd_ground_solver(LVs, LPs, State).
pfl_run_solver(LVs, LPs, State, bp) :-
run_horus_ground_solver(LVs, LPs, State, bp). pfl_run_solver(LVs, LPs, State, bp) :- !,
pfl_run_solver(LVs, LPs, State, hve) :- run_horus_ground_solver(LVs, LPs, State).
run_horus_ground_solver(LVs, LPs, State, hve).
pfl_run_solver(LVs, LPs, State, cbp) :- !,
run_horus_ground_solver(LVs, LPs, State).
pfl_end_solver(State) :-
(em_solver(hve) ; em_solver(bp) ; em_solver(cbp)),
end_horus_ground_solver(State).
pfl_end_solver(_State).
add_keys(Key1+V1,_Key2,Key1+V1). add_keys(Key1+V1,_Key2,Key1+V1).
%
% only useful for probabilistic context free grammars
%
clpbn_init_graph(pcg) :- !,
pcg_init_graph.
clpbn_init_graph(_).
clpbn_finalize_solver(State) :-
solver(bp), !,
functor(State, _, Last),
arg(Last, State, Info),
finalize_horus_ground_solver(Info).
clpbn_finalize_solver(_State).
probability(Goal, Prob) :- probability(Goal, Prob) :-
findall(Prob, do_probability(Goal, [], Prob), [Prob]). findall(Prob, do_probability(Goal, [], Prob), [Prob]).
conditional_probability(Goal, ListOfGoals, Prob) :- conditional_probability(Goal, ListOfGoals, Prob) :-
\+ ground(Goal), \+ ground(Goal),
throw(error(ground(Goal),conditional_probability(Goal, ListOfGoals, Prob))). throw(error(ground(Goal),conditional_probability(Goal, ListOfGoals, Prob))).
@ -665,26 +766,26 @@ evidence_to_var(Goal, C, VItem, V) :-
Goal =.. [L|Args], Goal =.. [L|Args],
variabilise_last(Args, C, NArgs, V), variabilise_last(Args, C, NArgs, V),
VItem =.. [L|NArgs]. VItem =.. [L|NArgs].
variabilise_last([Arg], Arg, [V], V). variabilise_last([Arg], Arg, [V], V).
variabilise_last([Arg1,Arg2|Args], Arg, Arg1.NArgs, V) :- variabilise_last([Arg1,Arg2|Args], Arg, Arg1.NArgs, V) :-
variabilise_last(Arg2.Args, Arg, NArgs, V). variabilise_last(Arg2.Args, Arg, NArgs, V).
match_probability(VPs, Goal, C, V, Prob) :- match_probability(VPs, Goal, C, V, Prob) :-
match_probabilities(VPs, Goal, C, V, Prob). match_probabilities(VPs, Goal, C, V, Prob).
match_probabilities([p(V0=C)=Prob|_], _, C, V, Prob) :- match_probabilities([p(V0=C)=Prob|_], _, C, V, Prob) :-
V0 == V, V0 == V,
!. !.
match_probabilities([_|Probs], G, C, V, Prob) :- match_probabilities([_|Probs], G, C, V, Prob) :-
match_probabilities(Probs, G, C, V, Prob). match_probabilities(Probs, G, C, V, Prob).
goal_to_key(_:Goal, Skolem) :- goal_to_key(_:Goal, Skolem) :-
goal_to_key(Goal, Skolem). goal_to_key(Goal, Skolem).
goal_to_key(Goal, Skolem) :- goal_to_key(Goal, Skolem) :-
functor(Goal, Na, Ar), functor(Goal, Na, Ar),
Ar1 is Ar-1, Ar1 is Ar-1,
functor(Skolem, Na, Ar1). functor(Skolem, Na, Ar1).
:- use_parfactors(on) -> true ; assert(use_parfactors(off)). :- use_parfactors(on) -> true ; assert(use_parfactors(off)).

View File

@ -1,42 +1,45 @@
% %
% generate explicit CPTs % generate explicit CPTs
% %
:- module(clpbn_aggregates, [ :- module(clpbn_aggregates,
check_for_agg_vars/2, [check_for_agg_vars/2,
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 avg_factors/5
]). ]).
:- use_module(library(clpbn), [{}/1]). :- use_module(library(clpbn),
[{}/1]).
:- use_module(library(lists), :- use_module(library(lists),
[last/2, [last/2,
sumlist/2, sumlist/2,
sum_list/3, sum_list/3,
max_list/2, max_list/2,
min_list/2, min_list/2,
nth0/3 nth0/3
]). ]).
:- use_module(library(matrix), :- use_module(library(matrix),
[matrix_new/3, [matrix_new/3,
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), :- use_module(library(pfl),
[skolem/2, [skolem/2,
add_ground_factor/5]). add_ground_factor/5
]).
:- use_module(library(bhash)). :- use_module(library(bhash)).
@ -60,9 +63,9 @@ simplify_dist(_, _, _, _, Vs0, Vs0).
% %
avg_factors(Key, Parents, _Smoothing, NewParents, Id) :- avg_factors(Key, Parents, _Smoothing, NewParents, Id) :-
% we keep ev as a list % we keep ev as a list
skolem(Key, Domain), skolem(Key, Domain),
avg_table(Parents, Parents, Domain, Key, 0, 1.0, NewParents, [], _ExtraSkolems, Id). avg_table(Parents, Parents, Domain, Key, 0, 1.0, NewParents, [], _ExtraSkolems, Id).
% there are 4 cases: % there are 4 cases:
% no evidence on top node % no evidence on top node
@ -70,17 +73,17 @@ avg_factors(Key, Parents, _Smoothing, NewParents, Id) :-
% evidence on top node *entailed* by values of parents (so there is no real connection) % evidence on top node *entailed* by values of parents (so there is no real connection)
% evidence incompatible with parents % evidence incompatible with parents
query_evidence(Key, EvHash, MAT0, MAT, NewParents0, NewParents, Vs, IVs, NewVs) :- query_evidence(Key, EvHash, MAT0, MAT, NewParents0, NewParents, Vs, IVs, NewVs) :-
b_hash_lookup(Key, Ev, EvHash), !, b_hash_lookup(Key, Ev, EvHash), !,
normalise_CPT_on_lines(MAT0, MAT1, L1), normalise_CPT_on_lines(MAT0, MAT1, L1),
check_consistency(L1, Ev, MAT0, MAT1, L1, MAT, NewParents0, NewParents, Vs, IVs, NewVs). check_consistency(L1, Ev, MAT0, MAT1, L1, MAT, NewParents0, NewParents, Vs, IVs, NewVs).
query_evidence(_, _, MAT, MAT, NewParents, NewParents, _, Vs, Vs). query_evidence(_, _, MAT, MAT, NewParents, NewParents, _, Vs, Vs).
hash_ev(K=V, Es0, Es) :- hash_ev(K=V, Es0, Es) :-
b_hash_insert(Es0, K, V, Es). b_hash_insert(Es0, K, V, Es).
find_ev(Ev, Key, RemKeys, RemKeys, Ev0, EvF) :- find_ev(Ev, Key, RemKeys, RemKeys, Ev0, EvF) :-
b_hash_lookup(Key, V, Ev), !, b_hash_lookup(Key, V, Ev), !,
EvF is Ev0+V. EvF is Ev0+V.
find_ev(_Evs, Key, RemKeys, [Key|RemKeys], Ev, Ev). find_ev(_Evs, Key, RemKeys, [Key|RemKeys], Ev, Ev).
@ -93,11 +96,11 @@ find_ev(_Evs, Key, RemKeys, [Key|RemKeys], Ev, Ev).
% +final CPT % +final CPT
% - New Parents % - New Parents
% + - list of new keys % + - list of new keys
% %
avg_table(Vars, OVars, Domain, Key, TotEvidence, Softness, Vars, Vs, Vs, Id) :- avg_table(Vars, OVars, Domain, Key, TotEvidence, Softness, Vars, Vs, Vs, Id) :-
length(Domain, SDomain), length(Domain, SDomain),
int_power(Vars, SDomain, 1, TabSize), int_power(Vars, SDomain, 1, TabSize),
TabSize =< 256, TabSize =< 256,
/* case gmp is not there !! */ /* case gmp is not there !! */
TabSize > 0, !, TabSize > 0, !,
average_cpt(Vars, OVars, Domain, TotEvidence, Softness, CPT), average_cpt(Vars, OVars, Domain, TotEvidence, Softness, CPT),
@ -115,7 +118,7 @@ avg_table(Vars, OVars, Domain, Key, TotEvidence, Softness, [V1,V2], Vs, [V1,V2|N
average_cpt([V1,V2], OVars, Domain, TotEvidence, Softness, CPT), average_cpt([V1,V2], OVars, Domain, TotEvidence, Softness, CPT),
matrix_to_list(CPT, Mat), matrix_to_list(CPT, Mat),
add_ground_factor(bayes, Domain, [Key,V1,V2], Mat, Id). add_ground_factor(bayes, Domain, [Key,V1,V2], Mat, Id).
intermediate_table(1,_,[V],V, _, _, I, I, Vs, Vs) :- !. intermediate_table(1,_,[V],V, _, _, I, I, Vs, Vs) :- !.
intermediate_table(2, Op, [V1,V2], V, Key, Softness, I0, If, Vs, Vs) :- !, intermediate_table(2, Op, [V1,V2], V, Key, Softness, I0, If, Vs, Vs) :- !,
If is I0+1, If is I0+1,
@ -167,7 +170,7 @@ cpt_min([_|Vars], Key, Els0, CPT, Vs, NewVs) :-
build_avg_table(Vars, OVars, Domain, _, TotEvidence, Softness, CPT, Vars, Vs, Vs) :- build_avg_table(Vars, OVars, Domain, _, TotEvidence, Softness, CPT, Vars, Vs, Vs) :-
length(Domain, SDomain), length(Domain, SDomain),
int_power(Vars, SDomain, 1, TabSize), int_power(Vars, SDomain, 1, TabSize),
TabSize =< 256, TabSize =< 256,
/* case gmp is not there !! */ /* case gmp is not there !! */
TabSize > 0, !, TabSize > 0, !,
average_cpt(Vars, OVars, Domain, TotEvidence, Softness, CPT). average_cpt(Vars, OVars, Domain, TotEvidence, Softness, CPT).
@ -181,11 +184,11 @@ build_avg_table(Vars, OVars, Domain, Key, TotEvidence, Softness, CPT, [V1,V2], V
build_intermediate_table(LL1, sum(Min,Max), L1, V1, Key, 1.0, 0, I1, Vs, Vs1), build_intermediate_table(LL1, sum(Min,Max), L1, V1, Key, 1.0, 0, I1, Vs, Vs1),
build_intermediate_table(LL2, sum(Min,Max), L2, V2, Key, 1.0, I1, _, Vs1, NewVs), build_intermediate_table(LL2, sum(Min,Max), L2, V2, Key, 1.0, I1, _, Vs1, NewVs),
average_cpt([V1,V2], OVars, Domain, TotEvidence, Softness, CPT). average_cpt([V1,V2], OVars, Domain, TotEvidence, Softness, CPT).
build_max_table(Vars, Domain, Softness, p(Domain, CPT, Vars), Vs, Vs) :- build_max_table(Vars, Domain, Softness, p(Domain, CPT, Vars), Vs, Vs) :-
length(Domain, SDomain), length(Domain, SDomain),
int_power(Vars, SDomain, 1, TabSize), int_power(Vars, SDomain, 1, TabSize),
TabSize =< 16, TabSize =< 16,
/* case gmp is not there !! */ /* case gmp is not there !! */
TabSize > 0, !, TabSize > 0, !,
max_cpt(Vars, Domain, Softness, CPT). max_cpt(Vars, Domain, Softness, CPT).
@ -197,11 +200,11 @@ build_max_table(Vars, Domain, Softness, p(Domain, CPT, [V1,V2]), Vs, [V1,V2|NewV
build_intermediate_table(LL1, max(Domain,CPT), L1, V1, Key, 1.0, 0, I1, Vs, Vs1), build_intermediate_table(LL1, max(Domain,CPT), L1, V1, Key, 1.0, 0, I1, Vs, Vs1),
build_intermediate_table(LL2, max(Domain,CPT), L2, V2, Key, 1.0, I1, _, Vs1, NewVs), build_intermediate_table(LL2, max(Domain,CPT), L2, V2, Key, 1.0, I1, _, Vs1, NewVs),
max_cpt([V1,V2], Domain, Softness, CPT). max_cpt([V1,V2], Domain, Softness, CPT).
build_min_table(Vars, Domain, Softness, p(Domain, CPT, Vars), Vs, Vs) :- build_min_table(Vars, Domain, Softness, p(Domain, CPT, Vars), Vs, Vs) :-
length(Domain, SDomain), length(Domain, SDomain),
int_power(Vars, SDomain, 1, TabSize), int_power(Vars, SDomain, 1, TabSize),
TabSize =< 16, TabSize =< 16,
/* case gmp is not there !! */ /* case gmp is not there !! */
TabSize > 0, !, TabSize > 0, !,
min_cpt(Vars, Domain, Softness, CPT). min_cpt(Vars, Domain, Softness, CPT).
@ -213,7 +216,7 @@ build_min_table(Vars, Domain, Softness, p(Domain, CPT, [V1,V2]), Vs, [V1,V2|NewV
build_intermediate_table(LL1, min(Domain,CPT), L1, V1, Key, 1.0, 0, I1, Vs, Vs1), build_intermediate_table(LL1, min(Domain,CPT), L1, V1, Key, 1.0, 0, I1, Vs, Vs1),
build_intermediate_table(LL2, min(Domain,CPT), L2, V2, Key, 1.0, I1, _, Vs1, NewVs), build_intermediate_table(LL2, min(Domain,CPT), L2, V2, Key, 1.0, I1, _, Vs1, NewVs),
min_cpt([V1,V2], Domain, Softness, CPT). min_cpt([V1,V2], Domain, Softness, CPT).
int_power([], _, TabSize, TabSize). int_power([], _, TabSize, TabSize).
int_power([_|L], X, I0, TabSize) :- int_power([_|L], X, I0, TabSize) :-
I is I0*X, I is I0*X,
@ -270,19 +273,21 @@ include_qevidence(_, MAT, MAT, NewParents, NewParents, _, Vs, Vs).
check_consistency(L1, Ev, MAT0, MAT1, L1, MAT, NewParents0, NewParents, Vs, IVs, NewVs) :- check_consistency(L1, Ev, MAT0, MAT1, L1, MAT, NewParents0, NewParents, Vs, IVs, NewVs) :-
sumlist(L1, Tot), sumlist(L1, Tot),
nth0(Ev, L1, Val), nth0(Ev, L1, Val),
(Val == Tot -> (
MAT1 = MAT, Val == Tot
NewParents = [], ->
Vs = NewVs MAT1 = MAT,
NewParents = [],
Vs = NewVs
; ;
Val == 0.0 -> Val == 0.0 ->
throw(error(domain_error(incompatible_evidence),evidence(Ev))) throw(error(domain_error(incompatible_evidence),evidence(Ev)))
; ;
MAT0 = MAT, MAT0 = MAT,
NewParents = NewParents0, NewParents = NewParents0,
IVs = NewVs IVs = NewVs
). ).
% %
% generate actual table, instead of trusting the solver % generate actual table, instead of trusting the solver
@ -299,7 +304,7 @@ get_ds_lengths([],[]).
get_ds_lengths([V|Vs],[Sz|Lengs]) :- get_ds_lengths([V|Vs],[Sz|Lengs]) :-
get_vdist_size(V, Sz), get_vdist_size(V, Sz),
get_ds_lengths(Vs,Lengs). get_ds_lengths(Vs,Lengs).
fill_in_average(Lengs, N, Base, MCPT) :- fill_in_average(Lengs, N, Base, MCPT) :-
generate(Lengs, Case), generate(Lengs, Case),
average(Case, N, Base, Val), average(Case, N, Base, Val),
@ -369,10 +374,10 @@ fill_in_min(_,_).
get_vdist_size(V, Sz) :- get_vdist_size(V, Sz) :-
var(V), !, 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) :- get_vdist_size(V, Sz) :-
skolem(V, Dom), skolem(V, Dom),
length(Dom, Sz). length(Dom, Sz).

View File

@ -9,41 +9,41 @@ V = v(Va, Vb, Vc)
The generic formula is The generic formula is
V <- X, Y V <- X, Y
Va <- P*X1*Y1 + Q*X2*Y2 + ... Va <- P*X1*Y1 + Q*X2*Y2 + ...
**************************************************/ **************************************************/
:- module(clpbn_bdd, :- module(clpbn_bdd,
[bdd/3, [bdd/3,
set_solver_parameter/2, set_solver_parameter/2,
init_bdd_solver/4, init_bdd_solver/4,
init_bdd_ground_solver/5, init_bdd_ground_solver/5,
run_bdd_solver/3, run_bdd_solver/3,
run_bdd_ground_solver/3, run_bdd_ground_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 call_bdd_ground_solver/6
]). ]).
:- use_module(library('clpbn/dists'), :- use_module(library('clpbn/dists'),
[dist/4, [dist/4,
get_dist_domain/2, get_dist_domain/2,
get_dist_domain_size/2, get_dist_domain_size/2,
get_dist_all_sizes/2, get_dist_all_sizes/2,
get_dist_params/2 get_dist_params/2
]). ]).
:- use_module(library('clpbn/display'), :- use_module(library('clpbn/display'),
[clpbn_bind_vals/3]). [clpbn_bind_vals/3]).
:- use_module(library('clpbn/aggregates'), :- use_module(library('clpbn/aggregates'),
[check_for_agg_vars/2]). [check_for_agg_vars/2]).
:- use_module(library(atts)). :- use_module(library(atts)).
@ -80,8 +80,8 @@ bdds(bdd).
% %
% QVars: all query variables? % QVars: all query variables?
% %
% %
init_bdd_ground_solver(QueryKeys, AllKeys, Factors, Evidence, bdd(QueryKeys, AllKeys, Factors, Evidence)). init_bdd_ground_solver(QueryKeys, AllKeys, Factors, Evidence, bdd(QueryKeys, AllKeys, Factors, Evidence)).
% %
@ -93,37 +93,37 @@ run_bdd_ground_solver(_QueryVars, Solutions, bdd(GKeys, Keys, Factors, Evidence)
check_if_bdd_done(_Var). check_if_bdd_done(_Var).
call_bdd_ground_solver(QueryVars, QueryKeys, AllKeys, Factors, Evidence, Output) :- call_bdd_ground_solver(QueryVars, QueryKeys, AllKeys, Factors, Evidence, Output) :-
call_bdd_ground_solver_for_probabilities([QueryKeys], AllKeys, Factors, Evidence, Solutions), call_bdd_ground_solver_for_probabilities([QueryKeys], AllKeys, Factors, Evidence, Solutions),
clpbn_bind_vals([QueryVars], Solutions, Output). clpbn_bind_vals([QueryVars], Solutions, Output).
call_bdd_ground_solver_for_probabilities(QueryKeys, AllKeys, Factors, Evidence, Solutions) :- call_bdd_ground_solver_for_probabilities(QueryKeys, AllKeys, Factors, Evidence, Solutions) :-
keys_to_numbers(AllKeys, Factors, Evidence, Hash4, Id4, FactorIds, EvidenceIds), keys_to_numbers(AllKeys, Factors, Evidence, Hash4, Id4, FactorIds, EvidenceIds),
init_bdd(FactorIds, EvidenceIds, Hash4, Id4, BDD), init_bdd(FactorIds, EvidenceIds, Hash4, Id4, BDD),
run_solver(QueryKeys, Solutions, BDD). run_solver(QueryKeys, Solutions, BDD).
init_bdd(FactorIds, EvidenceIds, Hash, Id, bdd(Term, Leaves, Tops, Hash, Id)) :- init_bdd(FactorIds, EvidenceIds, Hash, Id, bdd(Term, Leaves, Tops, Hash, Id)) :-
sort_keys(FactorIds, AllVars, Leaves), sort_keys(FactorIds, AllVars, Leaves),
rb_new(OrderVs0), rb_new(OrderVs0),
foldl2(order_key, AllVars, 0, _, OrderVs0, OrderVs), foldl2(order_key, AllVars, 0, _, OrderVs0, OrderVs),
rb_new(Vars0), rb_new(Vars0),
rb_new(Pars0), rb_new(Pars0),
rb_new(Ev0), rb_new(Ev0),
foldl(evtotree,EvidenceIds,Ev0,Ev), foldl(evtotree,EvidenceIds,Ev0,Ev),
rb_new(Fs0), rb_new(Fs0),
foldl(ftotree,FactorIds,Fs0,Fs), foldl(ftotree,FactorIds,Fs0,Fs),
init_tops(Leaves,Tops), init_tops(Leaves,Tops),
get_keys_info(AllVars, Ev, Fs, OrderVs, Vars0, _Vars, Pars0, _Pars, Leaves, Tops, Term, []). get_keys_info(AllVars, Ev, Fs, OrderVs, Vars0, _Vars, Pars0, _Pars, Leaves, Tops, Term, []).
order_key( Id, I0, I, OrderVs0, OrderVs) :- order_key( Id, I0, I, OrderVs0, OrderVs) :-
I is I0+1, I is I0+1,
rb_insert(OrderVs0, Id, I0, OrderVs). rb_insert(OrderVs0, Id, I0, OrderVs).
evtotree(K=V,Ev0,Ev) :- evtotree(K=V,Ev0,Ev) :-
rb_insert(Ev0, K, V, Ev). rb_insert(Ev0, K, V, Ev).
ftotree(F, Fs0, Fs) :- ftotree(F, Fs0, Fs) :-
F = f([K|_Parents],_,_,_), F = f([K|_Parents],_,_,_),
rb_insert(Fs0, K, F, Fs). rb_insert(Fs0, K, F, Fs).
bdd([[]],_,_) :- !. bdd([[]],_,_) :- !.
bdd([QueryVars], AllVars, AllDiffs) :- bdd([QueryVars], AllVars, AllDiffs) :-
@ -155,59 +155,59 @@ init_tops([_|Leaves],[_|Tops]) :-
init_tops(Leaves,Tops). init_tops(Leaves,Tops).
sort_keys(AllFs, AllVars, Leaves) :- sort_keys(AllFs, AllVars, Leaves) :-
dgraph_new(Graph0), dgraph_new(Graph0),
foldl(add_node, AllFs, Graph0, Graph), foldl(add_node, AllFs, Graph0, Graph),
dgraph_leaves(Graph, Leaves), dgraph_leaves(Graph, Leaves),
dgraph_top_sort(Graph, AllVars). dgraph_top_sort(Graph, AllVars).
add_node(f([K|Parents],_,_,_), Graph0, Graph) :- add_node(f([K|Parents],_,_,_), Graph0, Graph) :-
dgraph_add_vertex(Graph0, K, Graph1), dgraph_add_vertex(Graph0, K, Graph1),
foldl(add_edge(K), Parents, Graph1, Graph). foldl(add_edge(K), Parents, Graph1, Graph).
add_edge(K, K0, Graph0, Graph) :- add_edge(K, K0, Graph0, Graph) :-
dgraph_add_edge(Graph0, K0, K, 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),
dgraph_leaves(Graph, Leaves), dgraph_leaves(Graph, Leaves),
dgraph_top_sort(Graph, AllVars). dgraph_top_sort(Graph, AllVars).
build_graph([], Graph, Graph). build_graph([], Graph, Graph).
build_graph([V|AllVars0], Graph0, Graph) :- build_graph([V|AllVars0], Graph0, Graph) :-
clpbn:get_atts(V, [dist(_DistId, Parents)]), !, clpbn:get_atts(V, [dist(_DistId, Parents)]), !,
dgraph_add_vertex(Graph0, V, Graph1), dgraph_add_vertex(Graph0, V, Graph1),
add_parents(Parents, V, Graph1, GraphI), add_parents(Parents, V, Graph1, GraphI),
build_graph(AllVars0, GraphI, Graph). build_graph(AllVars0, GraphI, Graph).
build_graph(_V.AllVars0, Graph0, Graph) :- build_graph(_V.AllVars0, Graph0, Graph) :-
build_graph(AllVars0, Graph0, Graph). build_graph(AllVars0, Graph0, Graph).
add_parents([], _V, Graph, Graph). add_parents([], _V, Graph, Graph).
add_parents([V0|Parents], V, Graph0, GraphF) :- 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([], _, _, _, Vs, Vs, Ps, Ps, _, _) --> [].
get_keys_info([V|MoreVs], Evs, Fs, OrderVs, Vs, VsF, Ps, PsF, Lvs, Outs) --> get_keys_info([V|MoreVs], Evs, Fs, OrderVs, Vs, VsF, Ps, PsF, Lvs, Outs) -->
{ rb_lookup(V, F, Fs) }, !, { rb_lookup(V, F, Fs) }, !,
{ F = f([V|Parents], _, _, DistId) }, { F = f([V|Parents], _, _, DistId) },
%{writeln(v:DistId:Parents)}, %{writeln(v:DistId:Parents)},
[DIST], [DIST],
{ get_key_info(V, F, Fs, Evs, OrderVs, DistId, Parents, Vs, Vs2, Ps, Ps1, Lvs, Outs, 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_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) :- get_key_info(V, F, Fs, Evs, OrderVs, DistId, Parents0, Vs, Vs2, Ps, Ps1, Lvs, Outs, DIST) :-
reorder_keys(Parents0, OrderVs, Parents, Map), reorder_keys(Parents0, OrderVs, Parents, Map),
check_key_p(DistId, F, Map, Parms, _ParmVars, Ps, Ps1), check_key_p(DistId, F, Map, Parms, _ParmVars, Ps, Ps1),
unbound_parms(Parms, ParmVars), unbound_parms(Parms, ParmVars),
F = f(_,[Size|_],_,_), F = f(_,[Size|_],_,_),
check_key(V, Size, DIST, Vs, Vs1), check_key(V, Size, DIST, Vs, Vs1),
DIST = info(V, Tree, Ev, Values, Formula, ParmVars, Parms), DIST = info(V, Tree, Ev, Values, Formula, ParmVars, Parms),
% get a list of form [[P00,P01], [P10,P11], [P20,P21]] % get a list of form [[P00,P01], [P10,P11], [P20,P21]]
foldl(get_key_parent(Fs), Parents, PVars, Vs1, Vs2), foldl(get_key_parent(Fs), Parents, PVars, Vs1, Vs2),
cross_product(Values, Ev, PVars, ParmVars, Formula0), cross_product(Values, Ev, PVars, ParmVars, Formula0),
% (numbervars(Formula0,0,_),writeln(formula0:Ev:Formula0), fail ; true), % (numbervars(Formula0,0,_),writeln(formula0:Ev:Formula0), fail ; true),
get_key_evidence(V, Evs, DistId, Tree, Ev, Formula0, Formula, Lvs, Outs). get_key_evidence(V, Evs, DistId, Tree, Ev, Formula0, Formula, Lvs, Outs).
% (numbervars(Formula,0,_),writeln(formula:Formula), fail ; true). % (numbervars(Formula,0,_),writeln(formula:Formula), fail ; true).
get_vars_info([], Vs, Vs, Ps, Ps, _, _) --> []. get_vars_info([], Vs, Vs, Ps, Ps, _, _) --> [].
@ -215,7 +215,7 @@ 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)]) }, !,
%{writeln(v:DistId:Parents)}, %{writeln(v:DistId:Parents)},
[DIST], [DIST],
{ get_var_info(V, DistId, Parents, Vs, Vs2, Ps, Ps1, Lvs, Outs, DIST) }, { get_var_info(V, DistId, Parents, Vs, Vs2, Ps, Ps1, Lvs, Outs, DIST) },
get_vars_info(MoreVs, Vs2, VsF, Ps1, PsF, Lvs, Outs). get_vars_info(MoreVs, Vs2, VsF, Ps1, PsF, Lvs, Outs).
get_vars_info([_|MoreVs], Vs0, VsF, Ps0, PsF, VarsInfo, Lvs, Outs) :- get_vars_info([_|MoreVs], Vs0, VsF, Ps0, PsF, VarsInfo, Lvs, Outs) :-
get_vars_info(MoreVs, Vs0, VsF, Ps0, PsF, VarsInfo, Lvs, Outs). get_vars_info(MoreVs, Vs0, VsF, Ps0, PsF, VarsInfo, Lvs, Outs).
@ -298,17 +298,17 @@ generate_3tree(OUT, [[P0,P1,P2]], I00, I10, I20, IR0, N0, N1, N2, R, Exp, _ExpF)
IR is IR0-1, IR is IR0-1,
( satisf(I00+1, I10, I20, IR, N0, N1, N2, R, Exp) -> ( satisf(I00+1, I10, I20, IR, N0, N1, N2, R, Exp) ->
L0 = [P0|L1] L0 = [P0|L1]
; ;
L0 = L1 L0 = L1
), ),
( satisf(I00, I10+1, I20, IR, N0, N1, N2, R, Exp) -> ( satisf(I00, I10+1, I20, IR, N0, N1, N2, R, Exp) ->
L1 = [P1|L2] L1 = [P1|L2]
; ;
L1 = L2 L1 = L2
), ),
( satisf(I00, I10, I20+1, IR, N0, N1, N2, R, Exp) -> ( satisf(I00, I10, I20+1, IR, N0, N1, N2, R, Exp) ->
L2 = [P2] L2 = [P2]
; ;
L2 = [] L2 = []
), ),
to_disj(L0, OUT). to_disj(L0, OUT).
@ -316,23 +316,23 @@ generate_3tree(OUT, [[P0,P1,P2]|Ps], I00, I10, I20, IR0, N0, N1, N2, R, Exp, Exp
IR is IR0-1, IR is IR0-1,
( satisf(I00+1, I10, I20, IR, N0, N1, N2, R, Exp) -> ( satisf(I00+1, I10, I20, IR, N0, N1, N2, R, Exp) ->
I0 is I00+1, generate_3tree(O0, Ps, I0, I10, I20, IR, N0, N1, N2, R, Exp, ExpF) I0 is I00+1, generate_3tree(O0, Ps, I0, I10, I20, IR, N0, N1, N2, R, Exp, ExpF)
-> ->
L0 = [P0*O0|L1] L0 = [P0*O0|L1]
; ;
L0 = L1 L0 = L1
), ),
( satisf(I00, I10+1, I20, IR0, N0, N1, N2, R, Exp) -> ( satisf(I00, I10+1, I20, IR0, N0, N1, N2, R, Exp) ->
I1 is I10+1, generate_3tree(O1, Ps, I00, I1, I20, IR, N0, N1, N2, R, Exp, ExpF) I1 is I10+1, generate_3tree(O1, Ps, I00, I1, I20, IR, N0, N1, N2, R, Exp, ExpF)
-> ->
L1 = [P1*O1|L2] L1 = [P1*O1|L2]
; ;
L1 = L2 L1 = L2
), ),
( satisf(I00, I10, I20+1, IR0, N0, N1, N2, R, Exp) -> ( satisf(I00, I10, I20+1, IR0, N0, N1, N2, R, Exp) ->
I2 is I20+1, generate_3tree(O2, Ps, I00, I10, I2, IR, N0, N1, N2, R, Exp, ExpF) I2 is I20+1, generate_3tree(O2, Ps, I00, I10, I2, IR, N0, N1, N2, R, Exp, ExpF)
-> ->
L2 = [P2*O2] L2 = [P2*O2]
; ;
L2 = [] L2 = []
), ),
to_disj(L0, OUT). to_disj(L0, OUT).
@ -378,18 +378,18 @@ avg_tree([Vals|PVars], P, Max, Im, IM, Size, O, H0, HF) :-
MaxI is Max-(Size-1), MaxI is Max-(Size-1),
avg_exp(Vals, PVars, 0, P, MaxI, Size, Im, IM, HI, HF, Exp), avg_exp(Vals, PVars, 0, P, MaxI, Size, Im, IM, HI, HF, Exp),
simplify_exp(Exp, Simp). simplify_exp(Exp, Simp).
avg_exp([], _, _, _P, _Max, _Size, _Im, _IM, H, H, 0). avg_exp([], _, _, _P, _Max, _Size, _Im, _IM, H, H, 0).
avg_exp([Val|Vals], PVars, I0, P0, Max, Size, Im, IM, HI, HF, O) :- avg_exp([Val|Vals], PVars, I0, P0, Max, Size, Im, IM, HI, HF, O) :-
(Vals = [] -> O=O1 ; O = Val*O1+not(Val)*O2 ), (Vals = [] -> O=O1 ; O = Val*O1+not(Val)*O2 ),
Im1 is max(0, Im-I0), Im1 is max(0, Im-I0),
IM1 is IM-I0, IM1 is IM-I0,
( IM1 < 0 -> O1 = 0, H2 = HI; /* we have exceed maximum */ ( IM1 < 0 -> O1 = 0, H2 = HI ; /* we have exceed maximum */
Im1 > Max -> O1 = 0, H2 = HI; /* we cannot make to minimum */ Im1 > Max -> O1 = 0, H2 = HI ; /* we cannot make to minimum */
Im1 = 0, IM1 > Max -> O1 = 1, H2 = HI; /* we cannot exceed maximum */ Im1 = 0, IM1 > Max -> O1 = 1, H2 = HI ; /* we cannot exceed maximum */
P is P0+1, P is P0+1,
avg_tree(PVars, P, Max, Im1, IM1, Size, O1, HI, H2) avg_tree(PVars, P, Max, Im1, IM1, Size, O1, HI, H2)
), ),
I is I0+1, I is I0+1,
avg_exp(Vals, PVars, I, P0, Max, Size, Im, IM, H2, HF, O2). avg_exp(Vals, PVars, I, P0, Max, Size, Im, IM, H2, HF, O2).
@ -434,14 +434,14 @@ bup_avg(V, Size, Domain, Parents0, Vs, Vs2, Lvs, Outs, DIST) :-
bin_sums(Vs, Sums, F) :- bin_sums(Vs, Sums, F) :-
vs_to_sums(Vs, Sums0), vs_to_sums(Vs, Sums0),
bin_sums(Sums0, Sums, F, []). bin_sums(Sums0, Sums, F, []).
vs_to_sums([], []). vs_to_sums([], []).
vs_to_sums([V|Vs], [Sum|Sums0]) :- vs_to_sums([V|Vs], [Sum|Sums0]) :-
Sum =.. [sum|V], Sum =.. [sum|V],
vs_to_sums(Vs, Sums0). vs_to_sums(Vs, Sums0).
bin_sums([Sum], Sum) --> !. bin_sums([Sum], Sum) --> !.
bin_sums(LSums, Sum) --> bin_sums(LSums, Sum) -->
{ halve(LSums, Sums1, Sums2) }, { halve(LSums, Sums1, Sums2) },
bin_sums(Sums1, Sum1), bin_sums(Sums1, Sum1),
bin_sums(Sums2, Sum2), bin_sums(Sums2, Sum2),
@ -458,14 +458,14 @@ head(Take, [H|L], [H|Sums1], Sum2) :-
head(Take1, L, Sums1, Sum2). head(Take1, L, Sums1, Sum2).
sum(Sum1, Sum2, Sum) --> sum(Sum1, Sum2, Sum) -->
{ functor(Sum1, _, M1), { functor(Sum1, _, M1),
functor(Sum2, _, M2), functor(Sum2, _, M2),
Max is M1+M2-2, Max is M1+M2-2,
Max1 is Max+1, Max1 is Max+1,
Max0 is M2-1, Max0 is M2-1,
functor(Sum, sum, Max1), functor(Sum, sum, Max1),
Sum1 =.. [_|PVals] }, Sum1 =.. [_|PVals] },
expand_sums(PVals, 0, Max0, Max1, M2, Sum2, Sum). expand_sums(PVals, 0, Max0, Max1, M2, Sum2, Sum).
% %
% bottom up step by step % bottom up step by step
@ -509,12 +509,12 @@ expand_sums(Parents, I0, Max0, Max, Size, Sums, Prot, NewSums, [O=SUM*1|F], F0)
arg(I, NewSums, O), arg(I, NewSums, O),
sum_all(Parents, 0, I0, Max0, Sums, List), sum_all(Parents, 0, I0, Max0, Sums, List),
to_disj(List, SUM), to_disj(List, SUM),
expand_sums(Parents, I, Max0, Max, Size, Sums, Prot, NewSums, F, F0). expand_sums(Parents, I, Max0, Max, Size, Sums, Prot, NewSums, F, F0).
expand_sums(Parents, I0, Max0, Max, Size, Sums, Prot, NewSums, F, F0) :- expand_sums(Parents, I0, Max0, Max, Size, Sums, Prot, NewSums, F, F0) :-
I is I0+1, I is I0+1,
arg(I, Sums, O), arg(I, Sums, O),
arg(I, NewSums, O), arg(I, NewSums, O),
expand_sums(Parents, I, Max0, Max, Size, Sums, Prot, NewSums, F, F0). expand_sums(Parents, I, Max0, Max, Size, Sums, Prot, NewSums, F, F0).
% %
%inner loop: find all parents that contribute to A_ji, %inner loop: find all parents that contribute to A_ji,
@ -536,14 +536,14 @@ sum_all([_V|Vs], Pos, I, Max0, Sums, List) :-
gen_arg(J, Sums, Max, S0) :- gen_arg(J, Sums, Max, S0) :-
gen_arg(0, Max, J, Sums, S0). gen_arg(0, Max, J, Sums, S0).
gen_arg(Max, Max, J, Sums, S0) :- !, gen_arg(Max, Max, J, Sums, S0) :- !,
I is Max+1, I is Max+1,
arg(I, Sums, A), arg(I, Sums, A),
( Max = J -> S0 = A ; S0 = not(A)). ( Max = J -> S0 = A ; S0 = not(A)).
gen_arg(I0, Max, J, Sums, S) :- gen_arg(I0, Max, J, Sums, S) :-
I is I0+1, I is I0+1,
arg(I, Sums, A), arg(I, Sums, A),
( I0 = J -> S = A*S0 ; S = not(A)*S0), ( I0 = J -> S = A*S0 ; S = not(A)*S0),
gen_arg(I, Max, J, Sums, S0). gen_arg(I, Max, J, Sums, S0).
@ -647,19 +647,19 @@ copy(N, [], [], Ms, Parms0, Parms, ParmVars) :-!,
copy(N, Ms, NewMs, NewMs, Parms0, Parms, ParmVars). copy(N, Ms, NewMs, NewMs, Parms0, Parms, ParmVars).
copy(N, D.Ds, ND.NDs, New, El.Parms0, NEl.Parms, V.ParmVars) :- copy(N, D.Ds, ND.NDs, New, El.Parms0, NEl.Parms, V.ParmVars) :-
N1 is N-1, N1 is N-1,
(El == 0.0 -> (El == 0.0 ->
NEl = 0, NEl = 0,
V = NEl, V = NEl,
ND = D ND = D
;El == 1.0 -> ;El == 1.0 ->
NEl = 1, NEl = 1,
V = NEl, V = NEl,
ND = 0.0 ND = 0.0
;El == 0 -> ;El == 0 ->
NEl = 0, NEl = 0,
V = NEl, V = NEl,
ND = D ND = D
;El =:= 1 -> ;El =:= 1 ->
NEl = 1, NEl = 1,
V = NEl, V = NEl,
ND = 0.0, ND = 0.0,
@ -692,9 +692,9 @@ get_parents(V.Parents, Values.PVars, Vs0, Vs) :-
get_parents(Parents, PVars, Vs1, Vs). get_parents(Parents, PVars, Vs1, Vs).
get_key_parent(Fs, V, Values, Vs0, Vs) :- get_key_parent(Fs, V, Values, Vs0, Vs) :-
INFO = info(V, _Parent, _Ev, Values, _, _, _), INFO = info(V, _Parent, _Ev, Values, _, _, _),
rb_lookup(V, f(_, [Size|_], _, _), Fs), rb_lookup(V, f(_, [Size|_], _, _), Fs),
check_key(V, Size, INFO, Vs0, Vs). check_key(V, Size, INFO, Vs0, Vs).
check_key(V, _, INFO, Vs, Vs) :- check_key(V, _, INFO, Vs, Vs) :-
rb_lookup(V, INFO, Vs), !. rb_lookup(V, INFO, Vs), !.
@ -809,20 +809,20 @@ 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) :- get_key_evidence(V, Evs, _, Tree, Ev, F0, F, Leaves, Finals) :-
rb_lookup(V, Pos, Evs), !, rb_lookup(V, Pos, Evs), !,
zero_pos(0, Pos, Ev), zero_pos(0, Pos, Ev),
insert_output(Leaves, V, Finals, Tree, Outs, SendOut), insert_output(Leaves, V, Finals, Tree, Outs, SendOut),
get_outs(F0, F, SendOut, Outs). get_outs(F0, F, SendOut, Outs).
% hidden deterministic node, can be removed. % hidden deterministic node, can be removed.
%% get_key_evidence(V, _, DistId, _Tree, Ev, F0, [], _Leaves, _Finals) :- %% get_key_evidence(V, _, DistId, _Tree, Ev, F0, [], _Leaves, _Finals) :-
%% deterministic(V, DistId), %% deterministic(V, DistId),
%% !, %% !,
%% one_list(Ev), %% one_list(Ev),
%% eval_outs(F0). %% eval_outs(F0).
%% no evidence !!! %% no evidence !!!
get_key_evidence(V, _, _, Tree, _Values, F0, F1, Leaves, Finals) :- get_key_evidence(V, _, _, Tree, _Values, F0, F1, Leaves, Finals) :-
insert_output(Leaves, V, Finals, Tree, Outs, SendOut), insert_output(Leaves, V, Finals, Tree, Outs, SendOut),
get_outs(F0, F1, SendOut, Outs). 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)]), !,
@ -836,17 +836,17 @@ get_evidence(V, _Tree, Ev, F0, [], _Leaves, _Finals) :-
( Name = 'AVG' ; Name = 'MAX' ; Name = 'MIN' ), ( Name = 'AVG' ; Name = 'MAX' ; Name = 'MIN' ),
!, !,
one_list(Ev), one_list(Ev),
eval_outs(F0). eval_outs(F0).
%% no evidence !!! %% no evidence !!!
get_evidence(V, Tree, _Values, F0, F1, Leaves, Finals) :- get_evidence(V, Tree, _Values, F0, F1, Leaves, Finals) :-
insert_output(Leaves, V, Finals, Tree, Outs, SendOut), insert_output(Leaves, V, Finals, Tree, Outs, SendOut),
get_outs(F0, F1, SendOut, Outs). get_outs(F0, F1, SendOut, Outs).
zero_pos(_, _Pos, []). zero_pos(_, _Pos, []).
zero_pos(Pos, Pos, [1|Values]) :- !, zero_pos(Pos, Pos, [1|Values]) :- !,
I is Pos+1, I is Pos+1,
zero_pos(I, Pos, Values). zero_pos(I, Pos, Values).
zero_pos(I0, Pos, [0|Values]) :- zero_pos(I0, Pos, [0|Values]) :-
I is I0+1, I is I0+1,
zero_pos(I, Pos, Values). zero_pos(I, Pos, Values).
@ -855,7 +855,7 @@ one_list(1.Ev) :-
one_list(Ev). one_list(Ev).
% %
% insert a node with the disj of all alternatives, this is only done if node ends up to be in the output % insert a node with the disj of all alternatives, this is only done if node ends up to be in the output
% %
insert_output([], _V, [], _Out, _Outs, []). insert_output([], _V, [], _Out, _Outs, []).
insert_output(V._Leaves, V0, [Top|_], Top, Outs, [Top = Outs]) :- V == V0, !. insert_output(V._Leaves, V0, [Top|_], Top, Outs, [Top = Outs]) :- V == V0, !.
@ -863,7 +863,7 @@ insert_output(_.Leaves, V, _.Finals, Top, Outs, SendOut) :-
insert_output(Leaves, V, Finals, Top, Outs, SendOut). insert_output(Leaves, V, Finals, Top, Outs, SendOut).
get_outs([V=F], [V=NF|End], End, V) :- !, get_outs([V=F], [V=NF|End], End, V) :- !,
% writeln(f0:F), % writeln(f0:F),
simplify_exp(F,NF). simplify_exp(F,NF).
get_outs([(V=F)|Outs], [(V=NF)|NOuts], End, (F0 + V)) :- get_outs([(V=F)|Outs], [(V=NF)|NOuts], End, (F0 + V)) :-
@ -878,11 +878,11 @@ eval_outs([(V=F)|Outs]) :-
eval_outs(Outs). eval_outs(Outs).
run_solver(Qs, LLPs, bdd(Term, Leaves, Nodes, Hash, Id)) :- run_solver(Qs, LLPs, bdd(Term, Leaves, Nodes, Hash, Id)) :-
lists_of_keys_to_ids(Qs, QIds, Hash, _, Id, _), lists_of_keys_to_ids(Qs, QIds, Hash, _, Id, _),
findall(LPs, findall(LPs,
(member(Q, QIds), (member(Q, QIds),
run_bdd_solver([Q],LPs,bdd(Term,Leaves,Nodes))), run_bdd_solver([Q],LPs,bdd(Term,Leaves,Nodes))),
LLPs). LLPs).
run_bdd_solver([Vs], LPs, bdd(Term, _Leaves, Nodes)) :- run_bdd_solver([Vs], LPs, bdd(Term, _Leaves, Nodes)) :-
build_out_node(Nodes, Node), build_out_node(Nodes, Node),
@ -988,7 +988,7 @@ all_cnfs([info(_V, Tree, Ev, Values, Formula, ParmVars, Parms)|Term], BindsF, IV
v_in(V, [V0|_]) :- V == V0, !. v_in(V, [V0|_]) :- V == V0, !.
v_in(V, [_|Vs]) :- v_in(V, [_|Vs]) :-
v_in(V, Vs). v_in(V, Vs).
all_indicators(Values) --> all_indicators(Values) -->
{ values_to_disj(Values, Disj) }, { values_to_disj(Values, Disj) },
@ -1017,7 +1017,7 @@ parameters([(V0=Disj*_I0)|Formula], Tree) -->
parameters(Formula, Tree). parameters(Formula, Tree).
% transform V0<- A*B+C*(D+not(E)) % transform V0<- A*B+C*(D+not(E))
% [V0+not(A)+not(B),V0+not(C)+not(D),V0+not(C)+E] % [V0+not(A)+not(B),V0+not(C)+not(D),V0+not(C)+E]
conj(Disj, V0) --> conj(Disj, V0) -->
{ conj2(Disj, [[V0]], LVs) }, { conj2(Disj, [[V0]], LVs) },
to_disjs(LVs). to_disjs(LVs).
@ -1057,11 +1057,10 @@ generate_exclusions([V0|SeenVs], V) -->
build_cnf(CNF, IVs, Indics, AllParms, AllParmValues, Val) :- build_cnf(CNF, IVs, Indics, AllParms, AllParmValues, Val) :-
%(numbervars(CNF,1,_), writeln(cnf_to_ddnnf(CNF, Vars, IVs, [], F)), fail ; true ), %(numbervars(CNF,1,_), writeln(cnf_to_ddnnf(CNF, Vars, IVs, [], F)), fail ; true ),
cnf_to_ddnnf(CNF, AllParms, F), cnf_to_ddnnf(CNF, AllParms, F),
AllParms = AllParmValues, AllParms = AllParmValues,
IVs = Indics, IVs = Indics,
term_variables(CNF, Extra), term_variables(CNF, Extra),
set_to_ones(Extra), set_to_ones(Extra),
ddnnf_is(F, Val). ddnnf_is(F, Val).

View File

@ -1,45 +1,51 @@
:- module(bnt, [do_bnt/3, :- module(bnt,
create_bnt_graph/2, [do_bnt/3,
check_if_bnt_done/1]). create_bnt_graph/2,
check_if_bnt_done/1
]).
:- use_module(library('clpbn/display'), [ :- use_module(library('clpbn/display'),
clpbn_bind_vals/3]). [clpbn_bind_vals/3]).
:- use_module(library('clpbn/dists'), [ :- use_module(library('clpbn/dists'),
get_dist_domain_size/2, [get_dist_domain_size/2,
get_dist_domain/2, get_dist_domain/2,
get_dist_params/2 get_dist_params/2
]). ]).
:- use_module(library('clpbn/discrete_utils'), [ :- use_module(library('clpbn/discrete_utils'),
reorder_CPT/5]). [reorder_CPT/5]).
:- use_module(library(matlab), [start_matlab/1, :- use_module(library(matlab),
close_matlab/0, [start_matlab/1,
matlab_on/0, close_matlab/0,
matlab_eval_string/1, matlab_on/0,
matlab_eval_string/2, matlab_eval_string/1,
matlab_matrix/4, matlab_eval_string/2,
matlab_vector/2, matlab_matrix/4,
matlab_sequence/3, matlab_vector/2,
matlab_initialized_cells/4, matlab_sequence/3,
matlab_get_variable/2, matlab_initialized_cells/4,
matlab_call/2 matlab_get_variable/2,
]). matlab_call/2
]).
:- use_module(library(dgraphs), [dgraph_new/1, :- use_module(library(dgraphs),
dgraph_add_vertices/3, [dgraph_new/1,
dgraph_add_edges/3, dgraph_add_vertices/3,
dgraph_top_sort/2, dgraph_add_edges/3,
dgraph_vertices/2, dgraph_top_sort/2,
dgraph_edges/2 dgraph_vertices/2,
]). dgraph_edges/2
]).
:- use_module(library(lists), [append/3, :- use_module(library(lists),
member/2,nth/3]). [append/3,
member/2,nth/3
]).
:- use_module(library(ordsets), [ :- use_module(library(ordsets),
ord_insert/3]). [ord_insert/3]).
:- yap_flag(write_strings,on). :- yap_flag(write_strings,on).
@ -95,7 +101,7 @@ do_bnt(QueryVars, AllVars, AllDiffs) :-
add_evidence(SortedVertices, Size, NumberedVertices), add_evidence(SortedVertices, Size, NumberedVertices),
marginalize(QueryVars, SortedVertices, NumberedVertices, Ps), marginalize(QueryVars, SortedVertices, NumberedVertices, Ps),
clpbn_bind_vals(QueryVars, Ps, AllDiffs). clpbn_bind_vals(QueryVars, Ps, AllDiffs).
create_bnt_graph(AllVars, Representatives) :- create_bnt_graph(AllVars, Representatives) :-
create_bnt_graph(AllVars, Representatives, _, _, _). create_bnt_graph(AllVars, Representatives, _, _, _).
@ -148,7 +154,7 @@ extract_kvars([V|AllVars],[N-i(V,Parents)|KVars]) :-
extract_kvars(AllVars,KVars). extract_kvars(AllVars,KVars).
split_tied_vars([],[],[]). split_tied_vars([],[],[]).
split_tied_vars([N-i(V,Par)|More],[N-g(Vs,Ns,Es)|TVars],[N|LNs]) :- split_tied_vars([N-i(V,Par)|More],[N-g(Vs,Ns,Es)|TVars],[N|LNs]) :-
get_pars(Par,N,V,NPs,[],Es0,Es), get_pars(Par,N,V,NPs,[],Es0,Es),
get_tied(More,N,Vs,[V],Ns,NPs,Es,Es0,SVars), get_tied(More,N,Vs,[V],Ns,NPs,Es,Es0,SVars),
split_tied_vars(SVars,TVars,LNs). split_tied_vars(SVars,TVars,LNs).
@ -200,7 +206,7 @@ extract_graph(AllVars, Graph) :-
dgraph_add_vertices(Graph0, AllVars, Graph1), dgraph_add_vertices(Graph0, AllVars, Graph1),
get_edges(AllVars,Edges), get_edges(AllVars,Edges),
dgraph_add_edges(Graph1, Edges, Graph). dgraph_add_edges(Graph1, Edges, Graph).
get_edges([],[]). get_edges([],[]).
get_edges([V|AllVars],Edges) :- get_edges([V|AllVars],Edges) :-
clpbn:get_atts(V, [dist(_,Parents)]), clpbn:get_atts(V, [dist(_,Parents)]),
@ -218,13 +224,13 @@ number_graph([V|SortedGraph], [I|Is], I0, IF) :-
% clpbn:get_atts(V,[key(K)]), % clpbn:get_atts(V,[key(K)]),
% write(I:K),nl, % write(I:K),nl,
number_graph(SortedGraph, Is, I, IF). number_graph(SortedGraph, Is, I, IF).
init_bnet(propositional, SortedGraph, NumberedGraph, Size, []) :- init_bnet(propositional, SortedGraph, NumberedGraph, Size, []) :-
build_dag(SortedGraph, Size), build_dag(SortedGraph, Size),
init_discrete_nodes(SortedGraph, Size), init_discrete_nodes(SortedGraph, Size),
bnet <-- mk_bnet(dag, node_sizes, \discrete, discrete_nodes), bnet <-- mk_bnet(dag, node_sizes, \discrete, discrete_nodes),
dump_cpts(SortedGraph, NumberedGraph). dump_cpts(SortedGraph, NumberedGraph).
init_bnet(tied, SortedGraph, NumberedGraph, Size, Representatives) :- init_bnet(tied, SortedGraph, NumberedGraph, Size, Representatives) :-
build_dag(SortedGraph, Size), build_dag(SortedGraph, Size),
init_discrete_nodes(SortedGraph, Size), init_discrete_nodes(SortedGraph, Size),
@ -314,7 +320,7 @@ get_sizes_and_ids([V|Parents],[Id-V|Ids]) :-
extract_vars([], L, L). extract_vars([], L, L).
extract_vars([_-V|NIds], NParents, Vs) :- extract_vars([_-V|NIds], NParents, Vs) :-
extract_vars(NIds, [V|NParents], Vs). extract_vars(NIds, [V|NParents], Vs).
mkcpt(BayesNet, I, Tab) :- mkcpt(BayesNet, I, Tab) :-
(BayesNet.'CPD'({I})) <-- tabular_CPD(BayesNet,I,Tab). (BayesNet.'CPD'({I})) <-- tabular_CPD(BayesNet,I,Tab).
@ -330,7 +336,7 @@ create_class_vector([], [], [],[]).
create_class_vector([V|Graph], [I|Is], [Id|Classes], [Id-v(V,I,Parents)|Sets]) :- create_class_vector([V|Graph], [I|Is], [Id|Classes], [Id-v(V,I,Parents)|Sets]) :-
clpbn:get_atts(V, [dist(Id,Parents)]), clpbn:get_atts(V, [dist(Id,Parents)]),
create_class_vector(Graph, Is,Classes,Sets). create_class_vector(Graph, Is,Classes,Sets).
representatives([],[]). representatives([],[]).
representatives([Class-Rep|Reps1],[Class-Rep|Reps]) :- representatives([Class-Rep|Reps1],[Class-Rep|Reps]) :-
nonrepresentatives(Reps1, Class, Reps2), nonrepresentatives(Reps1, Class, Reps2),
@ -376,7 +382,7 @@ add_evidence(Graph, Size, Is) :-
mk_evidence(Graph, Is, LN), mk_evidence(Graph, Is, LN),
matlab_initialized_cells( 1, Size, LN, evidence), matlab_initialized_cells( 1, Size, LN, evidence),
[engine_ev, loglik] <-- enter_evidence(engine, evidence). [engine_ev, loglik] <-- enter_evidence(engine, evidence).
mk_evidence([], [], []). mk_evidence([], [], []).
mk_evidence([V|L], [I|Is], [ar(1,I,EvVal1)|LN]) :- mk_evidence([V|L], [I|Is], [ar(1,I,EvVal1)|LN]) :-
clpbn:get_atts(V, [evidence(EvVal)]), !, clpbn:get_atts(V, [evidence(EvVal)]), !,
@ -384,7 +390,7 @@ mk_evidence([V|L], [I|Is], [ar(1,I,EvVal1)|LN]) :-
mk_evidence(L, Is, LN). mk_evidence(L, Is, LN).
mk_evidence([_|L], [_|Is], LN) :- mk_evidence([_|L], [_|Is], LN) :-
mk_evidence(L, Is, LN). mk_evidence(L, Is, LN).
evidence_val(Ev,Val,[Ev|_],Val) :- !. evidence_val(Ev,Val,[Ev|_],Val) :- !.
evidence_val(Ev,I0,[_|Domain],Val) :- evidence_val(Ev,I0,[_|Domain],Val) :-
I1 is I0+1, I1 is I0+1,
@ -403,7 +409,7 @@ marginalize([Vs], SortedVars, NumberedVars,Ps) :-
length(SortedVars,L), length(SortedVars,L),
cycle_values(Den, Ev, Vs, L, Vals, Ps). cycle_values(Den, Ev, Vs, L, Vals, Ps).
cycle_values(_D, _Ev, _Vs, _Size, [], []). cycle_values(_D, _Ev, _Vs, _Size, [], []).
cycle_values(Den,Ev,Vs,Size,[H|T],[HP|TP]):- cycle_values(Den,Ev,Vs,Size,[H|T],[HP|TP]):-
mk_evidence_query(Vs, H, EvQuery), mk_evidence_query(Vs, H, EvQuery),
@ -421,5 +427,4 @@ mk_evidence_query([V|L], [H|T], [ar(1,Pos,El)|LN]) :-
get_dist_domain(Id,D), get_dist_domain(Id,D),
nth(El,D,H), nth(El,D,H),
mk_evidence_query(L, T, LN). mk_evidence_query(L, T, LN).

View File

@ -1,26 +1,28 @@
:- module(clpbn_connected, :- module(clpbn_connected,
[influences/3, [influences/3,
factor_influences/4, factor_influences/4,
init_influences/3, init_influences/3,
influences/4] influences/4
). ]).
:- use_module(library(maplist)). :- use_module(library(maplist)).
:- use_module(library(dgraphs), :- use_module(library(dgraphs),
[dgraph_new/1, [dgraph_new/1,
dgraph_add_edges/3, dgraph_add_edges/3,
dgraph_add_vertex/3, dgraph_add_vertex/3,
dgraph_neighbors/3, dgraph_neighbors/3,
dgraph_edge/3, dgraph_edge/3,
dgraph_transpose/2]). dgraph_transpose/2
]).
:- use_module(library(rbtrees), :- use_module(library(rbtrees),
[rb_new/1, [rb_new/1,
rb_lookup/3, rb_lookup/3,
rb_insert/4, rb_insert/4,
rb_visit/2]). rb_visit/2
]).
factor_influences(Vs, QVars, Ev, LV) :- factor_influences(Vs, QVars, Ev, LV) :-
init_factor_influences(Vs, G, RG), init_factor_influences(Vs, G, RG),
@ -59,13 +61,13 @@ build_edges([P|Parents], V, [P-V|Edges]) :-
% search for the set of variables that influence V % search for the set of variables that influence V
influences(Vs, G, RG, Vars) :- influences(Vs, G, RG, Vars) :-
influences(Vs, [], G, RG, Vars). influences(Vs, [], G, RG, Vars).
% search for the set of variables that influence V % search for the set of variables that influence V
influences(Vs, Evs, G, RG, Vars) :- influences(Vs, Evs, G, RG, Vars) :-
rb_new(Visited0), rb_new(Visited0),
foldl(influence(Evs, G, RG), Vs, Visited0, Visited), foldl(influence(Evs, G, RG), Vs, Visited0, Visited),
all_top(Visited, Evs, Vars). all_top(Visited, Evs, Vars).
influence(_, _G, _RG, V, Vs, Vs) :- influence(_, _G, _RG, V, Vs, Vs) :-
rb_lookup(V, [T|B], Vs), T == t, B == b, !. rb_lookup(V, [T|B], Vs), T == t, B == b, !.
@ -89,76 +91,78 @@ process_new_variable(V, Evs, G, RG, Vs0, Vs2) :-
% visited % visited
throw_below(Evs, G, RG, Child, Vs0, Vs1) :- throw_below(Evs, G, RG, Child, Vs0, Vs1) :-
rb_lookup(Child, [_|B], Vs0), !, rb_lookup(Child, [_|B], Vs0), !,
( (
B == b -> B == b
->
Vs0 = Vs1 % been there before Vs0 = Vs1 % been there before
; ;
B = b, % mark it B = b, % mark it
handle_ball_from_above(Child, Evs, G, RG, Vs0, Vs1) handle_ball_from_above(Child, Evs, G, RG, Vs0, Vs1)
). ).
throw_below(Evs, G, RG, Child, Vs0, Vs2) :- throw_below(Evs, G, RG, Child, Vs0, Vs2) :-
rb_insert(Vs0, Child, [_|b], Vs1), rb_insert(Vs0, Child, [_|b], Vs1),
handle_ball_from_above(Child, Evs, G, RG, Vs1, Vs2). handle_ball_from_above(Child, Evs, G, RG, Vs1, Vs2).
% share this with parents, if we have evidence % share this with parents, if we have evidence
handle_ball_from_above(V, Evs, G, RG, Vs0, Vs1) :- handle_ball_from_above(V, Evs, G, RG, Vs0, Vs1) :-
var(V), var(V),
clpbn:get_atts(V,[evidence(_)]), !, clpbn:get_atts(V,[evidence(_)]), !,
dgraph_neighbors(V, RG, Parents), dgraph_neighbors(V, RG, Parents),
foldl(throw_above(Evs, G, RG), Parents, Vs0, Vs1). foldl(throw_above(Evs, G, RG), Parents, Vs0, Vs1).
handle_ball_from_above(V, Evs, G, RG, Vs0, Vs1) :- handle_ball_from_above(V, Evs, G, RG, Vs0, Vs1) :-
nonvar(V), nonvar(V),
rb_lookup(V,_,Evs), !, rb_lookup(V,_,Evs), !,
dgraph_neighbors(V, RG, Parents), dgraph_neighbors(V, RG, Parents),
foldl(throw_above(Evs, G, RG), Parents, Vs0, Vs1). foldl(throw_above(Evs, G, RG), Parents, Vs0, Vs1).
% propagate to kids, if we do not % propagate to kids, if we do not
handle_ball_from_above(V, Evs, G, RG, Vs0, Vs1) :- handle_ball_from_above(V, Evs, G, RG, Vs0, Vs1) :-
dgraph_neighbors(V, G, Children), dgraph_neighbors(V, G, Children),
foldl(throw_below(Evs, G, RG), Children, Vs0, Vs1). foldl(throw_below(Evs, G, RG), Children, Vs0, Vs1).
% visited % visited
throw_above(Evs, G, RG, Parent, Vs0, Vs1) :- throw_above(Evs, G, RG, Parent, Vs0, Vs1) :-
rb_lookup(Parent, [T|_], Vs0), !, rb_lookup(Parent, [T|_], Vs0), !,
( (
T == t -> T == t
->
Vs1 = Vs0 % been there before Vs1 = Vs0 % been there before
; ;
T = t, % mark it T = t, % mark it
handle_ball_from_below(Parent, Evs, G, RG, Vs0, Vs1) handle_ball_from_below(Parent, Evs, G, RG, Vs0, Vs1)
). ).
throw_above(Evs, G, RG, Parent, Vs0, Vs2) :- throw_above(Evs, G, RG, Parent, Vs0, Vs2) :-
rb_insert(Vs0, Parent, [t|_], Vs1), rb_insert(Vs0, Parent, [t|_], Vs1),
handle_ball_from_below(Parent, Evs, G, RG, Vs1, Vs2). handle_ball_from_below(Parent, Evs, G, RG, Vs1, Vs2).
% share this with parents, if we have evidence % share this with parents, if we have evidence
handle_ball_from_below(V, _Evs, _, _, Vs, Vs) :- handle_ball_from_below(V, _Evs, _, _, Vs, Vs) :-
var(V), var(V),
clpbn:get_atts(V,[evidence(_)]), !. clpbn:get_atts(V,[evidence(_)]), !.
handle_ball_from_below(V, Evs, _, _, Vs, Vs) :- handle_ball_from_below(V, Evs, _, _, Vs, Vs) :-
nonvar(V), nonvar(V),
rb_lookup(V, _, Evs), !. rb_lookup(V, _, Evs), !.
% propagate to kids, if we do not % propagate to kids, if we do not
handle_ball_from_below(V, Evs, G, RG, Vs0, Vs1) :- handle_ball_from_below(V, Evs, G, RG, Vs0, Vs1) :-
dgraph_neighbors(V, RG, Parents), dgraph_neighbors(V, RG, Parents),
propagate_ball_from_below(Parents, Evs, V, G, RG, Vs0, Vs1). propagate_ball_from_below(Parents, Evs, V, G, RG, Vs0, Vs1).
propagate_ball_from_below([], Evs, V, G, RG, Vs0, Vs1) :- !, propagate_ball_from_below([], Evs, V, G, RG, Vs0, Vs1) :- !,
dgraph_neighbors(V, G, Children), dgraph_neighbors(V, G, Children),
foldl(throw_below(Evs, G, RG), Children, Vs0, Vs1). foldl(throw_below(Evs, G, RG), Children, Vs0, Vs1).
propagate_ball_from_below(Parents, Evs, _V, G, RG, Vs0, Vs1) :- propagate_ball_from_below(Parents, Evs, _V, G, RG, Vs0, Vs1) :-
foldl(throw_above(Evs, G, RG), Parents, Vs0, Vs1). foldl(throw_above(Evs, G, RG), Parents, Vs0, Vs1).
all_top(T, Evs, Vs) :- all_top(T, Evs, Vs) :-
rb_visit(T, Pairs), rb_visit(T, Pairs),
foldl( get_top(Evs), Pairs, [], Vs). foldl( get_top(Evs), Pairs, [], Vs).
get_top(_EVs, V-[T|_], Vs, [V|Vs]) :- get_top(_EVs, V-[T|_], Vs, [V|Vs]) :-
T == t, !. T == t, !.
get_top(_EVs, V-_, Vs, [V|Vs]) :- get_top(_EVs, V-_, Vs, [V|Vs]) :-
var(V), var(V),
clpbn:get_atts(V,[evidence(_)]), !. clpbn:get_atts(V,[evidence(_)]), !.
get_top(EVs, V-_, Vs, [V|Vs]) :- get_top(EVs, V-_, Vs, [V|Vs]) :-
nonvar(V), nonvar(V),
rb_lookup(V, _, EVs), !. rb_lookup(V, _, EVs), !.
get_top(_, _, Vs, Vs). get_top(_, _, Vs, Vs).

View File

@ -1,10 +1,14 @@
:- module(discrete_utils, [project_from_CPT/3, :- module(discrete_utils,
reorder_CPT/5, [project_from_CPT/3,
get_dist_size/2]). reorder_CPT/5,
get_dist_size/2
]).
:- use_module(library(clpbn/dists), [get_dist_domain_size/2, :- use_module(library(clpbn/dists),
get_dist_domain/2]). [get_dist_domain_size/2,
get_dist_domain/2
]).
% %
% remove columns from a table % remove columns from a table
% %
@ -20,11 +24,11 @@ propagate_evidence(V, Evs) :-
clpbn:get_atts(V, [evidence(Ev),dist(Id,_)]), !, clpbn:get_atts(V, [evidence(Ev),dist(Id,_)]), !,
get_dist_domain(Id, Out), get_dist_domain(Id, Out),
generate_szs_with_evidence(Out,Ev,0,Evs,Found), generate_szs_with_evidence(Out,Ev,0,Evs,Found),
(var(Found) -> (var(Found) ->
clpbn:get_atts(V, [key(K)]), clpbn:get_atts(V, [key(K)]),
throw(clpbn(evidence_does_not_match,K,Ev,[Out])) throw(clpbn(evidence_does_not_match,K,Ev,[Out]))
; ;
true true
). ).
propagate_evidence(_, _). propagate_evidence(_, _).
@ -143,4 +147,3 @@ get_sizes([V|Deps], [Sz|Sizes]) :-
get_dist_domain_size(Id,Sz), get_dist_domain_size(Id,Sz),
get_sizes(Deps, Sizes). get_sizes(Deps, Sizes).

View File

@ -1,17 +1,20 @@
:- module(clpbn_display, [
clpbn_bind_vals/3]). :- module(clpbn_display,
[clpbn_bind_vals/3]).
:- use_module(library(lists), :- use_module(library(lists),
[ [member/2]).
member/2
]).
:- use_module(library(clpbn/dists), [get_dist_domain/2]). :- use_module(library(clpbn/dists),
[get_dist_domain/2]).
:- use_module(library(clpbn), [use_parfactors/1]). :- use_module(library(clpbn),
[use_parfactors/1]).
:- use_module(library(maplist)). :- use_module(library(maplist)).
:- use_module(library(atts)).
:- attribute posterior/4. :- attribute posterior/4.
@ -75,7 +78,7 @@ clpbn_bind_vals([Vs|MoreVs],[Ps|MorePs],AllDiffs) :-
clpbn_bind_vals2([],_,_) :- !. clpbn_bind_vals2([],_,_) :- !.
% simple case, we want a distribution on a single variable. % simple case, we want a distribution on a single variable.
clpbn_bind_vals2([V],Ps,AllDiffs) :- clpbn_bind_vals2([V],Ps,AllDiffs) :-
use_parfactors(on), !, use_parfactors(on), !,
clpbn:get_atts(V, [key(K)]), clpbn:get_atts(V, [key(K)]),
pfl:skolem(K,Vals), pfl:skolem(K,Vals),

View File

@ -3,47 +3,51 @@
% %
:- module(clpbn_dist, :- module(clpbn_dist,
[ [dist/1,
dist/1, dist/4,
dist/4, dists/1,
dists/1, dist_new_table/2,
dist_new_table/2, get_dist/4,
get_dist/4, get_dist_matrix/5,
get_dist_matrix/5, get_possibly_deterministic_dist_matrix/5,
get_possibly_deterministic_dist_matrix/5, get_dist_domain/2,
get_dist_domain/2, get_dist_domain_size/2,
get_dist_domain_size/2, get_dist_params/2,
get_dist_params/2, get_dist_key/2,
get_dist_key/2, get_dist_all_sizes/2,
get_dist_all_sizes/2, get_evidence_position/3,
get_evidence_position/3, get_evidence_from_position/3,
get_evidence_from_position/3, dist_to_term/2,
dist_to_term/2, empty_dist/2,
empty_dist/2, all_dist_ids/1,
all_dist_ids/1, randomise_all_dists/0,
randomise_all_dists/0, randomise_dist/1,
randomise_dist/1, uniformise_all_dists/0,
uniformise_all_dists/0, uniformise_dist/1,
uniformise_dist/1, reset_all_dists/0,
reset_all_dists/0, add_dist/6,
add_dist/6, additive_dists/6
additive_dists/6 ]).
]).
:- use_module(library(lists),[nth0/3,append/3]). :- use_module(library(lists),
[nth0/3,
append/3
]).
:- use_module(library(clpbn), :- use_module(library(clpbn),
[use_parfactors/1]). [use_parfactors/1]).
:- use_module(library(matrix), :- use_module(library(matrix),
[matrix_new/4, [matrix_new/4,
matrix_new/3, matrix_new/3,
matrix_to_list/2, matrix_to_list/2,
matrix_to_logs/1]). matrix_to_logs/1
]).
:- use_module(library(clpbn/matrix_cpt_utils), :- use_module(library(clpbn/matrix_cpt_utils),
[random_CPT/2, [random_CPT/2,
uniform_CPT/2]). uniform_CPT/2
]).
/* /*
:- mode dist(+, -). :- mode dist(+, -).
@ -86,7 +90,7 @@ where Id is the id,
dna for [a,c,g,t] dna for [a,c,g,t]
rna for [a,c,g,u] rna for [a,c,g,u]
reals reals
********************************************/ ********************************************/
@ -365,3 +369,4 @@ reset_all_dists.
additive_dists(ip(Domain,Tabs1), ip(Domain,Tabs2), Parents1, Parents2, ip(Domain,Tabs), Parents) :- additive_dists(ip(Domain,Tabs1), ip(Domain,Tabs2), Parents1, Parents2, ip(Domain,Tabs), Parents) :-
append(Tabs1, Tabs2, Tabs), append(Tabs1, Tabs2, Tabs),
append(Parents1, Parents2, Parents). append(Parents1, Parents2, Parents).

View File

@ -4,36 +4,34 @@
% %
:- module(clpbn_evidence, :- module(clpbn_evidence,
[ [store_evidence/1,
store_evidence/1, incorporate_evidence/2,
incorporate_evidence/2, check_stored_evidence/2,
check_stored_evidence/2, add_stored_evidence/2,
add_stored_evidence/2, put_evidence/2
put_evidence/2 ]).
]).
:- use_module(library(clpbn), [ :- use_module(library(clpbn),
{}/1, [{}/1,
clpbn_flag/3, clpbn_flag/3,
set_clpbn_flag/2 set_clpbn_flag/2
]). ]).
:- use_module(library('clpbn/dists'), [ :- use_module(library('clpbn/dists'),
get_dist/4 [get_dist/4]).
]).
:- use_module(library(rbtrees), [ :- use_module(library(rbtrees),
rb_new/1, [rb_new/1,
rb_lookup/3, rb_lookup/3,
rb_insert/4 rb_insert/4
]). ]).
:- meta_predicate store_evidence(:). :- meta_predicate store_evidence(:).
:- dynamic node/3, edge/2, evidence/2. :- dynamic node/3, edge/2, evidence/2.
% %
% new evidence storage algorithm. The idea is that instead of % new evidence storage algorithm. The idea is that instead of
% redoing all the evidence every time we query the network, we shall % redoing all the evidence every time we query the network, we shall
% keep a precompiled version around. % keep a precompiled version around.
% %
@ -53,9 +51,9 @@ compute_evidence(_,PreviousSolver) :-
set_clpbn_flag(solver, PreviousSolver). set_clpbn_flag(solver, PreviousSolver).
get_clpbn_vars(G, Vars) :- get_clpbn_vars(G, Vars) :-
% attributes:all_attvars(Vars0), % attributes:all_attvars(Vars0),
once(G), once(G),
attributes:all_attvars(Vars). attributes:all_attvars(Vars).
evidence_error(Ball,PreviousSolver) :- evidence_error(Ball,PreviousSolver) :-
set_clpbn_flag(solver,PreviousSolver), set_clpbn_flag(solver,PreviousSolver),
@ -63,7 +61,7 @@ evidence_error(Ball,PreviousSolver) :-
store_graph([]). store_graph([]).
store_graph([V|Vars]) :- store_graph([V|Vars]) :-
clpbn:get_atts(V,[key(K),dist(Id,Vs)]), clpbn:get_atts(V,[key(K),dist(Id,Vs)]),
\+ node(K, Id, _), !, \+ node(K, Id, _), !,
translate_vars(Vs,TVs), translate_vars(Vs,TVs),
assert(node(K,Id,TVs)), assert(node(K,Id,TVs)),
@ -86,7 +84,6 @@ add_links([K0|TVs],K) :-
assert(edge(K,K0)), assert(edge(K,K0)),
add_links(TVs,K). add_links(TVs,K).
incorporate_evidence(Vs,AllVs) :- incorporate_evidence(Vs,AllVs) :-
rb_new(Cache0), rb_new(Cache0),
create_open_list(Vs, OL, FL, Cache0, CacheI), create_open_list(Vs, OL, FL, Cache0, CacheI),

View File

@ -8,51 +8,54 @@
% %
:- module(clpbn_gibbs, :- module(clpbn_gibbs,
[gibbs/3, [gibbs/3,
check_if_gibbs_done/1, check_if_gibbs_done/1,
init_gibbs_solver/4, init_gibbs_solver/4,
run_gibbs_solver/3]). run_gibbs_solver/3
]).
:- use_module(library(rbtrees), :- use_module(library(rbtrees),
[rb_new/1, [rb_new/1,
rb_insert/4, rb_insert/4,
rb_lookup/3]). rb_lookup/3
]).
:- use_module(library(lists), :- use_module(library(lists),
[member/2, [member/2,
append/3, append/3,
delete/3, delete/3,
max_list/2, max_list/2,
sum_list/2]). sum_list/2
]).
:- use_module(library(ordsets), :- use_module(library(ordsets),
[ord_subtract/3]). [ord_subtract/3]).
:- use_module(library('clpbn/matrix_cpt_utils'), [ :- use_module(library('clpbn/matrix_cpt_utils'),
project_from_CPT/3, [project_from_CPT/3,
reorder_CPT/5, reorder_CPT/5,
multiply_possibly_deterministic_factors/3, multiply_possibly_deterministic_factors/3,
column_from_possibly_deterministic_CPT/3, column_from_possibly_deterministic_CPT/3,
normalise_possibly_deterministic_CPT/2, normalise_possibly_deterministic_CPT/2,
list_from_CPT/2]). list_from_CPT/2
]).
:- use_module(library('clpbn/utils'), [ :- use_module(library('clpbn/utils'),
check_for_hidden_vars/3]). [check_for_hidden_vars/3]).
:- use_module(library('clpbn/dists'), [ :- use_module(library('clpbn/dists'),
get_possibly_deterministic_dist_matrix/5, [get_possibly_deterministic_dist_matrix/5,
get_dist_domain_size/2]). get_dist_domain_size/2
]).
:- use_module(library('clpbn/topsort'), [ :- use_module(library('clpbn/topsort'),
topsort/2]). [topsort/2]).
:- use_module(library('clpbn/display'), [ :- use_module(library('clpbn/display'),
clpbn_bind_vals/3]). [clpbn_bind_vals/3]).
:- use_module(library('clpbn/connected'), :- use_module(library('clpbn/connected'),
[ [influences/3]).
influences/3
]).
:- dynamic gibbs_params/3. :- dynamic gibbs_params/3.
@ -134,7 +137,7 @@ graph_representation([V|Vs], Graph, I0, Keys, [I-IParents|TGraph]) :-
graph_representation(Vs, Graph, I, Keys, TGraph). graph_representation(Vs, Graph, I, Keys, TGraph).
write_pars([]). write_pars([]).
write_pars([V|Parents]) :- write_pars([V|Parents]) :-
clpbn:get_atts(V, [key(K),dist(I,_)]),write(K:I),nl, clpbn:get_atts(V, [key(K),dist(I,_)]),write(K:I),nl,
write_pars(Parents). write_pars(Parents).
@ -146,7 +149,7 @@ get_sizes([V|Parents], [Sz|Szs]) :-
parent_indices([], _, []). parent_indices([], _, []).
parent_indices([V|Parents], Keys, [I|IParents]) :- parent_indices([V|Parents], Keys, [I|IParents]) :-
rb_lookup(V, I, Keys), rb_lookup(V, I, Keys),
parent_indices(Parents, Keys, IParents). parent_indices(Parents, Keys, IParents).
@ -171,7 +174,7 @@ propagate2parents([V|NewParents], Table, Variables, Graph, Keys) :-
propagate2parents(NewParents,Table, Variables, Graph, Keys). propagate2parents(NewParents,Table, Variables, Graph, Keys).
add2graph(V, Vals, Table, IParents, Graph, Keys) :- add2graph(V, Vals, Table, IParents, Graph, Keys) :-
rb_lookup(V, Index, Keys), rb_lookup(V, Index, Keys),
(var(Vals) -> true ; length(Vals,Sz)), (var(Vals) -> true ; length(Vals,Sz)),
arg(Index, Graph, var(V,Index,_,Vals,Sz,VarSlot,_,_,_)), arg(Index, Graph, var(V,Index,_,Vals,Sz,VarSlot,_,_,_)),
member(tabular(Table,Index,IParents), VarSlot), !. member(tabular(Table,Index,IParents), VarSlot), !.
@ -236,7 +239,7 @@ mult_list([Sz|Sizes],Mult0,Mult) :-
MultI is Sz*Mult0, MultI is Sz*Mult0,
mult_list(Sizes,MultI,Mult). mult_list(Sizes,MultI,Mult).
% compile node as set of facts, faster execution % compile node as set of facts, faster execution
compile_var(TotSize,I,_Vals,Sz,CPTs,Parents,_Sizes,Graph) :- compile_var(TotSize,I,_Vals,Sz,CPTs,Parents,_Sizes,Graph) :-
TotSize < 1024*64, TotSize > 0, !, TotSize < 1024*64, TotSize > 0, !,
multiply_all(I,Parents,CPTs,Sz,Graph). multiply_all(I,Parents,CPTs,Sz,Graph).
@ -246,11 +249,11 @@ compile_var(_,_,_,_,_,_,_,_).
multiply_all(I,Parents,CPTs,Sz,Graph) :- multiply_all(I,Parents,CPTs,Sz,Graph) :-
markov_blanket_instance(Parents,Graph,Values), markov_blanket_instance(Parents,Graph,Values),
( (
multiply_all(CPTs,Graph,Probs) multiply_all(CPTs,Graph,Probs)
-> ->
store_mblanket(I,Values,Probs) store_mblanket(I,Values,Probs)
; ;
throw(error(domain_error(bayesian_domain),gibbs_cpt(I,Parents,Values,Sz))) throw(error(domain_error(bayesian_domain),gibbs_cpt(I,Parents,Values,Sz)))
), ),
fail. fail.
multiply_all(I,_,_,_,_) :- multiply_all(I,_,_,_,_) :-
@ -280,7 +283,7 @@ fetch_parents([], _, []).
fetch_parents([P|Parents], Graph, [Val|Vals]) :- fetch_parents([P|Parents], Graph, [Val|Vals]) :-
arg(P,Graph,var(_,_,Val,_,_,_,_,_,_)), arg(P,Graph,var(_,_,Val,_,_,_,_,_,_)),
fetch_parents(Parents, Graph, Vals). fetch_parents(Parents, Graph, Vals).
multiply_more([],_,Probs0,LProbs) :- multiply_more([],_,Probs0,LProbs) :-
normalise_possibly_deterministic_CPT(Probs0, Probs), normalise_possibly_deterministic_CPT(Probs0, Probs),
list_from_CPT(Probs, LProbs0), list_from_CPT(Probs, LProbs0),
@ -296,7 +299,7 @@ accumulate_up_list([P|LProbs], P0, [P1|L]) :-
P1 is P0+P, P1 is P0+P,
accumulate_up_list(LProbs, P1, L). accumulate_up_list(LProbs, P1, L).
store_mblanket(I,Values,Probs) :- store_mblanket(I,Values,Probs) :-
recordz(mblanket,m(I,Values,Probs),_). recordz(mblanket,m(I,Values,Probs),_).
@ -364,8 +367,8 @@ generate_est_mults([], [], _, [], 1).
generate_est_mults([V|Vs], [I|Is], Graph, [M0|Mults], M) :- generate_est_mults([V|Vs], [I|Is], Graph, [M0|Mults], M) :-
arg(V,Graph,var(_,I,_,_,Sz,_,_,_,_)), arg(V,Graph,var(_,I,_,_,Sz,_,_,_,_)),
generate_est_mults(Vs, Is, Graph, Mults, M0), generate_est_mults(Vs, Is, Graph, Mults, M0),
M is M0*Sz. M is M0*Sz.
gen_e0(0,[]) :- !. gen_e0(0,[]) :- !.
gen_e0(Sz,[0|E0L]) :- gen_e0(Sz,[0|E0L]) :-
Sz1 is Sz-1, Sz1 is Sz-1,
@ -455,7 +458,7 @@ get_estimate_pos([I|Is], Sample, [M|Mult], V0, V) :-
get_estimate_pos(Is, Sample, Mult, VI, V). get_estimate_pos(Is, Sample, Mult, VI, V).
update_estimate_for_var(V0,[X|T],[X1|NT]) :- update_estimate_for_var(V0,[X|T],[X1|NT]) :-
( V0 == 0 -> (V0 == 0 ->
X1 is X+1, X1 is X+1,
NT = T NT = T
; ;
@ -496,7 +499,7 @@ do_probs([E|Es],Sum,[P|Ps]) :-
show_sorted([], _) :- nl. show_sorted([], _) :- nl.
show_sorted([I|VarOrder], Graph) :- show_sorted([I|VarOrder], Graph) :-
arg(I,Graph,var(V,I,_,_,_,_,_,_,_)), arg(I,Graph,var(V,I,_,_,_,_,_,_,_)),
clpbn:get_atts(V,[key(K)]), clpbn:get_atts(V,[key(K)]),
format('~w ',[K]), format('~w ',[K]),
show_sorted(VarOrder, Graph). show_sorted(VarOrder, Graph).
@ -528,7 +531,7 @@ add_up_mes(Counts,[me(_,_,Cs)|Chains], Add) :-
sum_lists(Counts, Cs, NCounts), sum_lists(Counts, Cs, NCounts),
add_up_mes(NCounts, Chains, Add). add_up_mes(NCounts, Chains, Add).
sum_lists([],[],[]). sum_lists([],[],[]).
sum_lists([Count|Counts], [C|Cs], [NC|NCounts]) :- sum_lists([Count|Counts], [C|Cs], [NC|NCounts]) :-
NC is Count+C, NC is Count+C,
sum_lists(Counts, Cs, NCounts). sum_lists(Counts, Cs, NCounts).
@ -542,5 +545,3 @@ divide_list([C|Add], Sum, [P|Dist]) :-
P is C/Sum, P is C/Sum,
divide_list(Add, Sum, Dist). divide_list(Add, Sum, Dist).

View File

@ -3,13 +3,14 @@
% Just output a graph with all the variables. % Just output a graph with all the variables.
% %
:- module(clpbn2graph, [clpbn2graph/1]). :- module(clpbn2graph,
[clpbn2graph/1]).
:- use_module(library('clpbn/utils'), [ :- use_module(library('clpbn/utils'),
check_for_hidden_vars/3]). [check_for_hidden_vars/3]).
:- use_module(library('clpbn/dists'), [ :- use_module(library('clpbn/dists'),
get_dist/4]). [get_dist/4]).
:- attribute node/0. :- attribute node/0.
@ -37,7 +38,3 @@ translate_vars([V|Vs],[K|Ks]) :-
clpbn:get_atts(V, [key(K)]), clpbn:get_atts(V, [key(K)]),
translate_vars(Vs,Ks). translate_vars(Vs,Ks).

View File

@ -1,4 +1,6 @@
:- module(clpbn_gviz, [clpbn2gviz/4]).
:- module(clpbn_gviz,
[clpbn2gviz/4]).
clpbn2gviz(Stream, Name, Network, Output) :- clpbn2gviz(Stream, Name, Network, Output) :-
format(Stream, 'digraph ~w { format(Stream, 'digraph ~w {
@ -48,7 +50,7 @@ output_parents1(Stream,[V|L]) :-
put_code(Stream, 0' ), %' put_code(Stream, 0' ), %'
output_parents1(Stream,L). output_parents1(Stream,L).
output_v(V,Stream) :- output_v(V,Stream) :-
clpbn:get_atts(V,[key(Key)]), clpbn:get_atts(V,[key(Key)]),
output_key(Stream,Key). output_key(Stream,Key).

View File

@ -1,40 +1,34 @@
%parfactor( :- module(pfl_ground_factors,
% [ability(P),grade(C,S), satisfaction(C,S,P)], [generate_network/5,
% \phi = [....], f/3
% [P,C,S], ]).
% [P \in [p1,p2,p4], C \in [c1,c3], S \in [s2,s3]]).
% [S \= s2])
:- use_module(library(bhash),
[b_hash_new/1,
b_hash_lookup/3,
b_hash_insert/4,
b_hash_to_list/2
]).
:- module(pfl_ground_factors, [ :- use_module(library(lists),
generate_network/5, [member/2]).
f/3
]).
:- use_module(library(bhash), [
b_hash_new/1,
b_hash_lookup/3,
b_hash_insert/4,
b_hash_to_list/2]).
:- use_module(library(lists), [
delete/3,
nth0/3,
member/2]).
:- use_module(library(maplist)). :- use_module(library(maplist)).
:- use_module(library(pfl), [ :- use_module(library(atts)).
factor/6,
defined_in_factor/2,
skolem/2]).
:- use_module(library(clpbn/aggregates), [ :- use_module(library(pfl),
avg_factors/5]). [factor/6,
defined_in_factor/2,
skolem/2
]).
:- use_module(library(clpbn/dists), [ :- use_module(library(clpbn/aggregates),
dist/4]). [avg_factors/5]).
:- use_module(library(clpbn/dists),
[dist/4]).
:- dynamic currently_defined/1, queue/1, f/4. :- dynamic currently_defined/1, queue/1, f/4.
@ -48,7 +42,7 @@ generate_network(QueryVars, QueryKeys, Keys, Factors, EList) :-
b_hash_new(Evidence0), b_hash_new(Evidence0),
foldl(include_evidence,AVars, Evidence0, Evidence1), foldl(include_evidence,AVars, Evidence0, Evidence1),
static_evidence(Evidence1, Evidence), static_evidence(Evidence1, Evidence),
b_hash_to_list(Evidence, EList0), b_hash_to_list(Evidence, EList0),
maplist(pair_to_evidence,EList0, EList), maplist(pair_to_evidence,EList0, EList),
maplist(queue_evidence, EList), maplist(queue_evidence, EList),
foldl(run_through_query(Evidence), QueryVars, [], QueryKeys), foldl(run_through_query(Evidence), QueryVars, [], QueryKeys),
@ -59,20 +53,20 @@ generate_network(QueryVars, QueryKeys, Keys, Factors, EList) :-
% clean global stateq % clean global stateq
% %
init_global_search :- init_global_search :-
retractall(queue(_)), retractall(queue(_)),
retractall(currently_defined(_)), retractall(currently_defined(_)),
retractall(f(_,_,_)). retractall(f(_,_,_)).
pair_to_evidence(K-E, K=E). pair_to_evidence(K-E, K=E).
include_evidence(V, Evidence0, Evidence) :- include_evidence(V, Evidence0, Evidence) :-
clpbn:get_atts(V,[key(K),evidence(E)]), !, clpbn:get_atts(V,[key(K),evidence(E)]), !,
( (
b_hash_lookup(K, E1, Evidence0) b_hash_lookup(K, E1, Evidence0)
-> ->
(E \= E1 -> throw(clpbn:incompatible_evidence(K,E,E1)) ; Evidence = Evidence0) (E \= E1 -> throw(clpbn:incompatible_evidence(K,E,E1)) ; Evidence = Evidence0)
; ;
b_hash_insert(Evidence0, K, E, Evidence) b_hash_insert(Evidence0, K, E, Evidence)
). ).
include_evidence(_, Evidence, Evidence). include_evidence(_, Evidence, Evidence).
@ -82,16 +76,16 @@ static_evidence(Evidence0, Evidence) :-
include_static_evidence(K=E, Evidence0, Evidence) :- include_static_evidence(K=E, Evidence0, Evidence) :-
( (
b_hash_lookup(K, E1, Evidence0) b_hash_lookup(K, E1, Evidence0)
-> ->
(E \= E1 -> throw(incompatible_evidence(K,E,E1)) ; Evidence = Evidence0) (E \= E1 -> throw(incompatible_evidence(K,E,E1)) ; Evidence = Evidence0)
; ;
b_hash_insert(Evidence0, K, E, Evidence) b_hash_insert(Evidence0, K, E, Evidence)
). ).
queue_evidence(K=_) :- queue_evidence(K=_) :-
queue_in(K). queue_in(K).
run_through_query(Evidence, V, QueryKeys, QueryKeys) :- run_through_query(Evidence, V, QueryKeys, QueryKeys) :-
clpbn:get_atts(V,[key(K)]), clpbn:get_atts(V,[key(K)]),
@ -122,11 +116,11 @@ propagate.
do_propagate(K) :- do_propagate(K) :-
%writeln(-K), %writeln(-K),
\+ currently_defined(K), \+ currently_defined(K),
( ground(K) -> assert(currently_defined(K)) ; true), ( ground(K) -> assert(currently_defined(K)) ; true),
( (
defined_in_factor(K, ParFactor), defined_in_factor(K, ParFactor),
add_factor(ParFactor, Ks) add_factor(ParFactor, Ks)
*-> *->
true true
; ;
throw(error(no_defining_factor(K))) throw(error(no_defining_factor(K)))
@ -136,28 +130,29 @@ do_propagate(K) :-
queue_in(K1), queue_in(K1),
fail. fail.
do_propagate(_K) :- do_propagate(_K) :-
propagate. propagate.
add_factor(factor(Type, Id, Ks, _, _Phi, Constraints), NKs) :- add_factor(factor(Type, Id, Ks, _, _Phi, Constraints), NKs) :-
% writeln(+Ks), % writeln(+Ks),
( Ks = [K,Els], var(Els) (
-> Ks = [K,Els], var(Els)
% aggregate factor ->
% aggregate factor
once(run(Constraints)), once(run(Constraints)),
avg_factors(K, Els, 0.0, NewKeys, NewId), avg_factors(K, Els, 0.0, NewKeys, NewId),
NKs = [K|NewKeys] NKs = [K|NewKeys]
; ;
run(Constraints), run(Constraints),
NKs = Ks, NKs = Ks,
Id = NewId Id = NewId
), ),
( (
f(Type, NewId, NKs) f(Type, NewId, NKs)
-> ->
true true
; ;
assert(f(Type, NewId, NKs)) assert(f(Type, NewId, NKs))
). ).
run([Goal|Goals]) :- run([Goal|Goals]) :-
call(user:Goal), call(user:Goal),

View File

@ -1,19 +1,20 @@
:- module(hmm,
:- module(hmm, [init_hmm/0, [init_hmm/0,
hmm_state/1, hmm_state/1,
emission/1]). emission/1
]).
:- ensure_loaded(library(clpbn)). :- ensure_loaded(library(clpbn)).
:- use_module(library(lists), :- use_module(library(lists),
[nth/3]). [nth/3]).
:- use_module(library(nbhash), :- use_module(library(nbhash),
[nb_hash_new/2, [nb_hash_new/2,
nb_hash_lookup/3, nb_hash_lookup/3,
nb_hash_insert/3 nb_hash_insert/3
]). ]).
:- ensure_loaded(library(tries)). :- ensure_loaded(library(tries)).
@ -46,22 +47,19 @@ hmm_state(N/A,Mod) :-
Key =.. [T|KArgs], Key =.. [T|KArgs],
Head =.. [N|LArgs], Head =.. [N|LArgs],
asserta_static( (Mod:Head :- asserta_static( (Mod:Head :-
( First > 2 -> (First > 2 ->
Last = Key, ! Last = Key, !
; ;
nb_getval(trie, Trie), trie_check_entry(Trie, Key, _) nb_getval(trie, Trie), trie_check_entry(Trie, Key, _) ->
-> % leave work for solver!
% leave work for solver! Last = Key, !
% ;
Last = Key, ! % first time we saw this entry
; nb_getval(trie, Trie), trie_put_entry(Trie, Key, _),
% first time we saw this entry fail
nb_getval(trie, Trie), trie_put_entry(Trie, Key, _), )
fail )).
)
)
).
build_args(4,[A,B,C,D],[A,B,C],A,D). build_args(4,[A,B,C,D],[A,B,C],A,D).
build_args(3, [A,B,C], [A,B],A,C). build_args(3, [A,B,C], [A,B],A,C).
build_args(2, [A,B], [A],A,B). build_args(2, [A,B], [A],A,B).
@ -79,5 +77,3 @@ cvt_vals([A|B],[A|B]).
find_probs(Logs,Nth,Log) :- find_probs(Logs,Nth,Log) :-
arg(Nth,Logs,Log). arg(Nth,Logs,Log).

View File

@ -1,65 +1,56 @@
/******************************************************* /*******************************************************
Horus Interface Horus Interface
********************************************************/ ********************************************************/
:- module(clpbn_horus, :- module(clpbn_horus,
[set_solver/1, [set_horus_flag/2,
set_horus_flag/1, cpp_create_lifted_network/3,
cpp_create_lifted_network/3, cpp_create_ground_network/4,
cpp_create_ground_network/4, cpp_set_parfactors_params/3,
cpp_set_parfactors_params/2, cpp_set_factors_params/3,
cpp_set_factors_params/2, cpp_run_lifted_solver/3,
cpp_run_lifted_solver/3, cpp_run_ground_solver/3,
cpp_run_ground_solver/3, cpp_set_vars_information/2,
cpp_set_vars_information/2, cpp_set_horus_flag/2,
cpp_set_horus_flag/2, cpp_free_lifted_network/1,
cpp_free_lifted_network/1, cpp_free_ground_network/1
cpp_free_ground_network/1 ]).
]).
:- use_module(library(clpbn),
[set_clpbn_flag/2]).
patch_things_up :-
assert_static(clpbn_horus:cpp_set_horus_flag(_,_)).
warning :-
format(user_error,"Horus library not installed: cannot use bp, fove~n.",[]).
:- catch(load_foreign_files([horus], [], init_predicates), _, patch_things_up) :- catch(load_foreign_files([horus], [], init_predicates), _, patch_things_up)
-> true ; warning. -> true ; warning.
set_solver(ve) :- !, set_clpbn_flag(solver,ve). patch_things_up :-
set_solver(bdd) :- !, set_clpbn_flag(solver,bdd). assert_static(clpbn_horus:cpp_set_horus_flag(_,_)).
set_solver(jt) :- !, set_clpbn_flag(solver,jt).
set_solver(gibbs) :- !, set_clpbn_flag(solver,gibbs).
set_solver(lve) :- !, set_clpbn_flag(solver,fove), set_horus_flag(lifted_solver, lve). warning :-
set_solver(lbp) :- !, set_clpbn_flag(solver,fove), set_horus_flag(lifted_solver, lbp). format(user_error,"Horus library not installed: cannot use hve, bp, cbp, lve, lkc and lbp~n.",[]).
set_solver(lkc) :- !, set_clpbn_flag(solver,fove), set_horus_flag(lifted_solver, lkc).
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(cbp) :- !, set_clpbn_flag(solver,bp), set_horus_flag(ground_solver, cbp).
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).
:- cpp_set_horus_flag(schedule, seq_fixed). :- cpp_set_horus_flag(verbosity, 0).
%:- cpp_set_horus_flag(schedule, seq_random).
%:- cpp_set_horus_flag(schedule, parallel).
%:- cpp_set_horus_flag(schedule, max_residual).
:- cpp_set_horus_flag(accuracy, 0.0001). %:- cpp_set_horus_flag(use_logarithms, false).
:- cpp_set_horus_flag(use_logarithms, true).
:- cpp_set_horus_flag(max_iter, 1000). %:- cpp_set_horus_flag(hve_elim_heuristic, sequential).
%:- cpp_set_horus_flag(hve_elim_heuristic, min_neighbors).
%:- cpp_set_horus_flag(hve_elim_heuristic, min_weight).
%:- cpp_set_horus_flag(hve_elim_heuristic, min_fill).
:- cpp_set_horus_flag(hve_elim_heuristic, weighted_min_fill).
:- cpp_set_horus_flag(use_logarithms, false). :- cpp_set_horus_flag(bp_msg_schedule, seq_fixed).
% :- cpp_set_horus_flag(use_logarithms, true). %:- cpp_set_horus_flag(bp_msg_schedule, seq_random).
%:- cpp_set_horus_flag(bp_msg_schedule, parallel).
%:- cpp_set_horus_flag(bp_msg_schedule, max_residual).
:- cpp_set_horus_flag(bp_accuracy, 0.0001).
:- cpp_set_horus_flag(bp_max_iter, 1000).

View File

@ -1,102 +1,89 @@
/******************************************************* /*******************************************************
Interface to Horus Ground Solvers. Used by: Interface to Horus Ground Solvers. Used by:
- Variable Elimination - Variable Elimination
- Belief Propagation - Belief Propagation
- Counting Belief Propagation - Counting Belief Propagation
********************************************************/ ********************************************************/
:- module(clpbn_horus_ground, :- module(clpbn_horus_ground,
[call_horus_ground_solver/6, [call_horus_ground_solver/6,
check_if_horus_ground_solver_done/1, check_if_horus_ground_solver_done/1,
init_horus_ground_solver/5, init_horus_ground_solver/5,
run_horus_ground_solver/4, run_horus_ground_solver/3,
finalize_horus_ground_solver/1 end_horus_ground_solver/1
]). ]).
:- use_module(horus, :- use_module(horus,
[cpp_create_ground_network/4, [cpp_create_ground_network/4,
cpp_set_factors_params/2, cpp_set_factors_params/3,
cpp_run_ground_solver/3, cpp_run_ground_solver/3,
cpp_set_vars_information/2, cpp_free_ground_network/1,
cpp_free_ground_network/1, cpp_set_vars_information/2
set_solver/1 ]).
]).
:- use_module(library('clpbn/dists'), :- use_module(library('clpbn/numbers'),
[dist/4, [lists_of_keys_to_ids/6,
get_dist_domain/2, keys_to_numbers/7
get_dist_domain_size/2, ]).
get_dist_params/2
]).
:- use_module(library('clpbn/display'), :- use_module(library('clpbn/display'),
[clpbn_bind_vals/3]). [clpbn_bind_vals/3]).
:- use_module(library(clpbn/numbers)).
:- use_module(library(charsio),
[term_to_atom/2]).
:- use_module(library(pfl), :- use_module(library(pfl),
[skolem/2]). [get_pfl_parameters/2,
skolem/2
]).
:- use_module(library(charsio),
[term_to_atom/2]).
:- use_module(library(maplist)). :- use_module(library(maplist)).
:- use_module(library(lists)).
:- use_module(library(atts)). call_horus_ground_solver(QueryVars, QueryKeys, AllKeys, Factors, Evidence,
Output) :-
:- use_module(library(bhash)). init_horus_ground_solver(QueryKeys, AllKeys, Factors, Evidence, State),
run_horus_ground_solver([QueryKeys], Solutions, State),
clpbn_bind_vals([QueryVars], Solutions, Output),
end_horus_ground_solver(State).
call_horus_ground_solver(QueryVars, QueryKeys, AllKeys, Factors, Evidence, Output) :- init_horus_ground_solver(QueryKeys, AllKeys, Factors, Evidence,
init_horus_ground_solver(QueryKeys, AllKeys, Factors, Evidence, State), state(Network,Hash,Id,DistIds)) :-
run_solver(State, [QueryKeys], Solutions), factors_type(Factors, Type),
clpbn_bind_vals([QueryVars], Solutions, Output), keys_to_numbers(AllKeys, Factors, Evidence, Hash, Id, FacIds, EvIds),
finalize_horus_ground_solver(State). %writeln(network:(type=Type, factors=FacIds, evidence=EvIds)), nl,
cpp_create_ground_network(Type, FacIds, EvIds, Network),
%maplist(term_to_atom, AllKeys, VarNames),
%maplist(get_domain, AllKeys, Domains),
%cpp_set_vars_information(VarNames, Domains),
maplist(get_dist_id, FacIds, DistIds0),
sort(DistIds0, DistIds).
init_horus_ground_solver(QueryKeys, AllKeys, Factors, Evidence, state(Network,Hash4,Id4)) :- run_horus_ground_solver(QueryKeys, Solutions,
get_factors_type(Factors, Type), state(Network,Hash,Id, DistIds)) :-
keys_to_numbers(AllKeys, Factors, Evidence, Hash4, Id4, FactorIds, EvidenceIds), lists_of_keys_to_ids(QueryKeys, QueryIds, Hash, _, Id, _),
cpp_create_ground_network(Type, FactorIds, EvidenceIds, Network), %maplist(get_pfl_parameters, DistIds, DistParams),
%writeln(network:(Type, FactorIds, EvidenceIds, Network)), writeln(''), %cpp_set_factors_params(Network, DistIds, DistParams),
maplist(get_var_information, AllKeys, StatesNames), cpp_run_ground_solver(Network, QueryIds, Solutions).
maplist(term_to_atom, AllKeys, KeysAtoms),
cpp_set_vars_information(KeysAtoms, StatesNames).
run_horus_ground_solver(_QueryVars, Solutions, horus(GKeys, Keys, Factors, Evidence), Solver) :- end_horus_ground_solver(state(Network,_Hash,_Id, _DistIds)) :-
set_solver(Solver), cpp_free_ground_network(Network).
call_horus_ground_solver_for_probabilities(GKeys, Keys, Factors, Evidence, Solutions).
% TODO this is not beeing called! factors_type([f(bayes, _, _)|_], bayes) :- ! .
finalize_horus_ground_solver(state(Network,_Hash,_Id)) :- factors_type([f(markov, _, _)|_], markov) :- ! .
cpp_free_ground_network(Network).
run_solver(state(Network,Hash,Id), QueryKeys, Solutions) :- get_dist_id(f(_, _, _, DistId), DistId).
%get_dists_parameters(DistIds, DistsParams),
%cpp_set_factors_params(Network, DistsParams),
lists_of_keys_to_ids(QueryKeys, QueryIds, Hash, _, Id, _),
cpp_run_ground_solver(Network, QueryIds, Solutions).
get_factors_type([f(bayes, _, _)|_], bayes) :- ! . get_domain(_:Key, Domain) :- !,
get_factors_type([f(markov, _, _)|_], markov) :- ! . skolem(Key, Domain).
get_domain(Key, Domain) :-
skolem(Key, Domain).
get_var_information(_:Key, Domain) :- !,
skolem(Key, Domain).
get_var_information(Key, Domain) :-
skolem(Key, Domain).
%get_dists_parameters([],[]).
%get_dists_parameters([Id|Ids], [dist(Id, Params)|DistsInfo]) :-
% get_dist_params(Id, Params),
% get_dists_parameters(Ids, DistsInfo).

View File

@ -1,148 +1,115 @@
/******************************************************* /*******************************************************
Interface to Horus Lifted Solvers. Used by: Interface to Horus Lifted Solvers. Used by:
- Generalized Counting First-Order Variable Elimination (GC-FOVE) - Generalized Counting First-Order Variable Elimination (GC-FOVE)
- Lifted First-Order Belief Propagation - Lifted First-Order Belief Propagation
- Lifted First-Order Knowledge Compilation - Lifted First-Order Knowledge Compilation
********************************************************/ ********************************************************/
:- module(clpbn_horus_lifted, :- module(clpbn_horus_lifted,
[call_horus_lifted_solver/3, [call_horus_lifted_solver/3,
check_if_horus_lifted_solver_done/1, check_if_horus_lifted_solver_done/1,
init_horus_lifted_solver/4, init_horus_lifted_solver/4,
run_horus_lifted_solver/3, run_horus_lifted_solver/3,
finalize_horus_lifted_solver/1 end_horus_lifted_solver/1
]). ]).
:- use_module(horus, :- use_module(horus,
[cpp_create_lifted_network/3, [cpp_create_lifted_network/3,
cpp_set_parfactors_params/2, cpp_set_parfactors_params/3,
cpp_run_lifted_solver/3, cpp_run_lifted_solver/3,
cpp_free_lifted_network/1 cpp_free_lifted_network/1
]). ]).
:- use_module(library('clpbn/display'), :- use_module(library('clpbn/display'),
[clpbn_bind_vals/3]). [clpbn_bind_vals/3]).
:- use_module(library('clpbn/dists'),
[get_dist_params/2]).
:- use_module(library(pfl), :- use_module(library(pfl),
[factor/6, [factor/6,
skolem/2, skolem/2,
get_pfl_parameters/2 get_pfl_parameters/2
]). ]).
:- use_module(library(maplist)).
call_horus_lifted_solver(QueryVars, AllVars, Output) :- call_horus_lifted_solver(QueryVars, AllVars, Output) :-
init_horus_lifted_solver(_, AllVars, _, State), init_horus_lifted_solver(_, AllVars, _, State),
run_horus_lifted_solver(QueryVars, Solutions, State), run_horus_lifted_solver(QueryVars, Solutions, State),
clpbn_bind_vals(QueryVars, Solutions, Output), clpbn_bind_vals(QueryVars, Solutions, Output),
finalize_horus_lifted_solver(State). end_horus_lifted_solver(State).
init_horus_lifted_solver(_, AllVars, _, state(ParfactorList, DistIds)) :- init_horus_lifted_solver(_, AllVars, _, state(Network, DistIds)) :-
get_parfactors(Parfactors), get_parfactors(Parfactors),
get_dist_ids(Parfactors, DistIds0), get_observed_keys(AllVars, ObservedKeys),
sort(DistIds0, DistIds), %writeln(network:(parfactors=Parfactors, evidence=ObservedKeys)), nl,
get_observed_vars(AllVars, ObservedVars), cpp_create_lifted_network(Parfactors, ObservedKeys, Network),
%writeln(parfactors:Parfactors:'\n'), maplist(get_dist_id, Parfactors, DistIds0),
%writeln(evidence:ObservedVars:'\n'), sort(DistIds0, DistIds).
cpp_create_lifted_network(Parfactors, ObservedVars, ParfactorList).
run_horus_lifted_solver(QueryVars, Solutions, state(ParfactorList, DistIds)) :- run_horus_lifted_solver(QueryVars, Solutions, state(Network, DistIds)) :-
get_query_keys(QueryVars, QueryKeys), maplist(get_query_keys, QueryVars, QueryKeys),
get_dists_parameters(DistIds, DistsParams), %maplist(get_pfl_parameters, DistIds,DistsParams),
%writeln(dists:DistsParams), writeln(''), %cpp_set_parfactors_params(Network, DistIds, DistsParams),
cpp_set_parfactors_params(ParfactorList, DistsParams), cpp_run_lifted_solver(Network, QueryKeys, Solutions).
cpp_run_lifted_solver(ParfactorList, QueryKeys, Solutions).
finalize_horus_lifted_solver(state(ParfactorList, _)) :- end_horus_lifted_solver(state(Network, _)) :-
cpp_free_lifted_network(ParfactorList). cpp_free_lifted_network(Network).
%
% Enumerate all parfactors and enumerate their domain as tuples.
%
:- table get_parfactors/1. :- table get_parfactors/1.
%
% enumerate all parfactors and enumerate their domain as tuples.
%
% output is list of pf(
% Id: an unique number
% Ks: a list of keys, also known as the pf formula [a(X),b(Y),c(X,Y)]
% Vs: the list of free variables [X,Y]
% Phi: the table following usual CLP(BN) convention
% Tuples: ground bindings for variables in Vs, of the form [fv(x,y)]
%
get_parfactors(Factors) :- get_parfactors(Factors) :-
findall(F, is_factor(F), Factors). findall(F, is_factor(F), Factors).
is_factor(pf(Id, Ks, Rs, Phi, Tuples)) :- is_factor(pf(Id, Ks, Rs, Phi, Tuples)) :-
factor(_Type, Id, Ks, Vs, Table, Constraints), factor(_Type, Id, Ks, Vs, Table, Constraints),
get_ranges(Ks,Rs), maplist(get_range, Ks, Rs),
Table \= avg, Table \= avg,
gen_table(Table, Phi), gen_table(Table, Phi),
all_tuples(Constraints, Vs, Tuples). all_tuples(Constraints, Vs, Tuples).
get_ranges([],[]). get_range(K, Range) :-
get_ranges(K.Ks, Range.Rs) :- !, skolem(K, Domain),
skolem(K,Domain), length(Domain, Range).
length(Domain,Range),
get_ranges(Ks, Rs).
gen_table(Table, Phi) :- gen_table(Table, Phi) :-
( is_list(Table) ( is_list(Table) -> Phi = Table ; call(user:Table, Phi) ).
->
Phi = Table
;
call(user:Table, Phi)
).
all_tuples(Constraints, Tuple, Tuples) :- all_tuples(Constraints, Tuple, Tuples) :-
setof(Tuple, Constraints^run(Constraints), Tuples). setof(Tuple, Constraints^run(Constraints), Tuples).
run([]). run([]).
run(Goal.Constraints) :- run(Goal.Constraints) :-
user:Goal, user:Goal,
run(Constraints). run(Constraints).
get_dist_ids([], []). get_dist_id(pf(DistId, _, _, _, _), DistId).
get_dist_ids(pf(Id, _, _, _, _).Parfactors, Id.DistIds) :-
get_dist_ids(Parfactors, DistIds).
get_observed_vars([], []). get_observed_keys([], []).
get_observed_vars(V.AllAttVars, [K:E|ObservedVars]) :- get_observed_keys(V.AllAttVars, [K:E|ObservedKeys]) :-
clpbn:get_atts(V,[key(K)]), clpbn:get_atts(V,[key(K)]),
( clpbn:get_atts(V,[evidence(E)]) ; pfl:evidence(K,E) ), !, ( clpbn:get_atts(V,[evidence(E)]) ; pfl:evidence(K,E) ), !,
get_observed_vars(AllAttVars, ObservedVars). get_observed_keys(AllAttVars, ObservedKeys).
get_observed_vars(V.AllAttVars, ObservedVars) :- get_observed_keys(_V.AllAttVars, ObservedKeys) :-
clpbn:get_atts(V,[key(_K)]), !, get_observed_keys(AllAttVars, ObservedKeys).
get_observed_vars(AllAttVars, ObservedVars).
get_query_keys([], []). get_query_keys([], []).
get_query_keys(E1.L1, E2.L2) :- get_query_keys(V.AttVars, K.Ks) :-
get_query_keys_2(E1,E2), clpbn:get_atts(V,[key(K)]), !,
get_query_keys(L1, L2). get_query_keys(AttVars, Ks).
get_query_keys_2([], []).
get_query_keys_2(V.AttVars, [RV|RVs]) :-
clpbn:get_atts(V,[key(RV)]), !,
get_query_keys_2(AttVars, RVs).
get_dists_parameters([], []).
get_dists_parameters([Id|Ids], [dist(Id, Params)|DistsInfo]) :-
get_pfl_parameters(Id, Params),
get_dists_parameters(Ids, DistsInfo).

View File

@ -1,89 +1,93 @@
:- module(jt, [jt/3, :- module(jt,
init_jt_solver/4, [jt/3,
run_jt_solver/3]). init_jt_solver/4,
run_jt_solver/3
]).
:- use_module(library(dgraphs), :- use_module(library(dgraphs),
[dgraph_new/1, [dgraph_new/1,
dgraph_add_edges/3, dgraph_add_edges/3,
dgraph_add_vertex/3, dgraph_add_vertex/3,
dgraph_add_vertices/3, dgraph_add_vertices/3,
dgraph_edges/2, dgraph_edges/2,
dgraph_vertices/2, dgraph_vertices/2,
dgraph_transpose/2, dgraph_transpose/2,
dgraph_to_ugraph/2, dgraph_to_ugraph/2,
ugraph_to_dgraph/2, ugraph_to_dgraph/2,
dgraph_neighbors/3 dgraph_neighbors/3
]). ]).
:- use_module(library(undgraphs), :- use_module(library(undgraphs),
[undgraph_new/1, [undgraph_new/1,
undgraph_add_edge/4, undgraph_add_edge/4,
undgraph_add_edges/3, undgraph_add_edges/3,
undgraph_del_vertex/3, undgraph_del_vertex/3,
undgraph_del_vertices/3, undgraph_del_vertices/3,
undgraph_vertices/2, undgraph_vertices/2,
undgraph_edges/2, undgraph_edges/2,
undgraph_neighbors/3, undgraph_neighbors/3,
undgraph_edge/3, undgraph_edge/3,
dgraph_to_undgraph/2 dgraph_to_undgraph/2
]). ]).
:- use_module(library(wundgraphs), :- use_module(library(wundgraphs),
[wundgraph_new/1, [wundgraph_new/1,
wundgraph_max_tree/3, wundgraph_max_tree/3,
wundgraph_add_edges/3, wundgraph_add_edges/3,
wundgraph_add_vertices/3, wundgraph_add_vertices/3,
wundgraph_to_undgraph/2 wundgraph_to_undgraph/2
]). ]).
:- use_module(library(rbtrees), :- use_module(library(rbtrees),
[rb_new/1, [rb_new/1,
rb_insert/4, rb_insert/4,
rb_lookup/3]). rb_lookup/3
]).
:- use_module(library(ordsets), :- use_module(library(ordsets),
[ord_subset/2, [ord_subset/2,
ord_insert/3, ord_insert/3,
ord_intersection/3, ord_intersection/3,
ord_del_element/3, ord_del_element/3,
ord_memberchk/2]). ord_memberchk/2
]).
:- use_module(library(lists), :- use_module(library(lists),
[reverse/2]). [reverse/2]).
:- use_module(library(maplist)). :- use_module(library(maplist)).
:- use_module(library('clpbn/aggregates'), :- use_module(library('clpbn/aggregates'),
[check_for_agg_vars/2]). [check_for_agg_vars/2]).
:- use_module(library('clpbn/dists'), :- use_module(library('clpbn/dists'),
[get_dist_domain_size/2, [get_dist_domain_size/2,
get_dist_domain/2, get_dist_domain/2,
get_dist_matrix/5]). get_dist_matrix/5
]).
:- use_module(library('clpbn/matrix_cpt_utils'), :- use_module(library('clpbn/matrix_cpt_utils'),
[project_from_CPT/3, [project_from_CPT/3,
reorder_CPT/5, reorder_CPT/5,
unit_CPT/2, unit_CPT/2,
multiply_CPTs/4, multiply_CPTs/4,
divide_CPTs/3, divide_CPTs/3,
normalise_CPT/2, normalise_CPT/2,
expand_CPT/4, expand_CPT/4,
get_CPT_sizes/2, get_CPT_sizes/2,
reset_CPT_that_disagrees/5, reset_CPT_that_disagrees/5,
sum_out_from_CPT/4, sum_out_from_CPT/4,
list_from_CPT/2]). list_from_CPT/2
]).
:- use_module(library('clpbn/display'), [ :- use_module(library('clpbn/display'),
clpbn_bind_vals/3]). [clpbn_bind_vals/3]).
:- use_module(library('clpbn/connected'), :- use_module(library('clpbn/connected'),
[ [init_influences/3,
init_influences/3, influences/4
influences/4 ]).
]).
jt([[]],_,_) :- !. jt([[]],_,_) :- !.
@ -94,7 +98,7 @@ jt(LLVs,Vs0,AllDiffs) :-
init_jt_solver(LLVs, Vs0, _, State) :- init_jt_solver(LLVs, Vs0, _, State) :-
check_for_agg_vars(Vs0, Vs1), check_for_agg_vars(Vs0, Vs1),
init_influences(Vs1, G, RG), init_influences(Vs1, G, RG),
maplist(init_jt_solver_for_question(G, RG), LLVs, State). maplist(init_jt_solver_for_question(G, RG), LLVs, State).
@ -131,7 +135,7 @@ run_vars([V|LVs], Edges, [V|Vs], [CPTVars-dist([V|Parents],Id)|CPTs], Ev) :-
add_evidence_from_vars(V, [e(V,P)|Evs], Evs) :- add_evidence_from_vars(V, [e(V,P)|Evs], Evs) :-
clpbn:get_atts(V, [evidence(P)]), !. clpbn:get_atts(V, [evidence(P)]), !.
add_evidence_from_vars(_, Evs, Evs). add_evidence_from_vars(_, Evs, Evs).
find_nth0([Id|_], Id, P, P) :- !. find_nth0([Id|_], Id, P, P) :- !.
find_nth0([_|D], Id, P0, P) :- find_nth0([_|D], Id, P0, P) :-
P1 is P0+1, P1 is P0+1,
@ -159,7 +163,7 @@ initial_graph(_,Parents, CPTs) :-
% from the very beginning. % from the very beginning.
dgraph_transpose(V1, V2), dgraph_transpose(V1, V2),
dgraph_to_ugraph(V2, Parents). dgraph_to_ugraph(V2, Parents).
problem_graph([], []). problem_graph([], []).
problem_graph([V|BNet], GraphF) :- problem_graph([V|BNet], GraphF) :-
@ -171,7 +175,7 @@ add_parents([], _, Graph, Graph).
add_parents([P|Parents], V, Graph0, [P-V|GraphF]) :- add_parents([P|Parents], V, Graph0, [P-V|GraphF]) :-
add_parents(Parents, V, Graph0, GraphF). add_parents(Parents, V, Graph0, GraphF).
% From David Page's lectures % From David Page's lectures
test_graph(0, test_graph(0,
[1-3,2-3,2-4,5-4,5-7,10-7,10-9,11-9,3-6,4-6,7-8,9-8,6-12,8-12], [1-3,2-3,2-4,5-4,5-7,10-7,10-9,11-9,3-6,4-6,7-8,9-8,6-12,8-12],
@ -228,19 +232,19 @@ choose([V|Vertices], Graph, Score0, _, _, Best, _, Cliques0, Cliques, EdgesF) :-
ord_insert(Neighbors, V, PossibleClique), ord_insert(Neighbors, V, PossibleClique),
new_edges(Neighbors, Graph, NewEdges), new_edges(Neighbors, Graph, NewEdges),
( (
% simplicial edge % simplicial edge
NewEdges == [] NewEdges == []
-> ->
!, !,
Best = V, Best = V,
NewEdges = EdgesF, NewEdges = EdgesF,
length(PossibleClique,L), length(PossibleClique,L),
Cliques = [L-PossibleClique|Cliques0] Cliques = [L-PossibleClique|Cliques0]
; ;
% cliquelength(PossibleClique,1,CL), % cliquelength(PossibleClique,1,CL),
length(PossibleClique,CL), length(PossibleClique,CL),
CL < Score0, !, CL < Score0, !,
choose(Vertices,Graph,CL,NewEdges, V, Best, CL-PossibleClique, Cliques0,Cliques,EdgesF) choose(Vertices,Graph,CL,NewEdges, V, Best, CL-PossibleClique, Cliques0,Cliques,EdgesF)
). ).
choose([_|Vertices], Graph, Score0, Edges0, BestSoFar, Best, Clique, Cliques0, Cliques, EdgesF) :- choose([_|Vertices], Graph, Score0, Edges0, BestSoFar, Best, Clique, Cliques0, Cliques, EdgesF) :-
choose(Vertices,Graph,Score0,Edges0, BestSoFar, Best, Clique, Cliques0,Cliques,EdgesF). choose(Vertices,Graph,Score0,Edges0, BestSoFar, Best, Clique, Cliques0,Cliques,EdgesF).
@ -285,18 +289,17 @@ get_links([Sz-Clique|Cliques], SoFar, Vertices, Edges0, Edges) :-
get_links(Cliques, [Clique|SoFar], Vertices, EdgesI, Edges). get_links(Cliques, [Clique|SoFar], Vertices, EdgesI, Edges).
get_links([_|Cliques], SoFar, Vertices, Edges0, Edges) :- get_links([_|Cliques], SoFar, Vertices, Edges0, Edges) :-
get_links(Cliques, SoFar, Vertices, Edges0, Edges). get_links(Cliques, SoFar, Vertices, Edges0, Edges).
add_clique_edges([], _, _, Edges, Edges). add_clique_edges([], _, _, Edges, Edges).
add_clique_edges([Clique1|Cliques], Clique, Sz, Edges0, EdgesF) :- add_clique_edges([Clique1|Cliques], Clique, Sz, Edges0, EdgesF) :-
ord_intersection(Clique1, Clique, Int), ord_intersection(Clique1, Clique, Int),
Int \== Clique, Int \== Clique,
( (Int = [] ->
Int = [] -> add_clique_edges(Cliques, Clique, Sz, Edges0, EdgesF)
add_clique_edges(Cliques, Clique, Sz, Edges0, EdgesF)
; ;
% we connect % we connect
length(Int, LSz), length(Int, LSz),
add_clique_edges(Cliques, Clique, Sz, [Clique-(Clique1-LSz)|Edges0], EdgesF) add_clique_edges(Cliques, Clique, Sz, [Clique-(Clique1-LSz)|Edges0], EdgesF)
). ).
root(WTree, JTree) :- root(WTree, JTree) :-
@ -358,25 +361,25 @@ get_cpts([], _, [], []).
get_cpts([CPT|CPts], [], [], [CPT|CPts]) :- !. get_cpts([CPT|CPts], [], [], [CPT|CPts]) :- !.
get_cpts([[I|MCPT]-Info|CPTs], [J|Clique], MyCPTs, MoreCPTs) :- get_cpts([[I|MCPT]-Info|CPTs], [J|Clique], MyCPTs, MoreCPTs) :-
compare(C,I,J), compare(C,I,J),
( C == < -> (C == < ->
% our CPT cannot be a part of the clique. % our CPT cannot be a part of the clique.
MoreCPTs = [[I|MCPT]-Info|LeftoverCPTs], MoreCPTs = [[I|MCPT]-Info|LeftoverCPTs],
get_cpts(CPTs, [J|Clique], MyCPTs, LeftoverCPTs) get_cpts(CPTs, [J|Clique], MyCPTs, LeftoverCPTs)
; ;
C == = -> C == = ->
% our CPT cannot be a part of the clique. % our CPT cannot be a part of the clique.
get_cpt(MCPT, Clique, I, Info, MyCPTs, MyCPTs0, MoreCPTs, MoreCPTs0), get_cpt(MCPT, Clique, I, Info, MyCPTs, MyCPTs0, MoreCPTs, MoreCPTs0),
get_cpts(CPTs, [J|Clique], MyCPTs0, MoreCPTs0) get_cpts(CPTs, [J|Clique], MyCPTs0, MoreCPTs0)
; ;
% the first element in our CPT may not be in a clique % the first element in our CPT may not be in a clique
get_cpts([[I|MCPT]-Info|CPTs], Clique, MyCPTs, MoreCPTs) get_cpts([[I|MCPT]-Info|CPTs], Clique, MyCPTs, MoreCPTs)
). ).
get_cpt(MCPT, Clique, I, Info, [[I|MCPT]-Info|MyCPTs], MyCPTs, MoreCPTs, MoreCPTs) :- get_cpt(MCPT, Clique, I, Info, [[I|MCPT]-Info|MyCPTs], MyCPTs, MoreCPTs, MoreCPTs) :-
ord_subset(MCPT, Clique), !. ord_subset(MCPT, Clique), !.
get_cpt(MCPT, _, I, Info, MyCPTs, MyCPTs, [[I|MCPT]-Info|MoreCPTs], MoreCPTs). get_cpt(MCPT, _, I, Info, MyCPTs, MyCPTs, [[I|MCPT]-Info|MoreCPTs], MoreCPTs).
translate_edges([], [], []). translate_edges([], [], []).
translate_edges([E1-E2|Edges], [(E1-A)-(E2-B)|NEdges], [E1-A,E2-B|Vs]) :- translate_edges([E1-E2|Edges], [(E1-A)-(E2-B)|NEdges], [E1-A,E2-B|Vs]) :-
translate_edges(Edges, NEdges, Vs). translate_edges(Edges, NEdges, Vs).
@ -385,13 +388,13 @@ match_vs(_,[]).
match_vs([K-A|Cls],[K1-B|KVs]) :- match_vs([K-A|Cls],[K1-B|KVs]) :-
compare(C, K, K1), compare(C, K, K1),
(C == = -> (C == = ->
A = B, A = B,
match_vs([K-A|Cls], KVs) match_vs([K-A|Cls], KVs)
; ;
C = < -> C = < ->
match_vs(Cls,[K1-B|KVs]) match_vs(Cls,[K1-B|KVs])
; ;
match_vs([K-A|Cls],KVs) match_vs([K-A|Cls],KVs)
). ).
fill_with_cpts(tree(Clique-Dists,Leafs), tree(Clique-NewDists,NewLeafs)) :- fill_with_cpts(tree(Clique-Dists,Leafs), tree(Clique-NewDists,NewLeafs)) :-

View File

@ -1,51 +1,54 @@
:- module(clpbn_matrix_utils, :- module(clpbn_matrix_utils,
[init_CPT/3, [init_CPT/3,
project_from_CPT/3, project_from_CPT/3,
sum_out_from_CPT/5, sum_out_from_CPT/5,
project_from_CPT/6, project_from_CPT/6,
reorder_CPT/5, reorder_CPT/5,
get_CPT_sizes/2, get_CPT_sizes/2,
normalise_CPT/2, normalise_CPT/2,
multiply_CPTs/4, multiply_CPTs/4,
multiply_CPTs/6, multiply_CPTs/6,
divide_CPTs/3, divide_CPTs/3,
expand_CPT/4, expand_CPT/4,
reset_CPT_that_disagrees/5, reset_CPT_that_disagrees/5,
unit_CPT/2, unit_CPT/2,
sum_out_from_CPT/4, sum_out_from_CPT/4,
list_from_CPT/2, list_from_CPT/2,
multiply_factors/3, multiply_factors/3,
normalise_possibly_deterministic_CPT/2, normalise_possibly_deterministic_CPT/2,
column_from_possibly_deterministic_CPT/3, column_from_possibly_deterministic_CPT/3,
multiply_possibly_deterministic_factors/3, multiply_possibly_deterministic_factors/3,
random_CPT/2, random_CPT/2,
uniform_CPT/2, uniform_CPT/2,
uniform_CPT_as_list/2, uniform_CPT_as_list/2,
normalise_CPT_on_lines/3]). normalise_CPT_on_lines/3
]).
:- use_module(library(matrix), :- use_module(library(matrix),
[matrix_new/4, [matrix_new/4,
matrix_new_set/4, matrix_new_set/4,
matrix_select/4, matrix_select/4,
matrix_dims/2, matrix_dims/2,
matrix_size/2, matrix_size/2,
matrix_shuffle/3, matrix_shuffle/3,
matrix_expand/3, matrix_expand/3,
matrix_op/4, matrix_op/4,
matrix_dims/2, matrix_dims/2,
matrix_sum/2, matrix_sum/2,
matrix_sum_logs_out/3, matrix_sum_logs_out/3,
matrix_sum_out/3, matrix_sum_out/3,
matrix_sum_logs_out_several/3, matrix_sum_logs_out_several/3,
matrix_op_to_all/4, matrix_op_to_all/4,
matrix_to_exps2/1, matrix_to_exps2/1,
matrix_to_logs/1, matrix_to_logs/1,
matrix_set_all_that_disagree/5, matrix_set_all_that_disagree/5,
matrix_to_list/2, matrix_to_list/2,
matrix_agg_lines/3, matrix_agg_lines/3,
matrix_agg_cols/3, matrix_agg_cols/3,
matrix_op_to_lines/4, matrix_op_to_lines/4,
matrix_column/3]). matrix_column/3
]).
init_CPT(List, Sizes, TAB) :- init_CPT(List, Sizes, TAB) :-
matrix_new(floats, Sizes, List, TAB), matrix_new(floats, Sizes, List, TAB),
@ -84,7 +87,7 @@ evidence(V, Pos) :-
clpbn:get_atts(V, [evidence(Pos)]). clpbn:get_atts(V, [evidence(Pos)]).
vnth([V1|Deps], N, V, N, Deps) :- vnth([V1|Deps], N, V, N, Deps) :-
V == V1, !. V == V1, !.
vnth([V1|Deps], N0, V, N, [V1|NDeps]) :- vnth([V1|Deps], N0, V, N, [V1|NDeps]) :-
N1 is N0+1, N1 is N0+1,
vnth(Deps, N1, V, N, NDeps). vnth(Deps, N1, V, N, NDeps).
@ -93,21 +96,21 @@ reorder_CPT(Vs0,T0,Vs,TF,Sizes) :-
var(Vs), !, var(Vs), !,
order_vec(Vs0,Vs,Map), order_vec(Vs0,Vs,Map),
( (
Vs == Vs0 Vs == Vs0
-> ->
TF = T0 TF = T0
; ;
matrix_shuffle(T0,Map,TF) matrix_shuffle(T0,Map,TF)
), ),
matrix_dims(TF, Sizes). matrix_dims(TF, Sizes).
reorder_CPT(Vs0,T0,Vs,TF,Sizes) :- reorder_CPT(Vs0,T0,Vs,TF,Sizes) :-
mapping(Vs0,Vs,Map), mapping(Vs0,Vs,Map),
( (
Vs == Vs0 Vs == Vs0
-> ->
TF = T0 TF = T0
; ;
matrix_shuffle(T0,Map,TF) matrix_shuffle(T0,Map,TF)
), ),
matrix_dims(TF, Sizes). matrix_dims(TF, Sizes).
@ -124,7 +127,7 @@ add_indices([V|Vs0],I0,[V-I0|Is]) :-
get_els([], [], []). get_els([], [], []).
get_els([V-I|NIs], [V|Vs], [I|Map]) :- get_els([V-I|NIs], [V|Vs], [I|Map]) :-
get_els(NIs, Vs, Map). get_els(NIs, Vs, Map).
mapping(Vs0,Vs,Map) :- mapping(Vs0,Vs,Map) :-
add_indices(Vs0,0,I1s), add_indices(Vs0,0,I1s),
add_indices( Vs,I2s), add_indices( Vs,I2s),
@ -167,26 +170,26 @@ expand_tabs([], [], [V2|Deps2], [S2|Sz2], [S2|Map1], [0|Map2], [V2|NDeps]) :-
expand_tabs([V1|Deps1], [S1|Sz1], [V2|Deps2], [S2|Sz2], Map1, Map2, NDeps) :- expand_tabs([V1|Deps1], [S1|Sz1], [V2|Deps2], [S2|Sz2], Map1, Map2, NDeps) :-
compare(C,V1,V2), compare(C,V1,V2),
(C == = -> (C == = ->
NDeps = [V1|MDeps], NDeps = [V1|MDeps],
Map1 = [0|M1], Map1 = [0|M1],
Map2 = [0|M2], Map2 = [0|M2],
NDeps = [V1|MDeps], NDeps = [V1|MDeps],
expand_tabs(Deps1, Sz1, Deps2, Sz2, M1, M2, MDeps) expand_tabs(Deps1, Sz1, Deps2, Sz2, M1, M2, MDeps)
; ;
C == < -> C == < ->
NDeps = [V1|MDeps], NDeps = [V1|MDeps],
Map1 = [0|M1], Map1 = [0|M1],
Map2 = [S1|M2], Map2 = [S1|M2],
NDeps = [V1|MDeps], NDeps = [V1|MDeps],
expand_tabs(Deps1, Sz1, [V2|Deps2], [S2|Sz2], M1, M2, MDeps) expand_tabs(Deps1, Sz1, [V2|Deps2], [S2|Sz2], M1, M2, MDeps)
; ;
NDeps = [V2|MDeps], NDeps = [V2|MDeps],
Map1 = [S2|M1], Map1 = [S2|M1],
Map2 = [0|M2], Map2 = [0|M2],
NDeps = [V2|MDeps], NDeps = [V2|MDeps],
expand_tabs([V1|Deps1], [S1|Sz1], Deps2, Sz2, M1, M2, MDeps) expand_tabs([V1|Deps1], [S1|Sz1], Deps2, Sz2, M1, M2, MDeps)
). ).
normalise_CPT(MAT,NMAT) :- normalise_CPT(MAT,NMAT) :-
matrix_to_exps2(MAT), matrix_to_exps2(MAT),
matrix_sum(MAT, Sum), matrix_sum(MAT, Sum),
@ -204,9 +207,9 @@ generate_map([V|DimsNew], [V0|Dims0], [0|Map]) :- V == V0, !,
generate_map(DimsNew, Dims0, Map). generate_map(DimsNew, Dims0, Map).
generate_map([V|DimsNew], Dims0, [Sz|Map]) :- generate_map([V|DimsNew], Dims0, [Sz|Map]) :-
clpbn:get_atts(V, [dist(Id,_)]), clpbn:get_atts(V, [dist(Id,_)]),
clpbn_dist:get_dist_domain_size(Id, Sz), clpbn_dist:get_dist_domain_size(Id, Sz),
generate_map(DimsNew, Dims0, Map). generate_map(DimsNew, Dims0, Map).
unit_CPT(V,CPT) :- unit_CPT(V,CPT) :-
clpbn:get_atts(V, [dist(Id,_)]), clpbn:get_atts(V, [dist(Id,_)]),
clpbn_dist:get_dist_domain_size(Id, Sz), clpbn_dist:get_dist_domain_size(Id, Sz),
@ -284,7 +287,7 @@ uniform_CPT(Dims, M) :-
normalise_possibly_deterministic_CPT(M1, M). normalise_possibly_deterministic_CPT(M1, M).
normalise_CPT_on_lines(MAT0, MAT2, L1) :- normalise_CPT_on_lines(MAT0, MAT2, L1) :-
matrix_agg_cols(MAT0, +, MAT1), matrix_agg_cols(MAT0, +, MAT1),
matrix_sum(MAT1, SUM), matrix_sum(MAT1, SUM),
matrix_op_to_all(MAT1, /, SUM, MAT2), matrix_op_to_all(MAT1, /, SUM, MAT2),
matrix:matrix_to_list(MAT2,L1). matrix:matrix_to_list(MAT2,L1).

View File

@ -1,17 +1,17 @@
:- module(clpbn_numbers, :- module(clpbn_numbers,
[ [keys_to_numbers/7,
keys_to_numbers/7, keys_to_numbers/9,
keys_to_numbers/9, lists_of_keys_to_ids/6
lists_of_keys_to_ids/6 ]).
]).
:- use_module(library(bhash)). :- use_module(library(bhash)).
:- use_module(library(maplist)). :- use_module(library(maplist)).
:- use_module(library(pfl), :- use_module(library(pfl),
[skolem/2, [skolem/2,
get_pfl_cpt/5 get_pfl_cpt/5
]). ]).
% %
% convert key representation into numeric representation % convert key representation into numeric representation
@ -30,16 +30,16 @@ keys_to_numbers(AllKeys, Factors, Evidence, Hash0, Hash4, Id0, Id4, FactorIds, E
foldl2(key_to_id, SKeys, _, Hash3, Hash4, Id3, Id4). foldl2(key_to_id, SKeys, _, Hash3, Hash4, Id3, Id4).
lists_of_keys_to_ids(QueryKeys, QueryIds, Hash0, Hash, Id0, Id) :- lists_of_keys_to_ids(QueryKeys, QueryIds, Hash0, Hash, Id0, Id) :-
foldl2(list_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) :- list_of_keys_to_ids(List, IdList, Hash0, Hash, I0, I) :-
foldl2(key_to_id, 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) :- key_to_id(Key, Id, Hash0, Hash0, I0, I0) :-
b_hash_lookup(Key, Id, Hash0), !. b_hash_lookup(Key, Id, Hash0), !.
key_to_id(Key, I0, Hash0, Hash, I0, I) :- key_to_id(Key, I0, Hash0, Hash, I0, I) :-
b_hash_insert(Hash0, Key, I0, Hash), b_hash_insert(Hash0, Key, I0, Hash),
I is I0+1. I is I0+1.
factor_to_id(Ev, f(_, DistId, Keys), f(Ids, Ranges, CPT, DistId), Hash0, Hash, I0, I) :- factor_to_id(Ev, f(_, DistId, Keys), f(Ids, Ranges, CPT, DistId), Hash0, Hash, I0, I) :-
get_pfl_cpt(DistId, Keys, Ev, NKeys, CPT), get_pfl_cpt(DistId, Keys, Ev, NKeys, CPT),
@ -60,4 +60,3 @@ evidence_to_id(Key=Ev, I0=Ev, Hash0, Hash, I0, I) :-
b_hash_insert(Hash0, Key, I0, Hash), b_hash_insert(Hash0, Key, I0, Hash),
I is I0+1. I is I0+1.

View File

@ -2,30 +2,29 @@
:- style_check(all). :- style_check(all).
:- module(clpbn_pgrammar,[grammar_to_atts/1, :- module(clpbn_pgrammar,
grammar_prob/2, [grammar_to_atts/1,
grammar_mle/2, grammar_prob/2,
init_pcg_solver/4, grammar_mle/2,
run_pcg_solver/3, init_pcg_solver/4,
pcg_init_graph/0]). run_pcg_solver/3,
pcg_init_graph/0
]).
:- load_files([library(clpbn)], :- load_files([library(clpbn)],
[ if(not_loaded), [if(not_loaded), silent(true)]).
silent(true)
]).
:- use_module([library(lists)], :- use_module([library(lists)],
[ sum_list/2 [sum_list/2]).
]).
:- use_module([library(matrix)], :- use_module([library(matrix)],
[ matrix_new/3, [matrix_new/3,
matrix_add/3, matrix_add/3,
matrix_get/3, matrix_get/3,
matrix_op/4, matrix_op/4,
matrix_op_to_all/4, matrix_op_to_all/4,
matrix_set_all/2 matrix_set_all/2
]). ]).
:- op(600, xfy,'::'). :- op(600, xfy,'::').
@ -71,9 +70,9 @@ grammar_mle(S,_,P) :-
nb_getval(best,p(P,S)), P > 0.0. nb_getval(best,p(P,S)), P > 0.0.
user:term_expansion((P::H --> B), Goal) :- user:term_expansion((P::H --> B), Goal) :-
functor(H,A0,_), functor(H,A0,_),
% a-->b to a(p(K,P,C,[Cs])) --> b(Cs) % a-->b to a(p(K,P,C,[Cs])) --> b(Cs)
convert_to_internal(H, B, IH, IB, Id), convert_to_internal(H, B, IH, IB, Id),
expand_term((IH --> IB),(NH :- NB)), expand_term((IH --> IB),(NH :- NB)),
prolog_load_context(module, Mod), prolog_load_context(module, Mod),
functor(NH,N,A), functor(NH,N,A),
@ -99,8 +98,8 @@ add_to_predicate(M:EH1,M:EH,M:H0,NH,NB,Key,Choice,P,Id,(EH1:-NB)) :-
% now ensure_tabled works. % now ensure_tabled works.
ensure_tabled(M,H0,EH), ensure_tabled(M,H0,EH),
assert_static(M:(EH :- assert_static(M:(EH :-
clpbn_pgrammar:p_rule(M,EH,Key,Choice), clpbn_pgrammar:p_rule(M,EH,Key,Choice),
M:EH1)), M:EH1)),
Choice = 1, Choice = 1,
new_id(Key,P,Choice,Id), new_id(Key,P,Choice,Id),
assert_static(M:ptab(EH,Choice,P)), assert_static(M:ptab(EH,Choice,P)),
@ -140,18 +139,18 @@ convert_body_to_internal({A}, {A}) --> !.
convert_body_to_internal(B, IB) --> convert_body_to_internal(B, IB) -->
[V], [V],
{ {
B =.. [Na|Args], B =.. [Na|Args],
build_internal(Na,NaInternal), build_internal(Na,NaInternal),
IB =.. [NaInternal,V|Args] IB =.. [NaInternal,V|Args]
}. }.
new_id(Key,P,Choice,Id) :- new_id(Key,P,Choice,Id) :-
( (
predicate_property(id(_,_,_,_),number_of_clauses(Id)) predicate_property(id(_,_,_,_),number_of_clauses(Id))
-> ->
true true
; ;
Id = 0 Id = 0
), ),
assert(id(Id,Key,P,Choice)). assert(id(Id,Key,P,Choice)).
@ -177,7 +176,7 @@ get_internal(S, InternalS, Arg) :-
extract_probability(p(Id,Goals), P) :- extract_probability(p(Id,Goals), P) :-
id(Id,_,P0,_), id(Id,_,P0,_),
LogP0 is log(P0), LogP0 is log(P0),
extract_logprobability(Goals, LogP0, LogP), extract_logprobability(Goals, LogP0, LogP),
P is exp(LogP). P is exp(LogP).
@ -211,11 +210,11 @@ path_choices(InternalS, Proof) :-
new_id(Id) :- new_id(Id) :-
(nb_getval(grammar_id,Id) -> (nb_getval(grammar_id,Id) ->
I1 is Id+1, I1 is Id+1,
nb_setval(grammar_id,I1) nb_setval(grammar_id,I1)
; ;
nb_setval(grammar_id,1), nb_setval(grammar_id,1),
Id = 0 Id = 0
). ).
find_dom(K, Vs, Ps) :- find_dom(K, Vs, Ps) :-

View File

@ -8,49 +8,49 @@
*/ */
:- module(clpbn_table, :- module(clpbn_table,
[clpbn_table/1, [clpbn_table/1,
clpbn_tableallargs/1, clpbn_tableallargs/1,
clpbn_table_nondet/1, clpbn_table_nondet/1,
clpbn_tabled_clause/2, clpbn_tabled_clause/2,
clpbn_tabled_clause_ref/3, clpbn_tabled_clause_ref/3,
clpbn_tabled_retract/2, clpbn_tabled_retract/2,
clpbn_tabled_abolish/1, clpbn_tabled_abolish/1,
clpbn_tabled_asserta/1, clpbn_tabled_asserta/1,
clpbn_tabled_assertz/1, clpbn_tabled_assertz/1,
clpbn_tabled_asserta/2, clpbn_tabled_asserta/2,
clpbn_tabled_assertz/2, clpbn_tabled_assertz/2,
clpbn_tabled_dynamic/1, clpbn_tabled_dynamic/1,
clpbn_tabled_number_of_clauses/2, clpbn_tabled_number_of_clauses/2,
clpbn_reset_tables/0, clpbn_reset_tables/0,
clpbn_reset_tables/1, clpbn_reset_tables/1,
clpbn_is_tabled/1 clpbn_is_tabled/1
]). ]).
:- use_module(library(bhash), :- use_module(library(bhash),
[b_hash_new/4, [b_hash_new/4,
b_hash_lookup/3, b_hash_lookup/3,
b_hash_insert/4]). b_hash_insert/4
]).
:- meta_predicate clpbn_table(:), :- meta_predicate clpbn_table(:),
clpbn_tabled_clause(:.?), clpbn_tabled_clause(:.?),
clpbn_tabled_clause_ref(:.?,?), clpbn_tabled_clause_ref(:.?,?),
clpbn_tabled_retract(:), clpbn_tabled_retract(:),
clpbn_tabled_abolish(:), clpbn_tabled_abolish(:),
clpbn_tabled_asserta(:), clpbn_tabled_asserta(:),
clpbn_tabled_assertz(:), clpbn_tabled_assertz(:),
clpbn_tabled_asserta(:,-), clpbn_tabled_asserta(:,-),
clpbn_tabled_assertz(:,-), clpbn_tabled_assertz(:,-),
clpbn_tabled_number_of_clauses(:,-), clpbn_tabled_number_of_clauses(:,-),
clpbn_is_tabled(:). clpbn_is_tabled(:).
:- use_module(library(terms), [ :- use_module(library(terms),
instantiated_term_hash/4, [instantiated_term_hash/4,
variant/2 variant/2
]). ]).
:- use_module(evidence, [ :- use_module(evidence,
put_evidence/2 [put_evidence/2]).
]).
:- dynamic clpbn_table/3. :- dynamic clpbn_table/3.
@ -108,30 +108,28 @@ clpbn_table(F/N,M) :-
L0 = [_|Args0], L0 = [_|Args0],
IGoal =.. [NF|Args0], IGoal =.. [NF|Args0],
asserta(clpbn_table(S, M, IGoal)), asserta(clpbn_table(S, M, IGoal)),
assert( assert((M:S :-
(M:S :- !,
!, % write(S: ' ' ),
% write(S: ' ' ), b_getval(clpbn_tables, Tab),
b_getval(clpbn_tables, Tab), % V2 is unbound.
% V2 is unbound. (b_hash_lookup(Key, V2, Tab) ->
( b_hash_lookup(Key, V2, Tab) -> % (attvar(V2) -> writeln(ok:A0:V2) ; writeln(error(V2:should_be_attvar(S)))),
% (attvar(V2) -> writeln(ok:A0:V2) ; writeln(error(V2:should_be_attvar(S)))), (var(A0) -> A0 = V2 ; put_evidence(A0, V2))
( var(A0) -> A0 = V2 ; put_evidence(A0, V2) ) ;
; % writeln(new),
% writeln(new), b_hash_insert(Tab, Key, V2, NewTab),
b_hash_insert(Tab, Key, V2, NewTab), b_setval(clpbn_tables,NewTab),
b_setval(clpbn_tables,NewTab), once(M:Goal), !,
once(M:Goal), !, % enter evidence after binding.
% enter evidence after binding. (var(A0) -> A0 = V2 ; put_evidence(A0, V2))
( var(A0) -> A0 = V2 ; put_evidence(A0, V2) ) ;
; clpbn:clpbn_flag(solver,none) ->
clpbn:clpbn_flag(solver,none) -> true
true ;
; throw(error(tabled_clpbn_predicate_should_never_fail,S))
throw(error(tabled_clpbn_predicate_should_never_fail,S)) )
) )).
)
).
take_tail([V], V, [], V1, [V1]) :- !. take_tail([V], V, [], V1, [V1]) :- !.
take_tail([A|L0], V, [A|L1], V1, [A|L2]) :- take_tail([A|L0], V, [A|L1], V1, [A|L2]) :-
@ -154,19 +152,17 @@ clpbn_tableallargs(F/N,M) :-
atom_concat(F, '___tabled', NF), atom_concat(F, '___tabled', NF),
NKey =.. [NF|Args], NKey =.. [NF|Args],
asserta(clpbn_table(Key, M, NKey)), asserta(clpbn_table(Key, M, NKey)),
assert( assert((M:Key :-
(M:Key :- !,
!, b_getval(clpbn_tables, Tab),
b_getval(clpbn_tables, Tab), (b_hash_lookup(Key, Out, Tab) ->
( b_hash_lookup(Key, Out, Tab) -> true
true ;
; b_hash_insert(Tab, Key, Out, NewTab),
b_hash_insert(Tab, Key, Out, NewTab), b_setval(clpbn_tables, NewTab),
b_setval(clpbn_tables, NewTab), once(M:NKey)
once(M:NKey) )
) )).
)
).
clpbn_table_nondet(M:X) :- !, clpbn_table_nondet(M:X) :- !,
clpbn_table_nondet(X,M). clpbn_table_nondet(X,M).
@ -185,18 +181,17 @@ clpbn_table_nondet(F/N,M) :-
atom_concat(F, '___tabled', NF), atom_concat(F, '___tabled', NF),
NKey =.. [NF|Args], NKey =.. [NF|Args],
asserta(clpbn_table(Key, M, NKey)), asserta(clpbn_table(Key, M, NKey)),
assert( assert((M:Key :-
(M:Key :- % writeln(in:Key), % writeln(in:Key),
b_getval(clpbn_tables, Tab), b_getval(clpbn_tables, Tab),
( b_hash_lookup(Key, Out, Tab) -> (b_hash_lookup(Key, Out, Tab) ->
fail fail
; ;
b_hash_insert(Tab, Key, Out, NewTab), b_hash_insert(Tab, Key, Out, NewTab),
b_setval(clpbn_tables, NewTab), b_setval(clpbn_tables, NewTab),
M:NKey M:NKey
) )
) )).
).
user:term_expansion((P :- Gs), NC) :- user:term_expansion((P :- Gs), NC) :-
clpbn_table(P, M, NP), clpbn_table(P, M, NP),
@ -364,4 +359,3 @@ clpbn_is_tabled(M:Clause, _) :- !,
clpbn_is_tabled(Head, M) :- clpbn_is_tabled(Head, M) :-
clpbn_table(Head, M, _). clpbn_table(Head, M, _).

View File

@ -1,11 +1,13 @@
:- module(topsort, [topsort/2]). :- module(topsort,
[topsort/2]).
:- use_module(library(dgraphs), :- use_module(library(dgraphs),
[dgraph_new/1, [dgraph_new/1,
dgraph_add_edges/3, dgraph_add_edges/3,
dgraph_add_vertices/3, dgraph_add_vertices/3,
dgraph_top_sort/2]). dgraph_top_sort/2
]).
/* simple implementation of a topological sorting algorithm */ /* simple implementation of a topological sorting algorithm */
/* graph is as Node-[Parents] */ /* graph is as Node-[Parents] */
@ -31,4 +33,3 @@ add_edges([], _V) --> [].
add_edges([P|Parents], V) --> [P-V], add_edges([P|Parents], V) --> [P-V],
add_edges(Parents, V). add_edges(Parents, V).

View File

@ -1,9 +1,11 @@
:- module(clpbn_utils, [
clpbn_not_var_member/2, :- module(clpbn_utils,
clpbn_var_member/2, [clpbn_not_var_member/2,
check_for_hidden_vars/3, clpbn_var_member/2,
sort_vars_by_key/3, check_for_hidden_vars/3,
sort_vars_by_key_and_parents/3]). sort_vars_by_key/3,
sort_vars_by_key_and_parents/3
]).
% %
% It may happen that variables from a previous query may still be around. % It may happen that variables from a previous query may still be around.
@ -52,21 +54,19 @@ get_keys([_|AVars], KeysVars) :- % may be non-CLPBN vars.
merge_same_key([], [], _, []). merge_same_key([], [], _, []).
merge_same_key([K1-V1,K2-V2|Vs], SortedAVars, Ks, UnifiableVars) :- merge_same_key([K1-V1,K2-V2|Vs], SortedAVars, Ks, UnifiableVars) :-
K1 == K2, !, K1 == K2, !,
(clpbn:get_atts(V1, [evidence(E)]) (clpbn:get_atts(V1, [evidence(E)]) ->
-> clpbn:put_atts(V2, [evidence(E)])
clpbn:put_atts(V2, [evidence(E)])
; ;
clpbn:get_atts(V2, [evidence(E)]) clpbn:get_atts(V2, [evidence(E)]) ->
->
clpbn:put_atts(V1, [evidence(E)]) clpbn:put_atts(V1, [evidence(E)])
; ;
true true
), ),
% V1 = V2, % V1 = V2,
attributes:fast_unify_attributed(V1,V2), attributes:fast_unify_attributed(V1,V2),
merge_same_key([K1-V1|Vs], SortedAVars, Ks, UnifiableVars). merge_same_key([K1-V1|Vs], SortedAVars, Ks, UnifiableVars).
merge_same_key([K1-V1,K2-V2|Vs], [V1|SortedAVars], Ks, [K1|UnifiableVars]) :- merge_same_key([K1-V1,K2-V2|Vs], [V1|SortedAVars], Ks, [K1|UnifiableVars]) :-
(in_keys(K1, Ks) ; \+ \+ K1 == K2), !, (in_keys(K1, Ks) ; \+ \+ K1 == K2), !,
add_to_keys(K1, Ks, NKs), add_to_keys(K1, Ks, NKs),
merge_same_key([K2-V2|Vs], SortedAVars, NKs, UnifiableVars). merge_same_key([K2-V2|Vs], SortedAVars, NKs, UnifiableVars).
merge_same_key([K-V|Vs], [V|SortedAVars], Ks, UnifiableVars) :- merge_same_key([K-V|Vs], [V|SortedAVars], Ks, UnifiableVars) :-
@ -74,9 +74,9 @@ merge_same_key([K-V|Vs], [V|SortedAVars], Ks, UnifiableVars) :-
merge_same_key(Vs, SortedAVars, NKs, UnifiableVars). merge_same_key(Vs, SortedAVars, NKs, UnifiableVars).
in_keys(K1,[K|_]) :- \+ \+ K1 = K, !. in_keys(K1,[K|_]) :- \+ \+ K1 = K, !.
in_keys(K1,[_|Ks]) :- in_keys(K1,[_|Ks]) :-
in_keys(K1,Ks). in_keys(K1,Ks).
add_to_keys(K1, Ks, Ks) :- ground(K1), !. add_to_keys(K1, Ks, Ks) :- ground(K1), !.
add_to_keys(K1, Ks, [K1|Ks]). add_to_keys(K1, Ks, [K1|Ks]).
@ -102,7 +102,7 @@ add_parents(Parents,V,Id,KeyVarsF,KeyVars0) :-
all_vars([]). all_vars([]).
all_vars([P|Parents]) :- all_vars([P|Parents]) :-
var(P), var(P),
all_vars(Parents). all_vars(Parents).
@ -113,4 +113,3 @@ transform_parents([P|Parents0],[P|NParents],KeyVarsF,KeyVars0) :-
transform_parents([P|Parents0],[V|NParents],[P-V|KeyVarsF],KeyVars0) :- transform_parents([P|Parents0],[V|NParents],[P-V|KeyVarsF],KeyVars0) :-
transform_parents(Parents0,NParents,KeyVarsF,KeyVars0). transform_parents(Parents0,NParents,KeyVarsF,KeyVars0).

View File

@ -11,58 +11,61 @@
all tables they connect to; all tables they connect to;
multiply their size multiply their size
order by size order by size
*********************************/ *********************************/
:- module(clpbn_ve, [ve/3, :- module(clpbn_ve,
check_if_ve_done/1, [ve/3,
init_ve_solver/4, check_if_ve_done/1,
run_ve_solver/3, init_ve_solver/4,
init_ve_ground_solver/5, run_ve_solver/3,
run_ve_ground_solver/3, init_ve_ground_solver/5,
call_ve_ground_solver/6]). run_ve_ground_solver/3,
call_ve_ground_solver/6
]).
:- attribute size/1, all_diffs/1. :- use_module(library(atts)).
:- use_module(library(ordsets), :- use_module(library(ordsets),
[ord_union/3, [ord_union/3,
ord_member/2]). ord_member/2
]).
:- use_module(library('clpbn/xbif'), [clpbn2xbif/3]). :- use_module(library('clpbn/xbif'),
[clpbn2xbif/3]).
:- use_module(library('clpbn/graphviz'), [clpbn2gviz/4]). :- use_module(library('clpbn/graphviz'),
[clpbn2gviz/4]).
:- use_module(library('clpbn/dists'), :- use_module(library('clpbn/dists'),
[ [dist/4,
dist/4, get_dist_domain_size/2,
get_dist_domain_size/2, get_dist_params/2,
get_dist_params/2, get_dist_domain_size/2,
get_dist_domain_size/2, get_dist_matrix/5
get_dist_matrix/5]). ]).
:- use_module(library('clpbn/utils'), [ :- use_module(library('clpbn/utils'),
clpbn_not_var_member/2]). [clpbn_not_var_member/2]).
:- use_module(library('clpbn/display'), [ :- use_module(library('clpbn/display'),
clpbn_bind_vals/3]). [clpbn_bind_vals/3]).
:- use_module(library('clpbn/connected'), :- use_module(library('clpbn/connected'),
[ [init_influences/3,
init_influences/3, influences/4,
influences/4, factor_influences/4
factor_influences/4 ]).
]).
:- use_module(library(clpbn/matrix_cpt_utils)). :- use_module(library(clpbn/matrix_cpt_utils)).
:- use_module(library(clpbn/numbers)). :- use_module(library(clpbn/numbers)).
:- use_module(library(lists), :- use_module(library(lists),
[ [member/2,
member/2, append/3,
append/3, delete/3
delete/3 ]).
]).
:- use_module(library(maplist)). :- use_module(library(maplist)).
@ -71,7 +74,9 @@
:- use_module(library(clpbn/vmap)). :- use_module(library(clpbn/vmap)).
:- use_module(library('clpbn/aggregates'), :- use_module(library('clpbn/aggregates'),
[check_for_agg_vars/2]). [check_for_agg_vars/2]).
:- attribute size/1, all_diffs/1.
% %
% uses a bipartite graph where bigraph(Vs, NFs, Fs) % uses a bipartite graph where bigraph(Vs, NFs, Fs)
@ -88,23 +93,23 @@ check_if_ve_done(Var) :-
% new PFL like interface... % new PFL like interface...
% %
call_ve_ground_solver(QueryVars, QueryKeys, AllKeys, Factors, Evidence, Output) :- call_ve_ground_solver(QueryVars, QueryKeys, AllKeys, Factors, Evidence, Output) :-
call_ve_ground_solver_for_probabilities([QueryKeys], AllKeys, Factors, Evidence, Solutions), call_ve_ground_solver_for_probabilities([QueryKeys], AllKeys, Factors, Evidence, Solutions),
clpbn_bind_vals([QueryVars], Solutions, Output). clpbn_bind_vals([QueryVars], Solutions, Output).
call_ve_ground_solver_for_probabilities(QueryKeys, AllKeys, Factors, Evidence, Solutions) :- call_ve_ground_solver_for_probabilities(QueryKeys, AllKeys, Factors, Evidence, Solutions) :-
init_ve_ground_solver(QueryKeys, AllKeys, Factors, Evidence, VE), init_ve_ground_solver(QueryKeys, AllKeys, Factors, Evidence, VE),
run_ve_ground_solver(QueryKeys, Solutions, VE). run_ve_ground_solver(QueryKeys, Solutions, VE).
simulate_ve_ground_solver(_QueryVars, QueryKeys, AllKeys, Factors, Evidence, Output) :- simulate_ve_ground_solver(_QueryVars, QueryKeys, AllKeys, Factors, Evidence, Output) :-
simulate_ve_ground_solver_for_probabilities([QueryKeys], AllKeys, Factors, Evidence, Output). simulate_ve_ground_solver_for_probabilities([QueryKeys], AllKeys, Factors, Evidence, Output).
simulate_ve_ground_solver_for_probabilities(QueryKeys, AllKeys, Factors, Evidence, Solutions) :- simulate_ve_ground_solver_for_probabilities(QueryKeys, AllKeys, Factors, Evidence, Solutions) :-
init_ve_ground_solver(QueryKeys, AllKeys, Factors, Evidence, VE), init_ve_ground_solver(QueryKeys, AllKeys, Factors, Evidence, VE),
simulate_solver(QueryKeys, Solutions, VE). simulate_solver(QueryKeys, Solutions, VE).
init_ve_ground_solver(_QueryKeys, AllKeys, Factors, Evidence, VE) :- init_ve_ground_solver(_QueryKeys, AllKeys, Factors, Evidence, VE) :-
keys_to_numbers(AllKeys, Factors, Evidence, Hash4, Id4, FactorIds, EvidenceIds), keys_to_numbers(AllKeys, Factors, Evidence, Hash4, Id4, FactorIds, EvidenceIds),
init_ve(FactorIds, EvidenceIds, Hash4, Id4, VE). init_ve(FactorIds, EvidenceIds, Hash4, Id4, VE).
% %
@ -112,11 +117,11 @@ init_ve_ground_solver(_QueryKeys, AllKeys, Factors, Evidence, VE) :-
% %
ve([[]],_,_) :- !. ve([[]],_,_) :- !.
ve(LLVs,Vs0,AllDiffs) :- ve(LLVs,Vs0,AllDiffs) :-
init_ve_solver(LLVs, Vs0, AllDiffs, State), init_ve_solver(LLVs, Vs0, AllDiffs, State),
% variable elimination proper % variable elimination proper
run_ve_solver(LLVs, LLPs, State), run_ve_solver(LLVs, LLPs, State),
% bind Probs back to variables so that they can be output. % bind Probs back to variables so that they can be output.
clpbn_bind_vals(LLVs,LLPs,AllDiffs). clpbn_bind_vals(LLVs,LLPs,AllDiffs).
init_ve(FactorIds, EvidenceIds, Hash, Id, ve(FactorIds, Hash, Id, Ev)) :- init_ve(FactorIds, EvidenceIds, Hash, Id, ve(FactorIds, Hash, Id, Ev)) :-
@ -129,7 +134,7 @@ evtotree(K=V,Ev0,Ev) :-
factor_to_graph( f(Nodes, Sizes, _Pars0, Id), Factors0, Factors, Edges0, Edges, I0, I) :- factor_to_graph( f(Nodes, Sizes, _Pars0, Id), Factors0, Factors, Edges0, Edges, I0, I) :-
I is I0+1, I is I0+1,
pfl:get_pfl_parameters(Id, Pars0), pfl:get_pfl_parameters(Id, Pars0),
init_CPT(Pars0, Sizes, CPT0), init_CPT(Pars0, Sizes, CPT0),
reorder_CPT(Nodes, CPT0, FIPs, CPT, _), reorder_CPT(Nodes, CPT0, FIPs, CPT, _),
F = f(I0, FIPs, CPT), F = f(I0, FIPs, CPT),
rb_insert(Factors0, I0, F, Factors), rb_insert(Factors0, I0, F, Factors),
@ -172,7 +177,7 @@ vars_to_bigraph(VMap, bigraph(VInfo, IF, Fs), Evs) :-
id_to_factor(VMap, V-I, IF0, IF, Fs0, Fs, Evs0, Evs) :- id_to_factor(VMap, V-I, IF0, IF, Fs0, Fs, Evs0, Evs) :-
% process evidence for variable % process evidence for variable
clpbn:get_atts(V, [evidence(E), dist(_,Ps)]), clpbn:get_atts(V, [evidence(E), dist(_,Ps)]),
checklist(noparent_of_interest(VMap), Ps), !, checklist(noparent_of_interest(VMap), Ps), !,
% I don't need to get a factor here % I don't need to get a factor here
Evs = [I=E|Evs0], Evs = [I=E|Evs0],
@ -181,17 +186,17 @@ id_to_factor(VMap, V-I, IF0, IF, Fs0, Fs, Evs0, Evs) :-
id_to_factor(VMap, V-I, IF0, IF, Fs0, Fs, Evs0, Evs) :- id_to_factor(VMap, V-I, IF0, IF, Fs0, Fs, Evs0, Evs) :-
% process distribution/factors % process distribution/factors
( (
clpbn:get_atts(V, [evidence(E)]) clpbn:get_atts(V, [evidence(E)])
-> ->
Evs = [I=E|Evs0] Evs = [I=E|Evs0]
; ;
Evs = Evs0 Evs = Evs0
), ),
clpbn:get_atts(V, [dist(D, Ps)]), clpbn:get_atts(V, [dist(D, Ps)]),
get_dist_params(D, Pars0), get_dist_params(D, Pars0),
get_dist_domain_size(D, DS), get_dist_domain_size(D, DS),
maplist(parent_to_id(VMap), Ps, Sizes, IPs), maplist(parent_to_id(VMap), Ps, Sizes, IPs),
init_CPT(Pars0, [DS|Sizes], CPT0), init_CPT(Pars0, [DS|Sizes], CPT0),
reorder_CPT([I|IPs], CPT0, FIPs, CPT, _), reorder_CPT([I|IPs], CPT0, FIPs, CPT, _),
rb_insert(Fs0, IF0, f(IF0, FIPs, CPT), Fs), rb_insert(Fs0, IF0, f(IF0, FIPs, CPT), Fs),
IF is IF0+1. IF is IF0+1.
@ -239,29 +244,29 @@ collect_factors(SFVs, _Fs, _V, [], SFVs).
% solve each query independently % solve each query independently
% use a findall to recover space without needing for GC % use a findall to recover space without needing for GC
run_ve_ground_solver(LQVs, LLPs, ve(FactorIds, Hash, Id, Ev)) :- run_ve_ground_solver(LQVs, LLPs, ve(FactorIds, Hash, Id, Ev)) :-
rb_new(Fs0), rb_new(Fs0),
foldl3(factor_to_graph, FactorIds, Fs0, Fs, [], FVs, 0, IF), foldl3(factor_to_graph, FactorIds, Fs0, Fs, [], FVs, 0, IF),
sort(FVs, SFVs), sort(FVs, SFVs),
rb_new(VInfo0), rb_new(VInfo0),
add_vs(SFVs, Fs, VInfo0, VInfo), add_vs(SFVs, Fs, VInfo0, VInfo),
BG = bigraph(VInfo, IF, Fs), BG = bigraph(VInfo, IF, Fs),
lists_of_keys_to_ids(LQVs, LQIds, Hash, _, Id, _), lists_of_keys_to_ids(LQVs, LQIds, Hash, _, Id, _),
findall(LPs, solve(LQIds, FactorIds, BG, Ev, LPs), LLPs). findall(LPs, solve(LQIds, FactorIds, BG, Ev, LPs), LLPs).
solve([QVs|_], FIds, Bigraph, Evs, LPs) :- solve([QVs|_], FIds, Bigraph, Evs, LPs) :-
factor_influences(FIds, QVs, Evs, LVs), factor_influences(FIds, QVs, Evs, LVs),
do_solve(QVs, LVs, Bigraph, Evs, LPs). do_solve(QVs, LVs, Bigraph, Evs, LPs).
solve([_|LQVs], FIds, Bigraph, Ev, LPs) :- solve([_|LQVs], FIds, Bigraph, Ev, LPs) :-
solve(LQVs, FIds, Bigraph, Ev, LPs). solve(LQVs, FIds, Bigraph, Ev, LPs).
do_solve(IQVs, IVs, bigraph(OldVs, IF, _Fs), Ev, Ps) :- do_solve(IQVs, IVs, bigraph(OldVs, IF, _Fs), Ev, Ps) :-
% get only what is relevant to query, % get only what is relevant to query,
project_to_query_related(IVs, OldVs, SVs, Fs1), project_to_query_related(IVs, OldVs, SVs, Fs1),
% and also prune using evidence % and also prune using evidence
rb_visit(Ev, EvL), rb_visit(Ev, EvL),
foldl2(clean_v_ev, EvL, Fs1, Fs2, SVs, EVs), foldl2(clean_v_ev, EvL, Fs1, Fs2, SVs, EVs),
% eliminate % eliminate
eliminate(IQVs, digraph(EVs, IF, Fs2), Dist), eliminate(IQVs, digraph(EVs, IF, Fs2), Dist),
% writeln(m:Dist),matrix:matrix_to_list(Dist,LD),writeln(LD), % writeln(m:Dist),matrix:matrix_to_list(Dist,LD),writeln(LD),
%exps(LD,LDE),writeln(LDE), %exps(LD,LDE),writeln(LDE),
% move from potentials back to probabilities % move from potentials back to probabilities
@ -269,18 +274,18 @@ do_solve(IQVs, IVs, bigraph(OldVs, IF, _Fs), Ev, Ps) :-
list_from_CPT(MPs, Ps). list_from_CPT(MPs, Ps).
simulate_solver(LQVs, Choices, ve(FIds, Hash, Id, BG, Evs)) :- simulate_solver(LQVs, Choices, ve(FIds, Hash, Id, BG, Evs)) :-
lists_of_keys_to_ids(LQVs, [QVs], Hash, _, Id, _), lists_of_keys_to_ids(LQVs, [QVs], Hash, _, Id, _),
factor_influences(FIds, QVs, Evs, LVs), factor_influences(FIds, QVs, Evs, LVs),
do_simulate(QVs, LVs, BG, Evs, Choices). do_simulate(QVs, LVs, BG, Evs, Choices).
do_simulate(IQVs, IVs, bigraph(OldVs, IF, _Fs), Ev, Choices) :- do_simulate(IQVs, IVs, bigraph(OldVs, IF, _Fs), Ev, Choices) :-
% get only what is relevant to query, % get only what is relevant to query,
project_to_query_related(IVs, OldVs, SVs, Fs1), project_to_query_related(IVs, OldVs, SVs, Fs1),
% and also prune using evidence % and also prune using evidence
rb_visit(Ev, EvL), rb_visit(Ev, EvL),
foldl2(clean_v_ev, EvL, Fs1, Fs2, SVs, EVs), foldl2(clean_v_ev, EvL, Fs1, Fs2, SVs, EVs),
% eliminate % eliminate
simulate_eiminate(IQVs, digraph(EVs, IF, Fs2), Choices). simulate_eiminate(IQVs, digraph(EVs, IF, Fs2), Choices).
% solve each query independently % solve each query independently
% use a findall to recover space without needing for GC % use a findall to recover space without needing for GC
@ -295,9 +300,9 @@ run_ve_solver(_, LLPs, state(LQVs, LVs, _VMap, Bigraph, Ev)) :-
% %
solve_ve([IQVs|_], [IVs|_], bigraph(OldVs, IF, _Fs), Ev, Ps) :- solve_ve([IQVs|_], [IVs|_], bigraph(OldVs, IF, _Fs), Ev, Ps) :-
% get only what is relevant to query, % get only what is relevant to query,
project_to_query_related(IVs, OldVs, SVs, Fs1), project_to_query_related(IVs, OldVs, SVs, Fs1),
% and also prune using evidence % and also prune using evidence
foldl2(clean_v_ev, Ev, Fs1, Fs2, SVs, EVs), foldl2(clean_v_ev, Ev, Fs1, Fs2, SVs, EVs),
% eliminate % eliminate
eliminate(IQVs, digraph(EVs, IF, Fs2), Dist), eliminate(IQVs, digraph(EVs, IF, Fs2), Dist),
% writeln(m:Dist),matrix:matrix_to_list(Dist,LD),writeln(LD), % writeln(m:Dist),matrix:matrix_to_list(Dist,LD),writeln(LD),
@ -314,7 +319,7 @@ solve_ve([_|MoreLVs], [_|MoreLVis], Digraph, Ev, Ps) :-
project_to_query_related(IVs0, OldVs, NVs, NFs) :- project_to_query_related(IVs0, OldVs, NVs, NFs) :-
sort(IVs0, IVs), sort(IVs0, IVs),
rb_new(Vs0), rb_new(Vs0),
foldl(cp_to_vs, IVs, Vs0, AuxVs), foldl(cp_to_vs, IVs, Vs0, AuxVs),
rb_new(NFs0), rb_new(NFs0),
foldl(simplify_graph_node(OldVs, AuxVs), IVs, VFs, NFs0, NFs), foldl(simplify_graph_node(OldVs, AuxVs), IVs, VFs, NFs0, NFs),
list_to_rbtree(VFs, NVs). list_to_rbtree(VFs, NVs).
@ -338,31 +343,31 @@ simplify_graph_node(OldVs, NVs, V, V-RemFs, NFs0, NFs) :-
% %
% Two cases: first time factor comes up: all its vars must be in subgraph % Two cases: first time factor comes up: all its vars must be in subgraph
% second case: second time it comes up, it must be already in graph % second case: second time it comes up, it must be already in graph
% %
% args: +Factor F, +current V (int), +rbtree with all Vs, % args: +Factor F, +current V (int), +rbtree with all Vs,
% -Factors in new Graph, +factors in current graph, -rbtree of factors % -Factors in new Graph, +factors in current graph, -rbtree of factors
% %
% %
check_factor(V, NVs, F, NFs0, NFs, RemFs, NewRemFs) :- check_factor(V, NVs, F, NFs0, NFs, RemFs, NewRemFs) :-
F = f(IF, [V|More], _), !, F = f(IF, [V|More], _), !,
( (
checklist(check_v(NVs), More) checklist(check_v(NVs), More)
-> ->
rb_insert(NFs0, IF, F, NFs), rb_insert(NFs0, IF, F, NFs),
NewRemFs = [F|RemFs] NewRemFs = [F|RemFs]
; ;
NFs0 = NFs, NFs0 = NFs,
NewRemFs = RemFs NewRemFs = RemFs
). ).
check_factor(_V, _NVs, F, NFs, NFs, RemFs, NewRemFs) :- check_factor(_V, _NVs, F, NFs, NFs, RemFs, NewRemFs) :-
F = f(Id, _, _), F = f(Id, _, _),
( (
rb_lookup(Id, F, NFs) rb_lookup(Id, F, NFs)
-> ->
NewRemFs = [F|RemFs] NewRemFs = [F|RemFs]
; ;
NewRemFs = RemFs NewRemFs = RemFs
). ).
check_v(NVs, V) :- check_v(NVs, V) :-
rb_lookup(V, _, NVs). rb_lookup(V, _, NVs).
@ -425,15 +430,15 @@ 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)) :-
foldl(szfac,Node,1,NewVal), foldl(szfac,Node,1,NewVal),
%length(Node, 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) :- szfac(f(_,Vs,_), I0, I) :-
length(Vs,L), length(Vs,L),
I is I0*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) :-
@ -472,4 +477,3 @@ multiply([F0|Fs], Vs, T) :-
multiply_factor(f(_,Vs1,T1), f(_,Vs0,T0), f(_,Vs,T)) :- multiply_factor(f(_,Vs1,T1), f(_,Vs0,T0), f(_,Vs,T)) :-
multiply_CPTs(T1, Vs1, T0, Vs0, T, Vs). multiply_CPTs(T1, Vs1, T0, Vs0, T, Vs).

View File

@ -1,11 +1,13 @@
%:- style_check(all). %:- style_check(all).
:- module(viterbi, [viterbi/4]). :- module(viterbi,
[viterbi/4]).
:- use_module(library(lists), :- use_module(library(lists),
[nth/3, [nth/3,
member/2]). member/2
]).
:- use_module(library(assoc)). :- use_module(library(assoc)).
@ -17,8 +19,8 @@
:- ensure_loaded(library('clpbn/hmm')). :- ensure_loaded(library('clpbn/hmm')).
:- use_module(library('clpbn/dists'), [ :- use_module(library('clpbn/dists'),
get_dist_params/2]). [get_dist_params/2]).
:- meta_predicate viterbi(:,:,+,-). :- meta_predicate viterbi(:,:,+,-).
@ -75,21 +77,21 @@ fetch_edges([V|Parents], Key0, EdgesF, Edges0, [Slice-AKey|PKeys]) :-
clpbn:get_atts(V,[key(Key)]), clpbn:get_atts(V,[key(Key)]),
abstract_key(Key, AKey, Slice), abstract_key(Key, AKey, Slice),
( (
Slice < 3 Slice < 3
-> ->
EdgesF = [Key0-AKey|EdgesI] EdgesF = [Key0-AKey|EdgesI]
; ;
EdgesF = EdgesI EdgesF = EdgesI
), ),
fetch_edges(Parents, Key0, EdgesI, Edges0, PKeys). fetch_edges(Parents, Key0, EdgesI, Edges0, PKeys).
fetch_edges([Key|Parents], Key0, EdgesF, Edges0, [Slice-AKey|PKeys]) :- fetch_edges([Key|Parents], Key0, EdgesF, Edges0, [Slice-AKey|PKeys]) :-
abstract_key(Key, AKey, Slice), abstract_key(Key, AKey, Slice),
( (
Slice < 3 Slice < 3
-> ->
EdgesF = [Key0-AKey|EdgesI] EdgesF = [Key0-AKey|EdgesI]
; ;
EdgesF = EdgesI EdgesF = EdgesI
), ),
fetch_edges(Parents, Key0, EdgesI, Edges0, PKeys). fetch_edges(Parents, Key0, EdgesI, Edges0, PKeys).
fetch_edges([], _, Edges, Edges, []). fetch_edges([], _, Edges, Edges, []).
@ -122,20 +124,20 @@ compile_keys([], _, []).
% add a random symbol to the end. % add a random symbol to the end.
compile_emission([],_) --> !, []. compile_emission([],_) --> !, [].
compile_emission(EmissionTerm,IKey) --> [emit(IKey,EmissionTerm)]. compile_emission(EmissionTerm,IKey) --> [emit(IKey,EmissionTerm)].
compile_propagation([],[],_,_) --> []. compile_propagation([],[],_,_) --> [].
compile_propagation([0-PKey|Ps], [Prob|Probs], IKey, KeyMap) --> compile_propagation([0-PKey|Ps], [Prob|Probs], IKey, KeyMap) -->
[prop_same(IKey,Parent,Prob)], [prop_same(IKey,Parent,Prob)],
{ get_assoc(PKey,KeyMap,nodeinfo(Parent,_,_,_)) }, { get_assoc(PKey,KeyMap,nodeinfo(Parent,_,_,_)) },
compile_propagation(Ps, Probs, IKey, KeyMap). compile_propagation(Ps, Probs, IKey, KeyMap).
compile_propagation([2-PKey|Ps], [Prob|Probs], IKey, KeyMap) --> compile_propagation([2-PKey|Ps], [Prob|Probs], IKey, KeyMap) -->
[prop_same(IKey,Parent,Prob)], [prop_same(IKey,Parent,Prob)],
{ get_assoc(PKey,KeyMap,nodeinfo(Parent,_,_,_)) }, { get_assoc(PKey,KeyMap,nodeinfo(Parent,_,_,_)) },
compile_propagation(Ps, Probs, IKey, KeyMap). compile_propagation(Ps, Probs, IKey, KeyMap).
compile_propagation([3-PKey|Ps], [Prob|Probs], IKey, KeyMap) --> compile_propagation([3-PKey|Ps], [Prob|Probs], IKey, KeyMap) -->
[prop_next(IKey,Parent,Prob)], [prop_next(IKey,Parent,Prob)],
{ get_assoc(PKey,KeyMap,nodeinfo(Parent,_,_,_)) }, { get_assoc(PKey,KeyMap,nodeinfo(Parent,_,_,_)) },
compile_propagation(Ps, Probs, IKey, KeyMap). compile_propagation(Ps, Probs, IKey, KeyMap).
get_id(_:S, Map, SI) :- !, get_id(_:S, Map, SI) :- !,
get_id(S, Map, SI). get_id(S, Map, SI).
@ -148,9 +150,9 @@ get_id(S, Map, SI) :-
compile_trace(Trace, Emissions) :- compile_trace(Trace, Emissions) :-
user:hmm_domain(Domain), user:hmm_domain(Domain),
(atom(Domain) -> (atom(Domain) ->
hmm:cvt_vals(Domain, Vals) hmm:cvt_vals(Domain, Vals)
; ;
Vals = Domain Vals = Domain
), ),
compile_trace(Trace, Vals, Emissions). compile_trace(Trace, Vals, Emissions).
@ -192,22 +194,22 @@ run_inst(prop_same(I,P,Prob), _, SP, Current, _, Trace) :-
NP is PI+Prob, NP is PI+Prob,
matrix_get(Current, [P], P0), matrix_get(Current, [P], P0),
(NP > P0 -> (NP > P0 ->
matrix_set(Current, [P], NP), matrix_set(Current, [P], NP),
matrix_set(Trace, [SP,P], I) matrix_set(Trace, [SP,P], I)
; ;
true true
). ).
run_inst(prop_next(I,P,Prob), _, SP, Current, Next, Trace) :- run_inst(prop_next(I,P,Prob), _, SP, Current, Next, Trace) :-
matrix_get(Current, [I], PI), matrix_get(Current, [I], PI),
NP is PI+Prob, NP is PI+Prob,
matrix_get(Next, [P], P0), matrix_get(Next, [P], P0),
(NP > P0 -> (NP > P0 ->
matrix_set(Next, [P], NP), matrix_set(Next, [P], NP),
SP1 is SP+1, SP1 is SP+1,
IN is -I, IN is -I,
matrix_set(Trace, [SP1,P], IN) matrix_set(Trace, [SP1,P], IN)
; ;
true true
). ).
backtrace(Dump, EI, Map, L, Trace) :- backtrace(Dump, EI, Map, L, Trace) :-
@ -219,11 +221,11 @@ backtrace(Dump, EI, Map, L, Trace) :-
trace(0,0,_,_,Trace,Trace) :- !. trace(0,0,_,_,Trace,Trace) :- !.
trace(L1,Next,Dump,Map,Trace0,Trace) :- trace(L1,Next,Dump,Map,Trace0,Trace) :-
(Next < 0 -> (Next < 0 ->
NL is L1-1, NL is L1-1,
P is -Next P is -Next
; ;
NL = L1, NL = L1,
P = Next P = Next
), ),
once(member(P-AKey,Map)), once(member(P-AKey,Map)),
AKey=..[N|Args], AKey=..[N|Args],
@ -231,5 +233,3 @@ trace(L1,Next,Dump,Map,Trace0,Trace) :-
matrix_get(Dump,[NL,P],New), matrix_get(Dump,[NL,P],New),
trace(NL,New,Dump,Map,[Key|Trace0],Trace). trace(NL,New,Dump,Map,[Key|Trace0],Trace).

View File

@ -1,23 +1,22 @@
:- module(clpbn_vmap, :- module(clpbn_vmap,
[ [init_vmap/1, % init_vmap(-Vmap)
init_vmap/1, % init_vmap(-Vmap) add_to_vmap/4, % add_to_vmap(+V,-I,+VMap0,VMapF)
add_to_vmap/4, % add_to_vmap(+V,-I,+VMap0,VMapF) get_from_vmap/3, % add_to_vmap(+V,-I,+VMap0)
get_from_vmap/3, % add_to_vmap(+V,-I,+VMap0) vars_to_numbers/4, % vars_to_numbers(+Vs,-Is,+VMap0,VMapF)
vars_to_numbers/4, % vars_to_numbers(+Vs,-Is,+VMap0,VMapF) lvars_to_numbers/4, % lvars_to_numbers(+LVs,-LIs,+VMap0,VMapF)
lvars_to_numbers/4, % lvars_to_numbers(+LVs,-LIs,+VMap0,VMapF) vmap_to_list/2
vmap_to_list/2 ]).
]).
:- use_module(library(rbtrees)). :- use_module(library(rbtrees)).
:- use_module(library(maplist)). :- use_module(library(maplist)).
% %
% vmap: map V->I % vmap: map V->I
% contiguous Vs to contiguous integers % contiguous Vs to contiguous integers
% %
init_vmap(vmap(0,Empty)) :- init_vmap(vmap(0,Empty)) :-
rb_new(Empty). rb_new(Empty).
get_from_vmap(V, I, VMap0) :- get_from_vmap(V, I, VMap0) :-
VMap0 = vmap(_I,Map0), VMap0 = vmap(_I,Map0),
@ -39,6 +38,3 @@ lvars_to_numbers(LVs, LIs, VMap0, VMap) :-
vmap_to_list(vmap(_,Map), L) :- vmap_to_list(vmap(_,Map), L) :-
rb_visit(Map, L). rb_visit(Map, L).

View File

@ -2,10 +2,11 @@
% XMLBIF support for CLP(BN) % XMLBIF support for CLP(BN)
% %
:- module(xbif, [clpbn2xbif/3]). :- module(xbif,
[clpbn2xbif/3]).
:- use_module(library('clpbn/dists'), [ :- use_module(library('clpbn/dists'),
get_dist_domain/2]). [get_dist_domain/2]).
clpbn2xbif(Stream, Name, Network) :- clpbn2xbif(Stream, Name, Network) :-
format(Stream, '<?xml version="1.0" encoding="US-ASCII"?> format(Stream, '<?xml version="1.0" encoding="US-ASCII"?>

View File

@ -5,7 +5,10 @@
% support for a single sequence. % support for a single sequence.
% %
:- module(fasta, [fa2atoms/2,fa2atoms/3]). :- module(fasta,
[fa2atoms/2,
fa2atoms/3
]).
fa2atoms(F, L) :- fa2atoms(F, L) :-
fa2atoms(F, L, []). fa2atoms(F, L, []).
@ -25,8 +28,8 @@ read_chars(10,S) --> !,
read_chars(C,S) --> read_chars(C,S) -->
[AC], [AC],
{ {
cvt_c(C,AC), cvt_c(C,AC),
get0(S,MC) get0(S,MC)
}, },
read_chars(MC, S). read_chars(MC, S).
@ -44,4 +47,3 @@ skip_header(_,S) :-
skip_header(C,S). skip_header(C,S).

View File

@ -32,9 +32,9 @@ g_f_cpt(-8455,1.0,0.00284964910984409).
%Null state emission CPT. %Null state emission CPT.
nule_cpt( nule_cpt(
e(595,-1558,85,338,-294,453,-1158,197,249,902,-1085,-142,-21,-313,45,531,201,384,-1998,-644), e(595,-1558,85,338,-294,453,-1158,197,249,902,-1085,-142,-21,-313,45,531,201,384,-1998,-644),
0.05, 0.05,
e(0.0755236292781413,0.0169810785568618,0.0530343870684108,0.0632001549226403,0.0407818746669505,0.0684441906545919,0.0224066674892351,0.0573156092864189,0.0594191552528466,0.093432734688318,0.023569613397956,0.0453130969133667,0.0492774668469685,0.0402483068810561,0.051584158965068,0.0722465198961763,0.0574747424017338,0.0652477473844479,0.0125173406963917,0.0319968103461077)). e(0.0755236292781413,0.0169810785568618,0.0530343870684108,0.0632001549226403,0.0407818746669505,0.0684441906545919,0.0224066674892351,0.0573156092864189,0.0594191552528466,0.093432734688318,0.023569613397956,0.0453130969133667,0.0492774668469685,0.0402483068810561,0.051584158965068,0.0722465198961763,0.0574747424017338,0.0652477473844479,0.0125173406963917,0.0319968103461077)).
%Reaching first D. %Reaching first D.
b_d_cpt(-110,-3765,-110). b_d_cpt(-110,-3765,-110).

View File

@ -14,7 +14,7 @@ stop(S,W,Info) :-
gen_program(W, Info). gen_program(W, Info).
stop(_,_,_) :- stop(_,_,_) :-
format(user_error,"Bad HMM~n", []). format(user_error,"Bad HMM~n", []).
parse_model(S,Info) :- parse_model(S,Info) :-
get_line(S, Line, Info), get_line(S, Line, Info),
% format('~s~n',[Line]), % format('~s~n',[Line]),
@ -45,7 +45,7 @@ match_field(hmmer(_,_,_,Alph,_,_,_,_),_) --> "ALPH", !, % aminos or bases
match_field(_,_) --> "RF", !, scanner_skip. match_field(_,_) --> "RF", !, scanner_skip.
match_field(_,_) --> "CS", !, scanner_skip. match_field(_,_) --> "CS", !, scanner_skip.
match_field(hmmer(_,_,_,_,_,_,_,MAP),_) --> "MAP", !, match_field(hmmer(_,_,_,_,_,_,_,MAP),_) --> "MAP", !,
scanner_skip_blanks, scanner_skip_blanks,
to_lower(Codes), to_lower(Codes),
{ map_code(Codes,MAP) }. { map_code(Codes,MAP) }.
match_field(_,_) --> "COM", !, scanner_skip. match_field(_,_) --> "COM", !, scanner_skip.
@ -76,11 +76,11 @@ match_field(_,_) --> "EVD", !,
match_field(Info,S) --> "HMM", !, match_field(Info,S) --> "HMM", !,
scanner_skip, scanner_skip,
{ {
get_line(S,_,Info), get_line(S,_,Info),
Info = hmmer(_,_,NOfStates,Alph,_,_,model(BD,NBD,Transitions),MAP), Info = hmmer(_,_,NOfStates,Alph,_,_,model(BD,NBD,Transitions),MAP),
nof_symbols(Alph,N), nof_symbols(Alph,N),
scan_model(S,NOfStates,N,BD,NBD,Transitions,MAP,Info), scan_model(S,NOfStates,N,BD,NBD,Transitions,MAP,Info),
throw(done(Info)) throw(done(Info))
}. }.
scan_model(S,NOfStates,N,BD,NBD,Transitions,MAP,Info) :- scan_model(S,NOfStates,N,BD,NBD,Transitions,MAP,Info) :-
@ -95,7 +95,7 @@ scan_states(NOfStates, N, Stream, MAP, [t(E,I,S)|Transitions], Info) :-
scan_states(NOfStates1, N, Stream, NMAP, Transitions, Info). scan_states(NOfStates1, N, Stream, NMAP, Transitions, Info).
scan_state(Stream, E,I,MAP,s(MM,MI,MD,IM,II,DM,DD,BM,ME), N, NMAP, Info) :- scan_state(Stream, E,I,MAP,s(MM,MI,MD,IM,II,DM,DD,BM,ME), N, NMAP, Info) :-
get_line(Stream, ELine, Info), get_line(Stream, ELine, Info),
get_line(Stream, ILine, Info), get_line(Stream, ILine, Info),
get_line(Stream, SLine, Info), get_line(Stream, SLine, Info),
% format('~s~n~s~n~s~n',[ELine,ILine,SLine]), % format('~s~n~s~n~s~n',[ELine,ILine,SLine]),
@ -265,7 +265,7 @@ gen_model(W, model(BD,NBD,States),PsCPT) :-
format(W, '~n%Reaching first D.~n',[]), format(W, '~n%Reaching first D.~n',[]),
format(W, 'b_d_cpt(~w,~w,~w).~n',[BD,NBD,BDCPT]), format(W, 'b_d_cpt(~w,~w,~w).~n',[BD,NBD,BDCPT]),
gen_states(W, States,1,PsCPT). gen_states(W, States,1,PsCPT).
gen_states(_, [],_,_). gen_states(_, [],_,_).
gen_states(W, [State|States],StateNo,PsCPT) :- gen_states(W, [State|States],StateNo,PsCPT) :-
gen_state(W, State,StateNo,PsCPT), gen_state(W, State,StateNo,PsCPT),
@ -327,4 +327,3 @@ max_index([_|L],I0,Max0,MaxIndex0,Max,MaxIndex) :-
I is I0+1, I is I0+1,
max_index(L,I,Max0,MaxIndex0,Max,MaxIndex). max_index(L,I,Max0,MaxIndex0,Max,MaxIndex).

View File

@ -6,13 +6,12 @@
:- ensure_loaded(library('clpbn/viterbi')). :- ensure_loaded(library('clpbn/viterbi')).
:- use_module(fasta, :- use_module(fasta,
[fa2atoms/3]). [fa2atoms/3]).
:- use_module(library(lists), :- use_module(library(lists),
[ [nth/3,
nth/3, append/3
append/3 ]).
]).
:- [plan7]. :- [plan7].

View File

@ -41,4 +41,4 @@ write_cpts([CPT|CPTs]) :-
matrix_to_list(CPT,L), matrix_to_list(CPT,L),
format('CPT=~w~n',[L]), format('CPT=~w~n',[L]),
write_cpts(CPTs). write_cpts(CPTs).

View File

@ -55,7 +55,7 @@ professor_popularity(P,A) :- pop(P,A).
course_difficulty(P,A) :- diff(P,A). course_difficulty(P,A) :- diff(P,A).
student_intelligence(P,A) :- int(P,A). student_intelligence(P,A) :- int(P,A).
course_rating(C,X) :- rat(C,X). course_rating(C,X) :- rat(C,X).
registration_grade(R,A) :- registration_grade(R,A) :-

View File

@ -18,9 +18,6 @@ total_students(4096).
:- ensure_loaded('parschema.pfl'). :- ensure_loaded('parschema.pfl').
:- set_solver(hve).
professor(p0). professor(p0).
professor(p1). professor(p1).
professor(p2). professor(p2).

View File

@ -18,9 +18,6 @@ total_students(256).
:- ensure_loaded('parschema.pfl'). :- ensure_loaded('parschema.pfl').
:- set_solver(hve).
professor(p0). professor(p0).
professor(p1). professor(p1).
professor(p2). professor(p2).

View File

@ -18,9 +18,6 @@ total_students(1024).
:- ensure_loaded('parschema.pfl'). :- ensure_loaded('parschema.pfl').
:- set_solver(hve).
professor(p0). professor(p0).
professor(p1). professor(p1).
professor(p2). professor(p2).

View File

@ -1,28 +1,26 @@
MARKOV BAYES
5 5
2 2 2 2 2 2 2 2 2 2
5 5
1 0 1 0
1 1 1 1
3 2 0 1 3 0 1 2
2 3 2 2 2 3
2 4 2 2 2 4
2 2
.001 .999 0.001 0.999
2 2
.002 .998 0.002 0.998
8 8
.95 .94 .29 .001 0.95 0.05 0.94 0.06 0.29 0.71 0.001 0.999
.05 .06 .71 .999
4 4
.9 .05 0.9 0.1 0.05 0.95
.1 .95
4 4
.7 .01 0.7 0.3 0.01 0.99
.3 .99

View File

@ -1,35 +0,0 @@
%
% adapted from Hendrik Blockeel's ILP04 paper.
%
:- use_module(library(clpbn)).
cg(X,1,C):-
father(Y,X),
cg(Y,1,C1),cg(Y,2,C2),
parent_cpt(cg(X,1), C1, C2, C).
cg(X,2,C):-
mother(Y,X),
cg(Y,1,C1),cg(Y,2,C2),
parent_cpt(cg(X,2), C1, C2, C).
cg(f,X,C) :-
prior_cpt(cg(f,X),C).
cg(m,X,C) :-
prior_cpt(cg(m,X),C).
prior_cpt(CKEY, C) :-
{ C = CKEY with p([p,w], [0.5,0.5])}.
parent_cpt(CKEY, C1, C2, C) :-
{ C = CKEY with p([p,w], [ 1,0.5,0.5,0.0,
0.0,0.5,0.5, 1],[C1,C2])}.
father(f,s).
mother(m,s).

View File

@ -1,3 +1,8 @@
/*
Model from the paper "First-order
probabilistic inference"
*/
:- use_module(library(pfl)). :- use_module(library(pfl)).
:- set_solver(hve). :- set_solver(hve).
@ -11,14 +16,14 @@
%:- set_solver(lkc). %:- set_solver(lkc).
%:- set_solver(lbp). %:- set_solver(lbp).
:- multifile people/2. :- multifile person/2.
:- multifile ev/1. :- multifile ev/1.
people(joe,nyc). person(joe,nyc).
people(p2, nyc). person(p2, nyc).
people(p3, nyc). person(p3, nyc).
people(p4, nyc). person(p4, nyc).
people(p5, nyc). person(p5, nyc).
ev(descn(p2, fits)). ev(descn(p2, fits)).
ev(descn(p3, fits)). ev(descn(p3, fits)).
@ -26,41 +31,41 @@ ev(descn(p4, fits)).
ev(descn(p5, fits)). ev(descn(p5, fits)).
bayes city_conservativeness(C)::[high,low] ; bayes city_conservativeness(C)::[high,low] ;
cons_table ; cons_table ;
[people(_,C)]. [person(_,C)].
bayes gender(P)::[male,female] ; bayes gender(P)::[male,female] ;
gender_table ; gender_table ;
[people(P,_)]. [person(P,_)].
bayes hair_color(P)::[dark,bright], city_conservativeness(C) ; bayes hair_color(P)::[dark,bright], city_conservativeness(C) ;
hair_color_table ; hair_color_table ;
[people(P,C)]. [person(P,C)].
bayes car_color(P)::[dark,bright], hair_color(P) ; bayes car_color(P)::[dark,bright], hair_color(P) ;
car_color_table ; car_color_table ;
[people(P,_)]. [person(P,_)].
bayes height(P)::[tall,short], gender(P) ; bayes height(P)::[tall,short], gender(P) ;
height_table ; height_table ;
[people(P,_)]. [person(P,_)].
bayes shoe_size(P)::[big,small], height(P) ; bayes shoe_size(P)::[big,small], height(P) ;
shoe_size_table ; shoe_size_table ;
[people(P,_)]. [person(P,_)].
bayes guilty(P)::[y,n] ; bayes guilty(P)::[y,n] ;
guilty_table ; guilty_table ;
[people(P,_)]. [person(P,_)].
bayes descn(P)::[fits,dont_fit], car_color(P), bayes descn(P)::[fits,dont_fit], car_color(P),
hair_color(P), height(P), guilty(P) ; hair_color(P), height(P), guilty(P) ;
descn_table ; descn_table ;
[people(P,_)]. [person(P,_)].
bayes witness(C), descn(Joe), descn(P2) ; bayes witness(C), descn(Joe), descn(P2) ;
witness_table ; witness_table ;
[people(_,C), Joe=joe, P2=p2]. [person(_,C), Joe=joe, P2=p2].
cons_table( cons_table(
@ -75,17 +80,17 @@ hair_color_table(
/* high low */ /* high low */
/* dark */ [ 0.05, 0.1, /* dark */ [ 0.05, 0.1,
/* bright */ 0.95, 0.9 ]). /* bright */ 0.95, 0.9 ]).
car_color_table( car_color_table(
/* dark bright */ /* dark bright */
/* dark */ [ 0.9, 0.2, /* dark */ [ 0.9, 0.2,
/* bright */ 0.1, 0.8 ]). /* bright */ 0.1, 0.8 ]).
height_table( height_table(
/* male female */ /* male female */
/* tall */ [ 0.6, 0.4, /* tall */ [ 0.6, 0.4,
/* short */ 0.4, 0.6 ]). /* short */ 0.4, 0.6 ]).
shoe_size_table( shoe_size_table(
/* tall short */ /* tall short */
/* big */ [ 0.9, 0.1, /* big */ [ 0.9, 0.1,
@ -99,7 +104,7 @@ descn_table(
/* car_color(P), hair_color(P), height(P), guilty(P) */ /* car_color(P), hair_color(P), height(P), guilty(P) */
/* fits */ [ 0.99, 0.5, 0.23, 0.88, 0.41, 0.3, 0.76, 0.87, /* fits */ [ 0.99, 0.5, 0.23, 0.88, 0.41, 0.3, 0.76, 0.87,
/* fits */ 0.44, 0.43, 0.29, 0.72, 0.23, 0.91, 0.95, 0.92, /* fits */ 0.44, 0.43, 0.29, 0.72, 0.23, 0.91, 0.95, 0.92,
/* dont_fit */ 0.01, 0.5, 0.77, 0.12, 0.59, 0.7, 0.24, 0.13, /* dont_fit */ 0.01, 0.5, 0.77, 0.12, 0.59, 0.7, 0.24, 0.13,
/* dont_fit */ 0.56, 0.57, 0.71, 0.28, 0.77, 0.09, 0.05, 0.08 ]). /* dont_fit */ 0.56, 0.57, 0.71, 0.28, 0.77, 0.09, 0.05, 0.08 ]).
witness_table( witness_table(
@ -109,20 +114,20 @@ witness_table(
runall(G, Wrapper) :- runall(G, Wrapper) :-
findall(G, Wrapper, L), findall(G, Wrapper, L),
execute_all(L). execute_all(L).
execute_all([]). execute_all([]).
execute_all(G.L) :- execute_all(G.L) :-
call(G), call(G),
execute_all(L). execute_all(L).
is_joe_guilty(Guilty) :- is_joe_guilty(Guilty) :-
witness(nyc, t), witness(nyc, t),
runall(X, ev(X)), runall(X, ev(X)),
guilty(joe, Guilty). guilty(joe, Guilty).
% ?- is_joe_guilty(Guilty). % ?- is_joe_guilty(Guilty).

View File

@ -1,3 +1,8 @@
/*
Model from the paper "Lifted Probabilistic
Inference with Counting Formulas"
*/
:- use_module(library(pfl)). :- use_module(library(pfl)).
:- set_solver(hve). :- set_solver(hve).
@ -10,31 +15,31 @@
%:- set_solver(lkc). %:- set_solver(lkc).
%:- set_solver(lbp). %:- set_solver(lbp).
:- multifile c/2. :- multifile reg/2.
c(p1,w1). reg(p1,w1).
c(p1,w2). reg(p1,w2).
c(p1,w3). reg(p1,w3).
c(p2,w1). reg(p2,w1).
c(p2,w2). reg(p2,w2).
c(p2,w3). reg(p2,w3).
c(p3,w1). reg(p3,w1).
c(p3,w2). reg(p3,w2).
c(p3,w3). reg(p3,w3).
c(p4,w1). reg(p4,w1).
c(p4,w2). reg(p4,w2).
c(p4,w3). reg(p4,w3).
c(p5,w1). reg(p5,w1).
c(p5,w2). reg(p5,w2).
c(p5,w3). reg(p5,w3).
markov attends(P), hot(W) ; markov attends(P), hot(W) ;
[0.2, 0.8, 0.8, 0.8] ; [0.2, 0.8, 0.8, 0.8] ;
[c(P,W)]. [reg(P,W)].
markov attends(P), series ; markov attends(P), series ;
[0.501, 0.499, 0.499, 0.499] ; [0.501, 0.499, 0.499, 0.499] ;
[c(P,_)]. [reg(P,_)].
?- series(X). % ?- series(X).

View File

@ -2,16 +2,17 @@
/* We do not consider aggregates yet. */ /* We do not consider aggregates yet. */
:- use_module(library(clpbn/learning/em)).
:- [pos:train]. :- [pos:train].
:- ['../../examples/School/parschema.pfl']. :- ['../../examples/School/parschema.pfl'].
:- use_module(library(clpbn/learning/em)). :- set_em_solver(ve).
%:- set_em_solver(hve).
%:- clpbn:set_clpbn_flag(em_solver,gibbs). %:- set_em_solver(bdd).
%:- clpbn:set_clpbn_flag(em_solver,jt). %:- set_em_solver(bp).
:- clpbn:set_clpbn_flag(em_solver,ve). %:- set_em_solver(cbp).
%:- clpbn:set_clpbn_flag(em_solver,bp).
debug_school :- debug_school :-
graph(L), graph(L),

View File

@ -4,12 +4,11 @@
:- use_module(library(clpbn/learning/em)). :- use_module(library(clpbn/learning/em)).
%:- clpbn:set_clpbn_flag(em_solver,gibbs). :- set_em_solver(ve).
%:- clpbn:set_clpbn_flag(em_solver,jt). %:- set_em_solver(hve).
%:- clpbn:set_clpbn_flag(em_solver,hve). %:- set_em_solver(bdd).
:- clpbn:set_clpbn_flag(em_solver,ve). %:- set_em_solver(bp).
%:- clpbn:set_clpbn_flag(em_solver,bp). %:- set_em_solver(cbp).
%:- clpbn:set_clpbn_flag(em_solver,bdd).
professor(p0). professor(p0).
professor(p1). professor(p1).

View File

@ -2,16 +2,17 @@
/* We do not consider aggregates yet. */ /* We do not consider aggregates yet. */
:- use_module(library(clpbn/learning/em)).
:- [pos:train]. :- [pos:train].
:- ['../../examples/School/school_32']. :- ['../../examples/School/school_32'].
:- use_module(library(clpbn/learning/em)). :- set_em_solver(ve).
%:- set_em_solver(hve).
%:- clpbn:set_clpbn_flag(em_solver,gibbs). %:- set_em_solver(bdd).
%:- clpbn:set_clpbn_flag(em_solver,jt). %:- set_em_solver(bp).
% :- clpbn:set_clpbn_flag(em_solver,ve). %:- set_em_solver(cbp).
:- clpbn:set_clpbn_flag(em_solver,bp).
timed_main :- timed_main :-
statistics(runtime, _), statistics(runtime, _),

View File

@ -4,12 +4,11 @@
:- use_module(library(clpbn/learning/em)). :- use_module(library(clpbn/learning/em)).
%:- set_pfl_flag(em_solver,gibbs). :- set_em_solver(ve).
%:- set_pfl_flag(em_solver,jt). %:- set_em_solver(hve).
%:- set_pfl_flag(em_solver,hve). %:- set_em_solver(bdd).
%:- set_pfl_flag(em_solver,bp). %:- set_em_solver(bp).
%:- set_pfl_flag(em_solver,ve). %:- set_em_solver(cbp).
:- set_pfl_flag(em_solver,bdd).
:- dynamic id/1. :- dynamic id/1.

View File

@ -1,38 +0,0 @@
:- use_module(library(pfl)).
:- set_solver(hve).
%:- set_solver(ve).
%:- set_solver(jt).
%:- set_solver(bdd).
%:- set_solver(bp).
%:- set_solver(cbp).
%:- set_solver(gibbs).
%:- set_solver(lve).
%:- set_solver(lkc).
%:- set_solver(lbp).
:- multifile people/1.
people @ 5.
people(X,Y) :-
people(X),
people(Y),
X \== Y.
markov smokes(X) ; [1.0, 4.0552]; [people(X)].
markov cancer(X) ; [1.0, 9.9742]; [people(X)].
markov friends(X,Y) ; [1.0, 99.48432] ; [people(X,Y)].
markov smokes(X), cancer(X) ;
[4.48169, 4.48169, 1.0, 4.48169] ;
[people(X)].
markov friends(X,Y), smokes(X), smokes(Y) ;
[3.004166, 3.004166, 3.004166, 3.004166, 3.004166, 1.0, 1.0, 3.004166] ;
[people(X,Y)].
% ?- friends(p1,p2,X).

View File

@ -1,38 +0,0 @@
:- use_module(library(pfl)).
:- set_solver(hve).
%:- set_solver(ve).
%:- set_solver(jt).
%:- set_solver(bdd).
%:- set_solver(bp).
%:- set_solver(cbp).
%:- set_solver(gibbs).
%:- set_solver(lve).
%:- set_solver(lkc).
%:- set_solver(lbp).
:- multifile people/1.
people @ 5.
people(X,Y) :-
people(X),
people(Y).
% X \== Y.
markov smokes(X) ; [1.0, 4.0552]; [people(X)].
markov asthma(X) ; [1.0, 9.9742] ; [people(X)].
markov friends(X,Y) ; [1.0, 99.48432] ; [people(X,Y)].
markov asthma(X), smokes(X) ;
[4.48169, 4.48169, 1.0, 4.48169] ;
[people(X)].
markov asthma(X), friends(X,Y), smokes(Y) ;
[3.004166, 3.004166, 3.004166, 3.004166, 3.004166, 1.0, 1.0, 3.004166] ;
[people(X,Y)].
% ?- smokes(p1,t), smokes(p2,t), friends(p1,p2,X).

View File

@ -0,0 +1,44 @@
/*
Model from the paper "Lifted First-Order
Belief Propagation"
*/
:- use_module(library(pfl)).
:- set_solver(hve).
%:- set_solver(ve).
%:- set_solver(jt).
%:- set_solver(bdd).
%:- set_solver(bp).
%:- set_solver(cbp).
%:- set_solver(gibbs).
%:- set_solver(lve).
%:- set_solver(lkc).
%:- set_solver(lbp).
:- multifile person/1.
person @ 5.
person(X,Y) :-
person(X),
person(Y)
% ,X \== Y
.
markov smokes(X) ; [1.0, 4.0552]; [person(X)].
markov cancer(X) ; [1.0, 9.9742]; [person(X)].
markov friends(X,Y) ; [1.0, 99.48432] ; [person(X,Y)].
markov smokes(X), cancer(X) ;
[4.48169, 4.48169, 1.0, 4.48169] ;
[person(X)].
markov friends(X,Y), smokes(X), smokes(Y) ;
[3.004166, 3.004166, 3.004166, 3.004166, 3.004166, 1.0, 1.0, 3.004166] ;
[person(X,Y)].
% ?- friends(p1,p2,X).

View File

@ -0,0 +1,44 @@
/*
Model from the paper "Lifted Inference Seen
from the Other Side: The Tractable Features"
*/
:- use_module(library(pfl)).
:- set_solver(hve).
%:- set_solver(ve).
%:- set_solver(jt).
%:- set_solver(bdd).
%:- set_solver(bp).
%:- set_solver(cbp).
%:- set_solver(gibbs).
%:- set_solver(lve).
%:- set_solver(lkc).
%:- set_solver(lbp).
:- multifile person/1.
person @ 5.
person(X,Y) :-
person(X),
person(Y)
% ,X \== Y
.
markov smokes(X) ; [1.0, 4.0552]; [person(X)].
markov asthma(X) ; [1.0, 9.9742] ; [person(X)].
markov friends(X,Y) ; [1.0, 99.48432] ; [person(X,Y)].
markov asthma(X), smokes(X) ;
[4.48169, 4.48169, 1.0, 4.48169] ;
[person(X)].
markov asthma(X), friends(X,Y), smokes(Y) ;
[3.004166, 3.004166, 3.004166, 3.004166, 3.004166, 1.0, 1.0, 3.004166] ;
[person(X,Y)].
% ?- smokes(p1,t), smokes(p2,t), friends(p1,p2,X).

View File

@ -24,16 +24,16 @@ cloudy_table(
0.5 ]). 0.5 ]).
sprinkler_table( sprinkler_table(
[ 0.5, 0.9, [ 0.1, 0.5,
0.5, 0.1 ]). 0.9, 0.5 ]).
rain_table( rain_table(
[ 0.8, 0.2, [ 0.8, 0.2,
0.2, 0.8 ]). 0.2, 0.8 ]).
wet_grass_table( wet_grass_table(
[ 1.0, 0.1, 0.1, 0.01, [ 0.99, 0.9, 0.9, 0.0,
0.0, 0.9, 0.9, 0.99 ]). 0.01, 0.1, 0.1, 1.0 ]).
% ?- wet_grass(X). % ?- wet_grass(X).

View File

@ -1,3 +1,8 @@
/*
Model from the paper "Lifted Probabilistic
Inference with Counting Formulas"
*/
:- use_module(library(pfl)). :- use_module(library(pfl)).
:- set_solver(hve). :- set_solver(hve).
@ -11,23 +16,23 @@
%:- set_solver(lkc). %:- set_solver(lkc).
%:- set_solver(lbp). %:- set_solver(lbp).
:- multifile people/1. :- multifile person/1.
people @ 5. person @ 5.
markov attends(P), attr1 ; [0.7, 0.3, 0.3, 0.3] ; [people(P)]. markov attends(P), attr1 ; [0.7, 0.3, 0.3, 0.3] ; [person(P)].
markov attends(P), attr2 ; [0.7, 0.3, 0.3, 0.3] ; [people(P)]. markov attends(P), attr2 ; [0.7, 0.3, 0.3, 0.3] ; [person(P)].
markov attends(P), attr3 ; [0.7, 0.3, 0.3, 0.3] ; [people(P)]. markov attends(P), attr3 ; [0.7, 0.3, 0.3, 0.3] ; [person(P)].
markov attends(P), attr4 ; [0.7, 0.3, 0.3, 0.3] ; [people(P)]. markov attends(P), attr4 ; [0.7, 0.3, 0.3, 0.3] ; [person(P)].
markov attends(P), attr5 ; [0.7, 0.3, 0.3, 0.3] ; [people(P)]. markov attends(P), attr5 ; [0.7, 0.3, 0.3, 0.3] ; [person(P)].
markov attends(P), attr6 ; [0.7, 0.3, 0.3, 0.3] ; [people(P)]. markov attends(P), attr6 ; [0.7, 0.3, 0.3, 0.3] ; [person(P)].
markov attends(P), series ; [0.501, 0.499, 0.499, 0.499] ; [people(P)]. markov attends(P), series ; [0.501, 0.499, 0.499, 0.499] ; [person(P)].
% ?- series(X). % ?- series(X).

View File

@ -1,12 +1,6 @@
#include <cstdlib>
#include <cassert> #include <cassert>
#include <iostream>
#include <fstream>
#include <sstream>
#include "BayesBall.h" #include "BayesBall.h"
#include "Util.h"
FactorGraph* FactorGraph*

View File

@ -4,7 +4,6 @@
#include <vector> #include <vector>
#include <queue> #include <queue>
#include <list> #include <list>
#include <map>
#include "FactorGraph.h" #include "FactorGraph.h"
#include "BayesBallGraph.h" #include "BayesBallGraph.h"
@ -15,8 +14,8 @@ using namespace std;
struct ScheduleInfo struct ScheduleInfo
{ {
ScheduleInfo (BBNode* n, bool vfp, bool vfc) : ScheduleInfo (BBNode* n, bool vfp, bool vfc)
node(n), visitedFromParent(vfp), visitedFromChild(vfc) { } : node(n), visitedFromParent(vfp), visitedFromChild(vfc) { }
BBNode* node; BBNode* node;
bool visitedFromParent; bool visitedFromParent;
@ -30,7 +29,7 @@ typedef queue<ScheduleInfo, list<ScheduleInfo>> Scheduling;
class BayesBall class BayesBall
{ {
public: public:
BayesBall (FactorGraph& fg) BayesBall (FactorGraph& fg)
: fg_(fg) , dag_(fg.getStructure()) : fg_(fg) , dag_(fg.getStructure())
{ {
dag_.clear(); dag_.clear();
@ -63,7 +62,7 @@ inline void
BayesBall::scheduleParents (const BBNode* n, Scheduling& sch) const BayesBall::scheduleParents (const BBNode* n, Scheduling& sch) const
{ {
const vector<BBNode*>& ps = n->parents(); const vector<BBNode*>& ps = n->parents();
for (vector<BBNode*>::const_iterator it = ps.begin(); for (vector<BBNode*>::const_iterator it = ps.begin();
it != ps.end(); ++it) { it != ps.end(); ++it) {
sch.push (ScheduleInfo (*it, false, true)); sch.push (ScheduleInfo (*it, false, true));
} }

View File

@ -2,8 +2,8 @@
#include <cassert> #include <cassert>
#include <iostream> #include <iostream>
#include <fstream>
#include <sstream> #include <sstream>
#include <fstream>
#include "BayesBallGraph.h" #include "BayesBallGraph.h"
#include "Util.h" #include "Util.h"
@ -79,9 +79,8 @@ BayesBallGraph::exportToGraphViz (const char* fileName)
{ {
ofstream out (fileName); ofstream out (fileName);
if (!out.is_open()) { if (!out.is_open()) {
cerr << "error: cannot open file to write at " ; cerr << "Error: couldn't open file '" << fileName << "'." ;
cerr << "BayesBallGraph::exportToDotFile()" << endl; return;
abort();
} }
out << "digraph {" << endl; out << "digraph {" << endl;
out << "ranksep=1" << endl; out << "ranksep=1" << endl;

View File

@ -2,9 +2,7 @@
#define HORUS_BAYESBALLGRAPH_H #define HORUS_BAYESBALLGRAPH_H
#include <vector> #include <vector>
#include <queue> #include <unordered_map>
#include <list>
#include <map>
#include "Var.h" #include "Var.h"
#include "Horus.h" #include "Horus.h"
@ -14,7 +12,7 @@ using namespace std;
class BBNode : public Var class BBNode : public Var
{ {
public: public:
BBNode (Var* v) : Var (v) , visited_(false), BBNode (Var* v) : Var (v), visited_(false),
markedOnTop_(false), markedOnBottom_(false) { } markedOnTop_(false), markedOnBottom_(false) { }
const vector<BBNode*>& childs (void) const { return childs_; } const vector<BBNode*>& childs (void) const { return childs_; }
@ -30,15 +28,15 @@ class BBNode : public Var
void addChild (BBNode* c) { childs_.push_back (c); } void addChild (BBNode* c) { childs_.push_back (c); }
bool isVisited (void) const { return visited_; } bool isVisited (void) const { return visited_; }
void setAsVisited (void) { visited_ = true; } void setAsVisited (void) { visited_ = true; }
bool isMarkedOnTop (void) const { return markedOnTop_; } bool isMarkedOnTop (void) const { return markedOnTop_; }
void markOnTop (void) { markedOnTop_ = true; } void markOnTop (void) { markedOnTop_ = true; }
bool isMarkedOnBottom (void) const { return markedOnBottom_; } bool isMarkedOnBottom (void) const { return markedOnBottom_; }
void markOnBottom (void) { markedOnBottom_ = true; } void markOnBottom (void) { markedOnBottom_ = true; }
void clear (void) { visited_ = markedOnTop_ = markedOnBottom_ = false; } void clear (void) { visited_ = markedOnTop_ = markedOnBottom_ = false; }
@ -63,7 +61,7 @@ class BayesBallGraph
void addEdge (VarId vid1, VarId vid2); void addEdge (VarId vid1, VarId vid2);
const BBNode* getNode (VarId vid) const; const BBNode* getNode (VarId vid) const;
BBNode* getNode (VarId vid); BBNode* getNode (VarId vid);
bool empty (void) const { return nodes_.empty(); } bool empty (void) const { return nodes_.empty(); }

View File

@ -1,17 +1,19 @@
#include <cassert> #include <cassert>
#include <limits>
#include <algorithm> #include <algorithm>
#include <iostream> #include <iostream>
#include "BeliefProp.h" #include "BeliefProp.h"
#include "FactorGraph.h"
#include "Factor.h"
#include "Indexer.h" #include "Indexer.h"
#include "Horus.h" #include "Horus.h"
double BeliefProp::accuracy_ = 0.0001;
unsigned BeliefProp::maxIter_ = 1000;
MsgSchedule BeliefProp::schedule_ = MsgSchedule::SEQ_FIXED;
BeliefProp::BeliefProp (const FactorGraph& fg) : GroundSolver (fg) BeliefProp::BeliefProp (const FactorGraph& fg) : GroundSolver (fg)
{ {
runned_ = false; runned_ = false;
@ -50,16 +52,15 @@ BeliefProp::printSolverFlags (void) const
{ {
stringstream ss; stringstream ss;
ss << "belief propagation [" ; ss << "belief propagation [" ;
ss << "schedule=" ; ss << "bp_msg_schedule=" ;
typedef BpOptions::Schedule Sch; switch (schedule_) {
switch (BpOptions::schedule) { case MsgSchedule::SEQ_FIXED: ss << "seq_fixed"; break;
case Sch::SEQ_FIXED: ss << "seq_fixed"; break; case MsgSchedule::SEQ_RANDOM: ss << "seq_random"; break;
case Sch::SEQ_RANDOM: ss << "seq_random"; break; case MsgSchedule::PARALLEL: ss << "parallel"; break;
case Sch::PARALLEL: ss << "parallel"; break; case MsgSchedule::MAX_RESIDUAL: ss << "max_residual"; break;
case Sch::MAX_RESIDUAL: ss << "max_residual"; break;
} }
ss << ",max_iter=" << Util::toString (BpOptions::maxIter); ss << ",bp_max_iter=" << Util::toString (maxIter_);
ss << ",accuracy=" << Util::toString (BpOptions::accuracy); ss << ",bp_accuracy=" << Util::toString (accuracy_);
ss << ",log_domain=" << Util::toString (Globals::logDomain); ss << ",log_domain=" << Util::toString (Globals::logDomain);
ss << "]" ; ss << "]" ;
cout << ss.str() << endl; cout << ss.str() << endl;
@ -146,7 +147,7 @@ BeliefProp::getFactorJoint (
if (Globals::logDomain) { if (Globals::logDomain) {
Util::exp (jointDist); Util::exp (jointDist);
} }
return jointDist; return jointDist;
} }
@ -156,21 +157,21 @@ BeliefProp::runSolver (void)
{ {
initializeSolver(); initializeSolver();
nIters_ = 0; nIters_ = 0;
while (!converged() && nIters_ < BpOptions::maxIter) { while (!converged() && nIters_ < maxIter_) {
nIters_ ++; nIters_ ++;
if (Globals::verbosity > 1) { if (Globals::verbosity > 1) {
Util::printHeader (string ("Iteration ") + Util::toString (nIters_)); Util::printHeader (string ("Iteration ") + Util::toString (nIters_));
} }
switch (BpOptions::schedule) { switch (schedule_) {
case BpOptions::Schedule::SEQ_RANDOM: case MsgSchedule::SEQ_RANDOM:
std::random_shuffle (links_.begin(), links_.end()); std::random_shuffle (links_.begin(), links_.end());
// no break // no break
case BpOptions::Schedule::SEQ_FIXED: case MsgSchedule::SEQ_FIXED:
for (size_t i = 0; i < links_.size(); i++) { for (size_t i = 0; i < links_.size(); i++) {
calculateAndUpdateMessage (links_[i]); calculateAndUpdateMessage (links_[i]);
} }
break; break;
case BpOptions::Schedule::PARALLEL: case MsgSchedule::PARALLEL:
for (size_t i = 0; i < links_.size(); i++) { for (size_t i = 0; i < links_.size(); i++) {
calculateMessage (links_[i]); calculateMessage (links_[i]);
} }
@ -178,14 +179,14 @@ BeliefProp::runSolver (void)
updateMessage(links_[i]); updateMessage(links_[i]);
} }
break; break;
case BpOptions::Schedule::MAX_RESIDUAL: case MsgSchedule::MAX_RESIDUAL:
maxResidualSchedule(); maxResidualSchedule();
break; break;
} }
} }
if (Globals::verbosity > 0) { if (Globals::verbosity > 0) {
if (nIters_ < BpOptions::maxIter) { if (nIters_ < maxIter_) {
cout << "Belief propagation converged in " ; cout << "Belief propagation converged in " ;
cout << nIters_ << " iterations" << endl; cout << nIters_ << " iterations" << endl;
} else { } else {
cout << "The maximum number of iterations was hit, terminating..." ; cout << "The maximum number of iterations was hit, terminating..." ;
@ -236,7 +237,7 @@ BeliefProp::maxResidualSchedule (void)
SortedOrder::iterator it = sortedOrder_.begin(); SortedOrder::iterator it = sortedOrder_.begin();
BpLink* link = *it; BpLink* link = *it;
if (link->residual() < BpOptions::accuracy) { if (link->residual() < accuracy_) {
return; return;
} }
updateMessage (link); updateMessage (link);
@ -410,7 +411,7 @@ BeliefProp::initializeSolver (void)
bool bool
BeliefProp::converged (void) BeliefProp::converged (void)
{ {
if (links_.size() == 0) { if (links_.empty()) {
return true; return true;
} }
if (nIters_ == 0) { if (nIters_ == 0) {
@ -426,9 +427,9 @@ BeliefProp::converged (void)
return false; return false;
} }
bool converged = true; bool converged = true;
if (BpOptions::schedule == BpOptions::Schedule::MAX_RESIDUAL) { if (schedule_ == MsgSchedule::MAX_RESIDUAL) {
double maxResidual = (*(sortedOrder_.begin()))->residual(); double maxResidual = (*(sortedOrder_.begin()))->residual();
if (maxResidual > BpOptions::accuracy) { if (maxResidual > accuracy_) {
converged = false; converged = false;
} else { } else {
converged = true; converged = true;
@ -439,7 +440,7 @@ BeliefProp::converged (void)
if (Globals::verbosity > 1) { if (Globals::verbosity > 1) {
cout << links_[i]->toString() + " residual = " << residual << endl; cout << links_[i]->toString() + " residual = " << residual << endl;
} }
if (residual > BpOptions::accuracy) { if (residual > accuracy_) {
converged = false; converged = false;
if (Globals::verbosity < 2) { if (Globals::verbosity < 2) {
break; break;
@ -459,7 +460,7 @@ void
BeliefProp::printLinkInformation (void) const BeliefProp::printLinkInformation (void) const
{ {
for (size_t i = 0; i < links_.size(); i++) { for (size_t i = 0; i < links_.size(); i++) {
BpLink* l = links_[i]; BpLink* l = links_[i];
cout << l->toString() << ":" << endl; cout << l->toString() << ":" << endl;
cout << " curr msg = " ; cout << " curr msg = " ;
cout << l->message() << endl; cout << l->message() << endl;

View File

@ -3,21 +3,29 @@
#include <set> #include <set>
#include <vector> #include <vector>
#include <sstream> #include <sstream>
#include "GroundSolver.h" #include "GroundSolver.h"
#include "Factor.h"
#include "FactorGraph.h" #include "FactorGraph.h"
#include "Util.h"
using namespace std; using namespace std;
enum MsgSchedule {
SEQ_FIXED,
SEQ_RANDOM,
PARALLEL,
MAX_RESIDUAL
};
class BpLink class BpLink
{ {
public: public:
BpLink (FacNode* fn, VarNode* vn) BpLink (FacNode* fn, VarNode* vn)
{ {
fac_ = fn; fac_ = fn;
var_ = vn; var_ = vn;
v1_.resize (vn->range(), LogAware::log (1.0 / vn->range())); v1_.resize (vn->range(), LogAware::log (1.0 / vn->range()));
@ -43,10 +51,10 @@ class BpLink
void updateResidual (void) void updateResidual (void)
{ {
residual_ = LogAware::getMaxNorm (v1_,v2_); residual_ = LogAware::getMaxNorm (v1_, v2_);
} }
virtual void updateMessage (void) virtual void updateMessage (void)
{ {
swap (currMsg_, nextMsg_); swap (currMsg_, nextMsg_);
} }
@ -59,7 +67,7 @@ class BpLink
ss << var_->label(); ss << var_->label();
return ss.str(); return ss.str();
} }
protected: protected:
FacNode* fac_; FacNode* fac_;
VarNode* var_; VarNode* var_;
@ -68,6 +76,9 @@ class BpLink
Params* currMsg_; Params* currMsg_;
Params* nextMsg_; Params* nextMsg_;
double residual_; double residual_;
private:
DISALLOW_COPY_AND_ASSIGN (BpLink);
}; };
typedef vector<BpLink*> BpLinks; typedef vector<BpLink*> BpLinks;
@ -76,10 +87,12 @@ typedef vector<BpLink*> BpLinks;
class SPNodeInfo class SPNodeInfo
{ {
public: public:
SPNodeInfo (void) { }
void addBpLink (BpLink* link) { links_.push_back (link); } void addBpLink (BpLink* link) { links_.push_back (link); }
const BpLinks& getLinks (void) { return links_; } const BpLinks& getLinks (void) { return links_; }
private: private:
BpLinks links_; BpLinks links_;
DISALLOW_COPY_AND_ASSIGN (SPNodeInfo);
}; };
@ -97,23 +110,21 @@ class BeliefProp : public GroundSolver
virtual Params getPosterioriOf (VarId); virtual Params getPosterioriOf (VarId);
virtual Params getJointDistributionOf (const VarIds&); virtual Params getJointDistributionOf (const VarIds&);
protected:
void runSolver (void);
virtual void createLinks (void);
virtual void maxResidualSchedule (void);
virtual void calcFactorToVarMsg (BpLink*);
virtual Params getVarToFactorMsg (const BpLink*) const;
virtual Params getJointByConditioning (const VarIds&) const;
public:
Params getFactorJoint (FacNode* fn, const VarIds&); Params getFactorJoint (FacNode* fn, const VarIds&);
static double accuracy (void) { return accuracy_; }
static void setAccuracy (double acc) { accuracy_ = acc; }
static unsigned maxIterations (void) { return maxIter_; }
static void setMaxIterations (unsigned mi) { maxIter_ = mi; }
static MsgSchedule msgSchedule (void) { return schedule_; }
static void setMsgSchedule (MsgSchedule sch) { schedule_ = sch; }
protected: protected:
SPNodeInfo* ninf (const VarNode* var) const SPNodeInfo* ninf (const VarNode* var) const
{ {
@ -164,6 +175,18 @@ class BeliefProp : public GroundSolver
} }
}; };
void runSolver (void);
virtual void createLinks (void);
virtual void maxResidualSchedule (void);
virtual void calcFactorToVarMsg (BpLink*);
virtual Params getVarToFactorMsg (const BpLink*) const;
virtual Params getJointByConditioning (const VarIds&) const;
BpLinks links_; BpLinks links_;
unsigned nIters_; unsigned nIters_;
vector<SPNodeInfo*> varsI_; vector<SPNodeInfo*> varsI_;
@ -176,12 +199,18 @@ class BeliefProp : public GroundSolver
typedef unordered_map<BpLink*, SortedOrder::iterator> BpLinkMap; typedef unordered_map<BpLink*, SortedOrder::iterator> BpLinkMap;
BpLinkMap linkMap_; BpLinkMap linkMap_;
static double accuracy_;
static unsigned maxIter_;
static MsgSchedule schedule_;
private: private:
void initializeSolver (void); void initializeSolver (void);
bool converged (void); bool converged (void);
virtual void printLinkInformation (void) const; virtual void printLinkInformation (void) const;
DISALLOW_COPY_AND_ASSIGN (BeliefProp);
}; };
#endif // HORUS_BELIEFPROP_H #endif // HORUS_BELIEFPROP_H

View File

@ -120,7 +120,7 @@ CTNode::copySubtree (const CTNode* root1)
chIt != n1->childs().end(); ++ chIt) { chIt != n1->childs().end(); ++ chIt) {
CTNode* chCopy = new CTNode (**chIt); CTNode* chCopy = new CTNode (**chIt);
n2->childs().insert_sorted (chCopy); n2->childs().insert_sorted (chCopy);
if ((*chIt)->nrChilds() != 0) { if ((*chIt)->nrChilds() > 0) {
stack.push_back (StackPair (*chIt, chCopy)); stack.push_back (StackPair (*chIt, chCopy));
} }
} }
@ -190,7 +190,7 @@ ConstraintTree::ConstraintTree (
ConstraintTree::ConstraintTree (vector<vector<string>> names) ConstraintTree::ConstraintTree (vector<vector<string>> names)
{ {
assert (names.empty() == false); assert (names.empty() == false);
assert (names.front().empty() == false); assert (names.front().empty() == false);
unsigned nrLvs = names[0].size(); unsigned nrLvs = names[0].size();
for (size_t i = 0; i < nrLvs; i++) { for (size_t i = 0; i < nrLvs; i++) {
logVars_.push_back (LogVar (i)); logVars_.push_back (LogVar (i));
@ -201,7 +201,7 @@ ConstraintTree::ConstraintTree (vector<vector<string>> names)
Tuple t; Tuple t;
for (size_t j = 0; j < names[i].size(); j++) { for (size_t j = 0; j < names[i].size(); j++) {
assert (names[i].size() == nrLvs); assert (names[i].size() == nrLvs);
t.push_back (LiftedUtils::getSymbol (names[i][j])); t.push_back (LiftedUtils::getSymbol (names[i][j]));
} }
addTuple (t); addTuple (t);
} }
@ -266,7 +266,7 @@ ConstraintTree::moveToTop (const LogVars& lvs)
assert (pos != logVars_.size()); assert (pos != logVars_.size());
for (size_t j = pos; j-- > i; ) { for (size_t j = pos; j-- > i; ) {
swapLogVar (logVars_[j]); swapLogVar (logVars_[j]);
} }
} }
} }
@ -318,7 +318,7 @@ ConstraintTree::join (ConstraintTree* ct, bool oneTwoOne)
} else { } else {
moveToTop (intersect.elements()); moveToTop (intersect.elements());
ct->moveToTop (intersect.elements()); ct->moveToTop (intersect.elements());
Tuples tuples; Tuples tuples;
CTNodes appendNodes; CTNodes appendNodes;
getTuples (ct->root(), Tuples(), intersect.size(), getTuples (ct->root(), Tuples(), intersect.size(),
@ -455,7 +455,7 @@ ConstraintTree::singletons (void)
if (isSingleton (logVars_[i])) { if (isSingleton (logVars_[i])) {
singletons.insert (logVars_[i]); singletons.insert (logVars_[i]);
} }
} }
return singletons; return singletons;
} }
@ -521,13 +521,12 @@ ConstraintTree::exportToGraphViz (
{ {
ofstream out (fileName); ofstream out (fileName);
if (!out.is_open()) { if (!out.is_open()) {
cerr << "error: cannot open file to write at " ; cerr << "Error: couldn't open file '" << fileName << "'." ;
cerr << "ConstraintTree::exportToDotFile()" << endl; return;
abort();
} }
out << "digraph {" << endl; out << "digraph {" << endl;
ConstraintTree copy (*this); ConstraintTree copy (*this);
// copy.moveToTop (copy.logVarSet_.elements()); copy.moveToTop (copy.logVarSet_.elements());
CTNodes nodes = getNodesBelow (copy.root_); CTNodes nodes = getNodesBelow (copy.root_);
out << "\"" << copy.root_ << "\"" << " [label=\"R\"]" << endl; out << "\"" << copy.root_ << "\"" << " [label=\"R\"]" << endl;
for (CTNodes::const_iterator it = ++ nodes.begin(); for (CTNodes::const_iterator it = ++ nodes.begin();
@ -586,13 +585,13 @@ ConstraintTree::isCountNormalized (const LogVarSet& Ys)
if (countTuples (*it) != count) { if (countTuples (*it) != count) {
return false; return false;
} }
} }
return true; return true;
} }
unsigned unsigned
ConstraintTree::getConditionalCount (const LogVarSet& Ys) ConstraintTree::getConditionalCount (const LogVarSet& Ys)
{ {
assert (isCountNormalized (Ys)); assert (isCountNormalized (Ys));
@ -793,7 +792,7 @@ ConstraintTree::jointCountNormalize (
} }
for (size_t i = 0; i < normCts1.size(); i++) { for (size_t i = 0; i < normCts1.size(); i++) {
unsigned j; unsigned j;
for (j = 0; counts1[i] + counts2[j] != N; j++) ; for (j = 0; counts1[i] + counts2[j] != N; j++) ;
// cout << "joint-count(" << counts1[i] ; // cout << "joint-count(" << counts1[i] ;
// cout << "," << counts2[j] << ")" << endl; // cout << "," << counts2[j] << ")" << endl;
@ -814,10 +813,10 @@ ConstraintTree::jointCountNormalize (
cts[i]->join (exclCt); cts[i]->join (exclCt);
} }
if (excl1 != 0) { if (excl1) {
cts.push_back (excl1); cts.push_back (excl1);
} }
if (excl2 != 0) { if (excl2) {
cts.push_back (excl2); cts.push_back (excl2);
} }
@ -883,7 +882,7 @@ ConstraintTree::ground (LogVar X)
void void
ConstraintTree::copyLogVar (LogVar X_1, LogVar X_2) ConstraintTree::cloneLogVar (LogVar X_1, LogVar X_2)
{ {
moveToBottom ({X_1}); moveToBottom ({X_1});
CTNodes leafs = getNodesAtLevel (logVars_.size()); CTNodes leafs = getNodesAtLevel (logVars_.size());
@ -948,7 +947,7 @@ ConstraintTree::getNodesBelow (CTNode* fromHere) const
CTNodes CTNodes
ConstraintTree::getNodesAtLevel (unsigned level) const ConstraintTree::getNodesAtLevel (unsigned level) const
{ {
assert (level <= logVars_.size()); assert (level <= logVars_.size());
if (level == 0) { if (level == 0) {
@ -1058,7 +1057,7 @@ ConstraintTree::join (
} else { } else {
tupleFounded = join (*it, tuple, currIdx + 1, appendNode); tupleFounded = join (*it, tuple, currIdx + 1, appendNode);
} }
} }
return tupleFounded; return tupleFounded;
} }
@ -1066,14 +1065,14 @@ ConstraintTree::join (
void void
ConstraintTree::getTuples ( ConstraintTree::getTuples (
CTNode* n, CTNode* n,
Tuples currTuples, Tuples currTuples,
unsigned stopLevel, unsigned stopLevel,
Tuples& tuplesCollected, Tuples& tuplesCollected,
CTNodes& continuationNodes) const CTNodes& continuationNodes) const
{ {
if (n->isRoot() == false) { if (n->isRoot() == false) {
if (currTuples.size() == 0) { if (currTuples.empty()) {
currTuples.push_back ({ n->symbol()}); currTuples.push_back ({ n->symbol()});
} else { } else {
for (size_t i = 0; i < currTuples.size(); i++) { for (size_t i = 0; i < currTuples.size(); i++) {
@ -1148,7 +1147,7 @@ ConstraintTree::split (
CTNode* n2, CTNode* n2,
CTChilds& commChilds, CTChilds& commChilds,
CTChilds& exclChilds, CTChilds& exclChilds,
unsigned stopLevel) unsigned stopLevel)
{ {
CTChilds& childs1 = n1->childs(); CTChilds& childs1 = n1->childs();
for (CTChilds::const_iterator chIt1 = childs1.begin(); for (CTChilds::const_iterator chIt1 = childs1.begin();

View File

@ -23,7 +23,6 @@ typedef vector<ConstraintTree*> ConstraintTrees;
class CTNode class CTNode
{ {
public: public:
struct CompareSymbol struct CompareSymbol
{ {
bool operator() (const CTNode* n1, const CTNode* n2) const bool operator() (const CTNode* n1, const CTNode* n2) const
@ -33,11 +32,9 @@ class CTNode
}; };
private: private:
typedef TinySet<CTNode*, CompareSymbol> CTChilds_; typedef TinySet<CTNode*, CompareSymbol> CTChilds_;
public: public:
CTNode (const CTNode& n, const CTChilds_& chs = CTChilds_()) CTNode (const CTNode& n, const CTChilds_& chs = CTChilds_())
: symbol_(n.symbol()), childs_(chs), level_(n.level()) { } : symbol_(n.symbol()), childs_(chs), level_(n.level()) { }
@ -52,12 +49,10 @@ class CTNode
void setSymbol (const Symbol s) { symbol_ = s; } void setSymbol (const Symbol s) { symbol_ = s; }
public:
CTChilds_& childs (void) { return childs_; } CTChilds_& childs (void) { return childs_; }
const CTChilds_& childs (void) const { return childs_; } const CTChilds_& childs (void) const { return childs_; }
size_t nrChilds (void) const { return childs_.size(); } size_t nrChilds (void) const { return childs_.size(); }
bool isRoot (void) const { return level_ == 0; } bool isRoot (void) const { return level_ == 0; }
@ -89,9 +84,11 @@ class CTNode
private: private:
void updateChildLevels (CTNode*, unsigned); void updateChildLevels (CTNode*, unsigned);
Symbol symbol_; Symbol symbol_;
CTChilds_ childs_; CTChilds_ childs_;
unsigned level_; unsigned level_;
DISALLOW_ASSIGN (CTNode);
}; };
ostream& operator<< (ostream &out, const CTNode&); ostream& operator<< (ostream &out, const CTNode&);
@ -108,7 +105,7 @@ class ConstraintTree
ConstraintTree (const LogVars&); ConstraintTree (const LogVars&);
ConstraintTree (const LogVars&, const Tuples&); ConstraintTree (const LogVars&, const Tuples&);
ConstraintTree (vector<vector<string>> names); ConstraintTree (vector<vector<string>> names);
ConstraintTree (const ConstraintTree&); ConstraintTree (const ConstraintTree&);
@ -121,7 +118,7 @@ class ConstraintTree
~ConstraintTree (void); ~ConstraintTree (void);
CTNode* root (void) const { return root_; } CTNode* root (void) const { return root_; }
bool empty (void) const { return root_->childs().empty(); } bool empty (void) const { return root_->childs().empty(); }
const LogVars& logVars (void) const const LogVars& logVars (void) const
@ -135,17 +132,17 @@ class ConstraintTree
assert (LogVarSet (logVars_) == logVarSet_); assert (LogVarSet (logVars_) == logVarSet_);
return logVarSet_; return logVarSet_;
} }
size_t nrLogVars (void) const size_t nrLogVars (void) const
{ {
return logVars_.size(); return logVars_.size();
assert (LogVarSet (logVars_) == logVarSet_); assert (LogVarSet (logVars_) == logVarSet_);
} }
void addTuple (const Tuple&); void addTuple (const Tuple&);
bool containsTuple (const Tuple&); bool containsTuple (const Tuple&);
void moveToTop (const LogVars&); void moveToTop (const LogVars&);
void moveToBottom (const LogVars&); void moveToBottom (const LogVars&);
@ -159,7 +156,7 @@ class ConstraintTree
void applySubstitution (const Substitution&); void applySubstitution (const Substitution&);
void project (const LogVarSet&); void project (const LogVarSet&);
ConstraintTree projectedCopy (const LogVarSet&); ConstraintTree projectedCopy (const LogVarSet&);
void remove (const LogVarSet&); void remove (const LogVarSet&);
@ -200,10 +197,10 @@ class ConstraintTree
ConstraintTrees ground (LogVar); ConstraintTrees ground (LogVar);
void copyLogVar (LogVar,LogVar); void cloneLogVar (LogVar, LogVar);
ConstraintTree& operator= (const ConstraintTree& ct); ConstraintTree& operator= (const ConstraintTree& ct);
private: private:
unsigned countTuples (const CTNode*) const; unsigned countTuples (const CTNode*) const;

View File

@ -2,7 +2,7 @@
#include "WeightedBp.h" #include "WeightedBp.h"
bool CountingBp::checkForIdenticalFactors = true; bool CountingBp::fif_ = true;
CountingBp::CountingBp (const FactorGraph& fg) CountingBp::CountingBp (const FactorGraph& fg)
@ -36,19 +36,17 @@ CountingBp::printSolverFlags (void) const
{ {
stringstream ss; stringstream ss;
ss << "counting bp [" ; ss << "counting bp [" ;
ss << "schedule=" ; ss << "bp_msg_schedule=" ;
typedef BpOptions::Schedule Sch; switch (WeightedBp::msgSchedule()) {
switch (BpOptions::schedule) { case MsgSchedule::SEQ_FIXED: ss << "seq_fixed"; break;
case Sch::SEQ_FIXED: ss << "seq_fixed"; break; case MsgSchedule::SEQ_RANDOM: ss << "seq_random"; break;
case Sch::SEQ_RANDOM: ss << "seq_random"; break; case MsgSchedule::PARALLEL: ss << "parallel"; break;
case Sch::PARALLEL: ss << "parallel"; break; case MsgSchedule::MAX_RESIDUAL: ss << "max_residual"; break;
case Sch::MAX_RESIDUAL: ss << "max_residual"; break;
} }
ss << ",max_iter=" << BpOptions::maxIter; ss << ",bp_max_iter=" << WeightedBp::maxIterations();
ss << ",accuracy=" << BpOptions::accuracy; ss << ",bp_accuracy=" << WeightedBp::accuracy();
ss << ",log_domain=" << Util::toString (Globals::logDomain); ss << ",log_domain=" << Util::toString (Globals::logDomain);
ss << ",chkif=" << ss << ",fif=" << Util::toString (CountingBp::fif_);
Util::toString (CountingBp::checkForIdenticalFactors);
ss << "]" ; ss << "]" ;
cout << ss.str() << endl; cout << ss.str() << endl;
} }
@ -82,7 +80,7 @@ CountingBp::solveQuery (VarIds queryVids)
reprArgs.push_back (getRepresentative (queryVids[i])); reprArgs.push_back (getRepresentative (queryVids[i]));
} }
FacNode* reprFac = getRepresentative (facNodes[idx]); FacNode* reprFac = getRepresentative (facNodes[idx]);
assert (reprFac != 0); assert (reprFac);
res = solver_->getFactorJoint (reprFac, reprArgs); res = solver_->getFactorJoint (reprFac, reprArgs);
} }
} }
@ -95,8 +93,7 @@ void
CountingBp::findIdenticalFactors() CountingBp::findIdenticalFactors()
{ {
const FacNodes& facNodes = fg.facNodes(); const FacNodes& facNodes = fg.facNodes();
if (checkForIdenticalFactors == false || if (fif_ == false || facNodes.size() == 1) {
facNodes.size() == 1) {
return; return;
} }
for (size_t i = 0; i < facNodes.size(); i++) { for (size_t i = 0; i < facNodes.size(); i++) {
@ -139,7 +136,7 @@ CountingBp::setInitialColors (void)
VarColorMap::iterator it = colorMap.find (range); VarColorMap::iterator it = colorMap.find (range);
if (it == colorMap.end()) { if (it == colorMap.end()) {
it = colorMap.insert (make_pair ( it = colorMap.insert (make_pair (
range, Colors (range + 1, -1))).first; range, Colors (range + 1, -1))).first;
} }
unsigned idx = varNodes[i]->hasEvidence() unsigned idx = varNodes[i]->hasEvidence()
? varNodes[i]->getEvidence() ? varNodes[i]->getEvidence()

View File

@ -5,7 +5,6 @@
#include "GroundSolver.h" #include "GroundSolver.h"
#include "FactorGraph.h" #include "FactorGraph.h"
#include "Util.h"
#include "Horus.h" #include "Horus.h"
class VarCluster; class VarCluster;
@ -76,6 +75,8 @@ class VarCluster
private: private:
VarNodes members_; VarNodes members_;
VarNode* repr_; VarNode* repr_;
DISALLOW_COPY_AND_ASSIGN (VarCluster);
}; };
@ -88,17 +89,19 @@ class FacCluster
const FacNode* first (void) const { return members_.front(); } const FacNode* first (void) const { return members_.front(); }
const FacNodes& members (void) const { return members_; } const FacNodes& members (void) const { return members_; }
FacNode* representative (void) const { return repr_; } FacNode* representative (void) const { return repr_; }
void setRepresentative (FacNode* fn) { repr_ = fn; } void setRepresentative (FacNode* fn) { repr_ = fn; }
VarClusters& varClusters (void) { return varClusters_; } VarClusters& varClusters (void) { return varClusters_; }
private: private:
FacNodes members_; FacNodes members_;
FacNode* repr_; FacNode* repr_;
VarClusters varClusters_; VarClusters varClusters_;
DISALLOW_COPY_AND_ASSIGN (FacCluster);
}; };
@ -112,9 +115,9 @@ class CountingBp : public GroundSolver
void printSolverFlags (void) const; void printSolverFlags (void) const;
Params solveQuery (VarIds); Params solveQuery (VarIds);
static bool checkForIdenticalFactors; static void setFindIdenticalFactorsFlag (bool fif) { fif_ = fif; }
private: private:
Color getNewColor (void) Color getNewColor (void)
{ {
@ -167,7 +170,6 @@ class CountingBp : public GroundSolver
unsigned getWeight (const FacCluster*, unsigned getWeight (const FacCluster*,
const VarCluster*, size_t index) const; const VarCluster*, size_t index) const;
Color freeColor_; Color freeColor_;
Colors varColors_; Colors varColors_;
Colors facColors_; Colors facColors_;
@ -176,6 +178,10 @@ class CountingBp : public GroundSolver
VarClusterMap varClusterMap_; VarClusterMap varClusterMap_;
const FactorGraph* compressedFg_; const FactorGraph* compressedFg_;
WeightedBp* solver_; WeightedBp* solver_;
static bool fif_;
DISALLOW_COPY_AND_ASSIGN (CountingBp);
}; };
#endif // HORUS_COUNTINGBP_H #endif // HORUS_COUNTINGBP_H

View File

@ -1,39 +1,34 @@
#include <limits>
#include <fstream> #include <fstream>
#include "ElimGraph.h" #include "ElimGraph.h"
ElimHeuristic ElimGraph::elimHeuristic = MIN_NEIGHBORS; ElimHeuristic ElimGraph::elimHeuristic_ = MIN_NEIGHBORS;
ElimGraph::ElimGraph (const vector<Factor*>& factors) ElimGraph::ElimGraph (const vector<Factor*>& factors)
{ {
for (size_t i = 0; i < factors.size(); i++) { for (size_t i = 0; i < factors.size(); i++) {
if (factors[i] == 0) { // if contained just one var with evidence if (factors[i]) {
continue; const VarIds& args = factors[i]->arguments();
} for (size_t j = 0; j < args.size() - 1; j++) {
const VarIds& vids = factors[i]->arguments(); EgNode* n1 = getEgNode (args[j]);
for (size_t j = 0; j < vids.size() - 1; j++) { if (!n1) {
EgNode* n1 = getEgNode (vids[j]); n1 = new EgNode (args[j], factors[i]->range (j));
if (n1 == 0) { addNode (n1);
n1 = new EgNode (vids[j], factors[i]->range (j)); }
addNode (n1); for (size_t k = j + 1; k < args.size(); k++) {
} EgNode* n2 = getEgNode (args[k]);
for (size_t k = j + 1; k < vids.size(); k++) { if (!n2) {
EgNode* n2 = getEgNode (vids[k]); n2 = new EgNode (args[k], factors[i]->range (k));
if (n2 == 0) { addNode (n2);
n2 = new EgNode (vids[k], factors[i]->range (k)); }
addNode (n2); if (!neighbors (n1, n2)) {
addEdge (n1, n2);
}
} }
if (neighbors (n1, n2) == false) {
addEdge (n1, n2);
}
} }
} if (args.size() == 1 && !getEgNode (args[0])) {
if (vids.size() == 1) { addNode (new EgNode (args[0], factors[i]->range (0)));
if (getEgNode (vids[0]) == 0) {
addNode (new EgNode (vids[0], factors[i]->range (0)));
} }
} }
} }
@ -44,23 +39,23 @@ ElimGraph::ElimGraph (const vector<Factor*>& factors)
ElimGraph::~ElimGraph (void) ElimGraph::~ElimGraph (void)
{ {
for (size_t i = 0; i < nodes_.size(); i++) { for (size_t i = 0; i < nodes_.size(); i++) {
delete nodes_[i]; delete nodes_[i];
} }
} }
VarIds VarIds
ElimGraph::getEliminatingOrder (const VarIds& exclude) ElimGraph::getEliminatingOrder (const VarIds& excludedVids)
{ {
VarIds elimOrder; VarIds elimOrder;
unmarked_.reserve (nodes_.size()); unmarked_.reserve (nodes_.size());
for (size_t i = 0; i < nodes_.size(); i++) { for (size_t i = 0; i < nodes_.size(); i++) {
if (Util::contains (exclude, nodes_[i]->varId()) == false) { if (Util::contains (excludedVids, nodes_[i]->varId()) == false) {
unmarked_.insert (nodes_[i]); unmarked_.insert (nodes_[i]);
} }
} }
size_t nrVarsToEliminate = nodes_.size() - exclude.size(); size_t nrVarsToEliminate = nodes_.size() - excludedVids.size();
for (size_t i = 0; i < nrVarsToEliminate; i++) { for (size_t i = 0; i < nrVarsToEliminate; i++) {
EgNode* node = getLowestCostNode(); EgNode* node = getLowestCostNode();
unmarked_.remove (node); unmarked_.remove (node);
@ -86,7 +81,7 @@ ElimGraph::print (void) const
cout << " " << neighs[j]->label(); cout << " " << neighs[j]->label();
} }
cout << endl; cout << endl;
} }
} }
@ -99,30 +94,26 @@ ElimGraph::exportToGraphViz (
{ {
ofstream out (fileName); ofstream out (fileName);
if (!out.is_open()) { if (!out.is_open()) {
cerr << "error: cannot open file to write at " ; cerr << "Error: couldn't open file '" << fileName << "'." ;
cerr << "Markov::exportToDotFile()" << endl; return;
abort();
} }
out << "strict graph {" << endl; out << "strict graph {" << endl;
for (size_t i = 0; i < nodes_.size(); i++) { for (size_t i = 0; i < nodes_.size(); i++) {
if (showNeighborless || nodes_[i]->neighbors().size() != 0) { if (showNeighborless || nodes_[i]->neighbors().empty() == false) {
out << '"' << nodes_[i]->label() << '"' << endl; out << '"' << nodes_[i]->label() << '"' << endl;
} }
} }
for (size_t i = 0; i < highlightVarIds.size(); i++) { for (size_t i = 0; i < highlightVarIds.size(); i++) {
EgNode* node =getEgNode (highlightVarIds[i]); EgNode* node =getEgNode (highlightVarIds[i]);
if (node) { if (node) {
out << '"' << node->label() << '"' ; out << '"' << node->label() << '"' ;
out << " [shape=box3d]" << endl; out << " [shape=box3d]" << endl;
} else { } else {
cout << "error: invalid variable id: " << highlightVarIds[i] << endl; cerr << "Error: invalid variable id: " << highlightVarIds[i] << "." ;
abort(); cerr << endl;
exit (EXIT_FAILURE);
} }
} }
for (size_t i = 0; i < nodes_.size(); i++) { for (size_t i = 0; i < nodes_.size(); i++) {
EGNeighs neighs = nodes_[i]->neighbors(); EGNeighs neighs = nodes_[i]->neighbors();
for (size_t j = 0; j < neighs.size(); j++) { for (size_t j = 0; j < neighs.size(); j++) {
@ -130,7 +121,6 @@ ElimGraph::exportToGraphViz (
out << '"' << neighs[j]->label() << '"' << endl; out << '"' << neighs[j]->label() << '"' << endl;
} }
} }
out << "}" << endl; out << "}" << endl;
out.close(); out.close();
} }
@ -142,12 +132,12 @@ ElimGraph::getEliminationOrder (
const Factors& factors, const Factors& factors,
VarIds excludedVids) VarIds excludedVids)
{ {
if (elimHeuristic == ElimHeuristic::SEQUENTIAL) { if (elimHeuristic_ == ElimHeuristic::SEQUENTIAL) {
VarIds allVids; VarIds allVids;
Factors::const_iterator first = factors.begin(); Factors::const_iterator first = factors.begin();
Factors::const_iterator end = factors.end(); Factors::const_iterator end = factors.end();
for (; first != end; ++first) { for (; first != end; ++first) {
Util::addToVector (allVids, (*first)->arguments()); Util::addToVector (allVids, (*first)->arguments());
} }
TinySet<VarId> elimOrder (allVids); TinySet<VarId> elimOrder (allVids);
elimOrder -= TinySet<VarId> (excludedVids); elimOrder -= TinySet<VarId> (excludedVids);
@ -183,9 +173,9 @@ EgNode*
ElimGraph::getLowestCostNode (void) const ElimGraph::getLowestCostNode (void) const
{ {
EgNode* bestNode = 0; EgNode* bestNode = 0;
unsigned minCost = std::numeric_limits<unsigned>::max(); unsigned minCost = Util::maxUnsigned();
EGNeighs::const_iterator it; EGNeighs::const_iterator it;
switch (elimHeuristic) { switch (elimHeuristic_) {
case MIN_NEIGHBORS: { case MIN_NEIGHBORS: {
for (it = unmarked_.begin(); it != unmarked_.end(); ++ it) { for (it = unmarked_.begin(); it != unmarked_.end(); ++ it) {
unsigned cost = getNeighborsCost (*it); unsigned cost = getNeighborsCost (*it);
@ -238,7 +228,7 @@ ElimGraph::connectAllNeighbors (const EgNode* n)
if (neighs.size() > 0) { if (neighs.size() > 0) {
for (size_t i = 0; i < neighs.size() - 1; i++) { for (size_t i = 0; i < neighs.size() - 1; i++) {
for (size_t j = i + 1; j < neighs.size(); j++) { for (size_t j = i + 1; j < neighs.size(); j++) {
if ( ! neighbors (neighs[i], neighs[j])) { if (!neighbors (neighs[i], neighs[j])) {
addEdge (neighs[i], neighs[j]); addEdge (neighs[i], neighs[j]);
} }
} }

View File

@ -7,10 +7,9 @@
#include "TinySet.h" #include "TinySet.h"
#include "Horus.h" #include "Horus.h"
using namespace std; using namespace std;
enum ElimHeuristic enum ElimHeuristic
{ {
SEQUENTIAL, SEQUENTIAL,
MIN_NEIGHBORS, MIN_NEIGHBORS,
@ -49,7 +48,7 @@ class ElimGraph
ElimGraph (const Factors&); ElimGraph (const Factors&);
~ElimGraph (void); ~ElimGraph (void);
VarIds getEliminatingOrder (const VarIds&); VarIds getEliminatingOrder (const VarIds&);
void print (void) const; void print (void) const;
@ -59,10 +58,11 @@ class ElimGraph
static VarIds getEliminationOrder (const Factors&, VarIds); static VarIds getEliminationOrder (const Factors&, VarIds);
static ElimHeuristic elimHeuristic; static ElimHeuristic elimHeuristic (void) { return elimHeuristic_; }
static void setElimHeuristic (ElimHeuristic eh) { elimHeuristic_ = eh; }
private: private:
void addEdge (EgNode* n1, EgNode* n2) void addEdge (EgNode* n1, EgNode* n2)
{ {
assert (n1 != n2); assert (n1 != n2);
@ -133,6 +133,10 @@ class ElimGraph
vector<EgNode*> nodes_; vector<EgNode*> nodes_;
TinySet<EgNode*> unmarked_; TinySet<EgNode*> unmarked_;
unordered_map<VarId, EgNode*> varMap_; unordered_map<VarId, EgNode*> varMap_;
static ElimHeuristic elimHeuristic_;
DISALLOW_COPY_AND_ASSIGN (ElimGraph);
}; };
#endif // HORUS_ELIMGRAPH_H #endif // HORUS_ELIMGRAPH_H

View File

@ -7,7 +7,7 @@
#include <sstream> #include <sstream>
#include "Factor.h" #include "Factor.h"
#include "Indexer.h" #include "Var.h"
Factor::Factor (const Factor& g) Factor::Factor (const Factor& g)
@ -100,11 +100,11 @@ Factor::sumOutAllExceptIndex (size_t idx)
void void
Factor::multiply (Factor& g) Factor::multiply (Factor& g)
{ {
if (args_.size() == 0) { if (args_.empty()) {
clone (g); clone (g);
return; } else {
TFactor<VarId>::multiply (g);
} }
TFactor<VarId>::multiply (g);
} }

View File

@ -3,7 +3,6 @@
#include <vector> #include <vector>
#include "Var.h"
#include "Indexer.h" #include "Indexer.h"
#include "Util.h" #include "Util.h"
@ -34,7 +33,7 @@ class TFactor
void setDistId (unsigned id) { distId_ = id; } void setDistId (unsigned id) { distId_ = id; }
void normalize (void) { LogAware::normalize (params_); } void normalize (void) { LogAware::normalize (params_); }
void randomize (void) void randomize (void)
{ {
for (size_t i = 0; i < params_.size(); ++i) { for (size_t i = 0; i < params_.size(); ++i) {
@ -143,7 +142,7 @@ class TFactor
assert (idx != args_.size()); assert (idx != args_.size());
assert (obsIdx < ranges_[idx]); assert (obsIdx < ranges_[idx]);
Params newps; Params newps;
newps.reserve (params_.size() / ranges_[idx]); newps.reserve (params_.size() / ranges_[idx]);
Indexer indexer (ranges_); Indexer indexer (ranges_);
for (unsigned i = 0; i < obsIdx; ++i) { for (unsigned i = 0; i < obsIdx; ++i) {
indexer.incrementDimension (idx); indexer.incrementDimension (idx);
@ -207,7 +206,7 @@ class TFactor
Ranges ranges_; Ranges ranges_;
Params params_; Params params_;
unsigned distId_; unsigned distId_;
private: private:
void extend (unsigned range_prod) void extend (unsigned range_prod)
{ {
@ -285,9 +284,10 @@ class Factor : public TFactor<VarId>
void sumOutLastVariable (void); void sumOutLastVariable (void);
void sumOutArgs (const vector<bool>& mask); void sumOutArgs (const vector<bool>& mask);
void clone (const Factor& f); void clone (const Factor& f);
DISALLOW_ASSIGN (Factor);
}; };
#endif // HORUS_FACTOR_H #endif // HORUS_FACTOR_H

View File

@ -1,17 +1,23 @@
#include <set>
#include <vector>
#include <algorithm> #include <algorithm>
#include <set>
#include <vector>
#include <iostream> #include <iostream>
#include <fstream>
#include <sstream> #include <sstream>
#include <fstream>
#include "FactorGraph.h" #include "FactorGraph.h"
#include "Factor.h"
#include "BayesBall.h" #include "BayesBall.h"
#include "Util.h" #include "Util.h"
bool FactorGraph::exportLd_ = false;
bool FactorGraph::exportUai_ = false;
bool FactorGraph::exportGv_ = false;
bool FactorGraph::printFg_ = false;
FactorGraph::FactorGraph (const FactorGraph& fg) FactorGraph::FactorGraph (const FactorGraph& fg)
{ {
const VarNodes& varNodes = fg.varNodes(); const VarNodes& varNodes = fg.varNodes();
@ -32,20 +38,36 @@ FactorGraph::FactorGraph (const FactorGraph& fg)
FactorGraph::~FactorGraph (void)
{
for (size_t i = 0; i < varNodes_.size(); i++) {
delete varNodes_[i];
}
for (size_t i = 0; i < facNodes_.size(); i++) {
delete facNodes_[i];
}
}
void void
FactorGraph::readFromUaiFormat (const char* fileName) FactorGraph::readFromUaiFormat (const char* fileName)
{ {
std::ifstream is (fileName); std::ifstream is (fileName);
if (!is.is_open()) { if (!is.is_open()) {
cerr << "error: cannot read from file " << fileName << endl; cerr << "Error: couldn't open file '" << fileName << "'." ;
abort(); exit (EXIT_FAILURE);
} }
ignoreLines (is); ignoreLines (is);
string line; string line;
getline (is, line); getline (is, line);
if (line != "MARKOV") { if (line == "BAYES") {
cerr << "error: the network must be a MARKOV network " << endl; bayesFactors_ = true;
abort(); } else if (line == "MARKOV") {
bayesFactors_ = false;
} else {
cerr << "Error: the type of network is missing." << endl;
exit (EXIT_FAILURE);
} }
// read the number of vars // read the number of vars
ignoreLines (is); ignoreLines (is);
@ -61,23 +83,23 @@ FactorGraph::readFromUaiFormat (const char* fileName)
unsigned nrArgs; unsigned nrArgs;
unsigned vid; unsigned vid;
is >> nrFactors; is >> nrFactors;
vector<VarIds> factorVarIds; vector<VarIds> allVarIds;
vector<Ranges> factorRanges; vector<Ranges> allRanges;
for (unsigned i = 0; i < nrFactors; i++) { for (unsigned i = 0; i < nrFactors; i++) {
ignoreLines (is); ignoreLines (is);
is >> nrArgs; is >> nrArgs;
factorVarIds.push_back ({ }); allVarIds.push_back ({ });
factorRanges.push_back ({ }); allRanges.push_back ({ });
for (unsigned j = 0; j < nrArgs; j++) { for (unsigned j = 0; j < nrArgs; j++) {
is >> vid; is >> vid;
if (vid >= ranges.size()) { if (vid >= ranges.size()) {
cerr << "error: invalid variable identifier `" << vid << "'" << endl; cerr << "Error: invalid variable identifier `" << vid << "'. " ;
cerr << "identifiers must be between 0 and " << ranges.size() - 1 ; cerr << "Identifiers must be between 0 and " << ranges.size() - 1 ;
cerr << endl; cerr << "." << endl;
abort(); exit (EXIT_FAILURE);
} }
factorVarIds.back().push_back (vid); allVarIds.back().push_back (vid);
factorRanges.back().push_back (ranges[vid]); allRanges.back().push_back (ranges[vid]);
} }
} }
// read the parameters // read the parameters
@ -85,11 +107,11 @@ FactorGraph::readFromUaiFormat (const char* fileName)
for (unsigned i = 0; i < nrFactors; i++) { for (unsigned i = 0; i < nrFactors; i++) {
ignoreLines (is); ignoreLines (is);
is >> nrParams; is >> nrParams;
if (nrParams != Util::sizeExpected (factorRanges[i])) { if (nrParams != Util::sizeExpected (allRanges[i])) {
cerr << "error: invalid number of parameters for factor nº " << i ; cerr << "Error: invalid number of parameters for factor nº " << i ;
cerr << ", expected: " << Util::sizeExpected (factorRanges[i]); cerr << ", " << Util::sizeExpected (allRanges[i]);
cerr << ", given: " << nrParams << endl; cerr << " expected, " << nrParams << " given." << endl;
abort(); exit (EXIT_FAILURE);
} }
Params params (nrParams); Params params (nrParams);
for (unsigned j = 0; j < nrParams; j++) { for (unsigned j = 0; j < nrParams; j++) {
@ -98,7 +120,14 @@ FactorGraph::readFromUaiFormat (const char* fileName)
if (Globals::logDomain) { if (Globals::logDomain) {
Util::log (params); Util::log (params);
} }
addFactor (Factor (factorVarIds[i], factorRanges[i], params)); Factor f (allVarIds[i], allRanges[i], params);
if (bayesFactors_ && allVarIds[i].size() > 1) {
// In this format the child is the last variable,
// move it to be the first
std::swap (allVarIds[i].front(), allVarIds[i].back());
f.reorderArguments (allVarIds[i]);
}
addFactor (f);
} }
is.close(); is.close();
} }
@ -110,8 +139,8 @@ FactorGraph::readFromLibDaiFormat (const char* fileName)
{ {
std::ifstream is (fileName); std::ifstream is (fileName);
if (!is.is_open()) { if (!is.is_open()) {
cerr << "error: cannot read from file " << fileName << endl; cerr << "Error: couldn't open file '" << fileName << "'." ;
abort(); exit (EXIT_FAILURE);
} }
ignoreLines (is); ignoreLines (is);
unsigned nrFactors; unsigned nrFactors;
@ -134,9 +163,9 @@ FactorGraph::readFromLibDaiFormat (const char* fileName)
ignoreLines (is); ignoreLines (is);
is >> ranges[j]; is >> ranges[j];
VarNode* var = getVarNode (vids[j]); VarNode* var = getVarNode (vids[j]);
if (var != 0 && ranges[j] != var->range()) { if (var && ranges[j] != var->range()) {
cerr << "error: variable `" << vids[j] << "' appears in two or " ; cerr << "Error: variable `" << vids[j] << "' appears in two or " ;
cerr << "more factors with a different range" << endl; cerr << "more factors with a different range." << endl;
} }
} }
// read parameters // read parameters
@ -159,7 +188,7 @@ FactorGraph::readFromLibDaiFormat (const char* fileName)
std::reverse (vids.begin(), vids.end()); std::reverse (vids.begin(), vids.end());
Factor f (vids, ranges, params); Factor f (vids, ranges, params);
std::reverse (vids.begin(), vids.end()); std::reverse (vids.begin(), vids.end());
f.reorderArguments (vids); f.reorderArguments (vids);
addFactor (f); addFactor (f);
} }
is.close(); is.close();
@ -167,18 +196,6 @@ FactorGraph::readFromLibDaiFormat (const char* fileName)
FactorGraph::~FactorGraph (void)
{
for (size_t i = 0; i < varNodes_.size(); i++) {
delete varNodes_[i];
}
for (size_t i = 0; i < facNodes_.size(); i++) {
delete facNodes_[i];
}
}
void void
FactorGraph::addFactor (const Factor& factor) FactorGraph::addFactor (const Factor& factor)
{ {
@ -188,7 +205,7 @@ FactorGraph::addFactor (const Factor& factor)
for (size_t i = 0; i < vids.size(); i++) { for (size_t i = 0; i < vids.size(); i++) {
VarMap::const_iterator it = varMap_.find (vids[i]); VarMap::const_iterator it = varMap_.find (vids[i]);
if (it != varMap_.end()) { if (it != varMap_.end()) {
addEdge (it->second, fn); addEdge (it->second, fn);
} else { } else {
VarNode* vn = new VarNode (vids[i], fn->factor().range (i)); VarNode* vn = new VarNode (vids[i], fn->factor().range (i));
addVarNode (vn); addVarNode (vn);
@ -277,81 +294,12 @@ FactorGraph::print (void) const
void void
FactorGraph::exportToGraphViz (const char* fileName) const FactorGraph::exportToLibDai (const char* fileName) const
{ {
ofstream out (fileName); ofstream out (fileName);
if (!out.is_open()) { if (!out.is_open()) {
cerr << "error: cannot open file to write at " ; cerr << "Error: couldn't open file '" << fileName << "'." ;
cerr << "FactorGraph::exportToDotFile()" << endl; return;
abort();
}
out << "graph \"" << fileName << "\" {" << endl;
for (size_t i = 0; i < varNodes_.size(); i++) {
if (varNodes_[i]->hasEvidence()) {
out << '"' << varNodes_[i]->label() << '"' ;
out << " [style=filled, fillcolor=yellow]" << endl;
}
}
for (size_t i = 0; i < facNodes_.size(); i++) {
out << '"' << facNodes_[i]->getLabel() << '"' ;
out << " [label=\"" << facNodes_[i]->getLabel();
out << "\"" << ", shape=box]" << endl;
}
for (size_t i = 0; i < facNodes_.size(); i++) {
const VarNodes& myVars = facNodes_[i]->neighbors();
for (size_t j = 0; j < myVars.size(); j++) {
out << '"' << facNodes_[i]->getLabel() << '"' ;
out << " -- " ;
out << '"' << myVars[j]->label() << '"' << endl;
}
}
out << "}" << endl;
out.close();
}
void
FactorGraph::exportToUaiFormat (const char* fileName) const
{
ofstream out (fileName);
if (!out.is_open()) {
cerr << "error: cannot open file " << fileName << endl;
abort();
}
out << "MARKOV" << endl;
out << varNodes_.size() << endl;
VarNodes sortedVns = varNodes_;
std::sort (sortedVns.begin(), sortedVns.end(), sortByVarId());
for (size_t i = 0; i < sortedVns.size(); i++) {
out << ((i != 0) ? " " : "") << sortedVns[i]->range();
}
out << endl << facNodes_.size() << endl;
for (size_t i = 0; i < facNodes_.size(); i++) {
VarIds args = facNodes_[i]->factor().arguments();
out << args.size() << " " << Util::elementsToString (args) << endl;
}
out << endl;
for (size_t i = 0; i < facNodes_.size(); i++) {
Params params = facNodes_[i]->factor().params();
if (Globals::logDomain) {
Util::exp (params);
}
out << params.size() << endl << " " ;
out << Util::elementsToString (params) << endl << endl;
}
out.close();
}
void
FactorGraph::exportToLibDaiFormat (const char* fileName) const
{
ofstream out (fileName);
if (!out.is_open()) {
cerr << "error: cannot open file " << fileName << endl;
abort();
} }
out << facNodes_.size() << endl << endl; out << facNodes_.size() << endl << endl;
for (size_t i = 0; i < facNodes_.size(); i++) { for (size_t i = 0; i < facNodes_.size(); i++) {
@ -376,6 +324,84 @@ FactorGraph::exportToLibDaiFormat (const char* fileName) const
void
FactorGraph::exportToUai (const char* fileName) const
{
ofstream out (fileName);
if (!out.is_open()) {
cerr << "Error: couldn't open file '" << fileName << "'." ;
return;
}
out << (bayesFactors_ ? "BAYES" : "MARKOV") ;
out << endl << endl;
out << varNodes_.size() << endl;
VarNodes sortedVns = varNodes_;
std::sort (sortedVns.begin(), sortedVns.end(), sortByVarId());
for (size_t i = 0; i < sortedVns.size(); i++) {
out << ((i != 0) ? " " : "") << sortedVns[i]->range();
}
out << endl << facNodes_.size() << endl;
for (size_t i = 0; i < facNodes_.size(); i++) {
VarIds args = facNodes_[i]->factor().arguments();
if (bayesFactors_) {
std::swap (args.front(), args.back());
}
out << args.size() << " " << Util::elementsToString (args) << endl;
}
out << endl;
for (size_t i = 0; i < facNodes_.size(); i++) {
Factor f = facNodes_[i]->factor();
if (bayesFactors_) {
VarIds args = f.arguments();
std::swap (args.front(), args.back());
f.reorderArguments (args);
}
Params params = f.params();
if (Globals::logDomain) {
Util::exp (params);
}
out << params.size() << endl << " " ;
out << Util::elementsToString (params) << endl << endl;
}
out.close();
}
void
FactorGraph::exportToGraphViz (const char* fileName) const
{
ofstream out (fileName);
if (!out.is_open()) {
cerr << "Error: couldn't open file '" << fileName << "'." ;
return;
}
out << "graph \"" << fileName << "\" {" << endl;
for (size_t i = 0; i < varNodes_.size(); i++) {
if (varNodes_[i]->hasEvidence()) {
out << '"' << varNodes_[i]->label() << '"' ;
out << " [style=filled, fillcolor=yellow]" << endl;
}
}
for (size_t i = 0; i < facNodes_.size(); i++) {
out << '"' << facNodes_[i]->getLabel() << '"' ;
out << " [label=\"" << facNodes_[i]->getLabel();
out << "\"" << ", shape=box]" << endl;
}
for (size_t i = 0; i < facNodes_.size(); i++) {
const VarNodes& myVars = facNodes_[i]->neighbors();
for (size_t j = 0; j < myVars.size(); j++) {
out << '"' << facNodes_[i]->getLabel() << '"' ;
out << " -- " ;
out << '"' << myVars[j]->label() << '"' << endl;
}
}
out << "}" << endl;
out.close();
}
void void
FactorGraph::ignoreLines (std::ifstream& is) const FactorGraph::ignoreLines (std::ifstream& is) const
{ {

View File

@ -9,14 +9,13 @@
using namespace std; using namespace std;
class FacNode; class FacNode;
class VarNode : public Var class VarNode : public Var
{ {
public: public:
VarNode (VarId varId, unsigned nrStates, VarNode (VarId varId, unsigned nrStates,
int evidence = Constants::NO_EVIDENCE) int evidence = Constants::NO_EVIDENCE)
: Var (varId, nrStates, evidence) { } : Var (varId, nrStates, evidence) { }
VarNode (const Var* v) : Var (v) { } VarNode (const Var* v) : Var (v) { }
@ -26,9 +25,9 @@ class VarNode : public Var
const FacNodes& neighbors (void) const { return neighs_; } const FacNodes& neighbors (void) const { return neighs_; }
private: private:
DISALLOW_COPY_AND_ASSIGN (VarNode);
FacNodes neighs_; FacNodes neighs_;
DISALLOW_COPY_AND_ASSIGN (VarNode);
}; };
@ -53,11 +52,11 @@ class FacNode
string getLabel (void) { return factor_.getLabel(); } string getLabel (void) { return factor_.getLabel(); }
private: private:
DISALLOW_COPY_AND_ASSIGN (FacNode);
VarNodes neighs_; VarNodes neighs_;
Factor factor_; Factor factor_;
size_t index_; size_t index_;
DISALLOW_COPY_AND_ASSIGN (FacNode);
}; };
@ -76,8 +75,8 @@ class FactorGraph
const FacNodes& facNodes (void) const { return facNodes_; } const FacNodes& facNodes (void) const { return facNodes_; }
void setFactorsAsBayesian (void) { bayesFactors_ = true; } void setFactorsAsBayesian (void) { bayesFactors_ = true; }
bool bayesianFactors (void) const { return bayesFactors_ ; } bool bayesianFactors (void) const { return bayesFactors_; }
size_t nrVarNodes (void) const { return varNodes_.size(); } size_t nrVarNodes (void) const { return varNodes_.size(); }
@ -107,15 +106,37 @@ class FactorGraph
void print (void) const; void print (void) const;
void exportToLibDai (const char*) const;
void exportToUai (const char*) const;
void exportToGraphViz (const char*) const; void exportToGraphViz (const char*) const;
void exportToUaiFormat (const char*) const; static bool exportToLibDai (void) { return exportLd_; }
static bool exportToUai (void) { return exportUai_; }
static bool exportGraphViz (void) { return exportGv_; }
static bool printFactorGraph (void) { return printFg_; }
static void enableExportToLibDai (void) { exportLd_ = true; }
static void disableExportToLibDai (void) { exportLd_ = false; }
static void enableExportToUai (void) { exportUai_ = true; }
static void disableExportToUai (void) { exportUai_ = false; }
static void enableExportToGraphViz (void) { exportGv_ = true; }
static void disableExportToGraphViz (void) { exportGv_ = false; }
static void enablePrintFactorGraph (void) { printFg_ = true; }
static void disablePrintFactorGraph (void) { printFg_ = false; }
void exportToLibDaiFormat (const char*) const;
private: private:
// DISALLOW_COPY_AND_ASSIGN (FactorGraph);
void ignoreLines (std::ifstream&) const; void ignoreLines (std::ifstream&) const;
bool containsCycle (void) const; bool containsCycle (void) const;
@ -129,18 +150,25 @@ class FactorGraph
VarNodes varNodes_; VarNodes varNodes_;
FacNodes facNodes_; FacNodes facNodes_;
BayesBallGraph structure_; BayesBallGraph structure_;
bool bayesFactors_; bool bayesFactors_;
typedef unordered_map<unsigned, VarNode*> VarMap; typedef unordered_map<unsigned, VarNode*> VarMap;
VarMap varMap_; VarMap varMap_;
static bool exportLd_;
static bool exportUai_;
static bool exportGv_;
static bool printFg_;
DISALLOW_ASSIGN (FactorGraph);
}; };
struct sortByVarId struct sortByVarId
{ {
bool operator()(VarNode* vn1, VarNode* vn2) { bool operator()(VarNode* vn1, VarNode* vn2) {
return vn1->varId() < vn2->varId(); return vn1->varId() < vn2->varId();
} }
}; };

View File

@ -1,8 +1,8 @@
#include "GroundSolver.h" #include "GroundSolver.h"
#include "Util.h" #include "VarElim.h"
#include "BeliefProp.h" #include "BeliefProp.h"
#include "CountingBp.h" #include "CountingBp.h"
#include "VarElim.h" #include "Util.h"
void void
@ -47,7 +47,7 @@ Params
GroundSolver::getJointByConditioning ( GroundSolver::getJointByConditioning (
GroundSolverType solverType, GroundSolverType solverType,
FactorGraph fg, FactorGraph fg,
const VarIds& jointVarIds) const const VarIds& jointVarIds)
{ {
VarNodes jointVars; VarNodes jointVars;
for (size_t i = 0; i < jointVarIds.size(); i++) { for (size_t i = 0; i < jointVarIds.size(); i++) {

View File

@ -4,7 +4,6 @@
#include <iomanip> #include <iomanip>
#include "FactorGraph.h" #include "FactorGraph.h"
#include "Var.h"
#include "Horus.h" #include "Horus.h"
@ -25,11 +24,13 @@ class GroundSolver
void printAllPosterioris (void); void printAllPosterioris (void);
Params getJointByConditioning (GroundSolverType, static Params getJointByConditioning (GroundSolverType,
FactorGraph, const VarIds& jointVarIds) const; FactorGraph, const VarIds& jointVarIds);
protected: protected:
const FactorGraph& fg; const FactorGraph& fg;
DISALLOW_COPY_AND_ASSIGN (GroundSolver);
}; };
#endif // HORUS_GROUNDSOLVER_H #endif // HORUS_GROUNDSOLVER_H

View File

@ -59,10 +59,10 @@ HistogramSet::reset (void)
vector<Histogram> vector<Histogram>
HistogramSet::getHistograms (unsigned N, unsigned R) HistogramSet::getHistograms (unsigned N, unsigned R)
{ {
HistogramSet hs (N, R); HistogramSet hs (N, R);
unsigned H = hs.nrHistograms(); unsigned H = hs.nrHistograms();
vector<Histogram> histograms; vector<Histogram> histograms;
histograms.reserve (H); histograms.reserve (H);
@ -135,7 +135,7 @@ HistogramSet::maxCount (size_t idx) const
} }
return size_ - sum; return size_ - sum;
} }
void void

View File

@ -2,8 +2,11 @@
#define HORUS_HISTOGRAM_H #define HORUS_HISTOGRAM_H
#include <vector> #include <vector>
#include <ostream> #include <ostream>
#include "Horus.h"
using namespace std; using namespace std;
typedef vector<unsigned> Histogram; typedef vector<unsigned> Histogram;
@ -12,17 +15,17 @@ class HistogramSet
{ {
public: public:
HistogramSet (unsigned, unsigned); HistogramSet (unsigned, unsigned);
void nextHistogram (void); void nextHistogram (void);
unsigned operator[] (size_t idx) const; unsigned operator[] (size_t idx) const;
unsigned nrHistograms (void) const; unsigned nrHistograms (void) const;
void reset (void); void reset (void);
static vector<Histogram> getHistograms (unsigned ,unsigned); static vector<Histogram> getHistograms (unsigned, unsigned);
static unsigned nrHistograms (unsigned, unsigned); static unsigned nrHistograms (unsigned, unsigned);
static size_t findIndex ( static size_t findIndex (
@ -31,14 +34,16 @@ class HistogramSet
static vector<double> getNumAssigns (unsigned, unsigned); static vector<double> getNumAssigns (unsigned, unsigned);
friend std::ostream& operator<< (ostream &os, const HistogramSet& hs); friend std::ostream& operator<< (ostream &os, const HistogramSet& hs);
private: private:
unsigned maxCount (size_t) const; unsigned maxCount (size_t) const;
void clearAfter (size_t); void clearAfter (size_t);
unsigned size_; unsigned size_;
Histogram hist_; Histogram hist_;
DISALLOW_COPY_AND_ASSIGN (HistogramSet);
}; };
#endif // HORUS_HISTOGRAM_H #endif // HORUS_HISTOGRAM_H

View File

@ -1,31 +1,34 @@
#ifndef HORUS_HORUS_H #ifndef HORUS_HORUS_H
#define HORUS_HORUS_H #define HORUS_HORUS_H
#include <limits>
#include <vector>
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ #define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \ TypeName(const TypeName&); \
void operator=(const TypeName&) void operator=(const TypeName&)
using namespace std; #define DISALLOW_COPY(TypeName) \
TypeName(const TypeName&)
#define DISALLOW_ASSIGN(TypeName) \
void operator=(const TypeName&)
#include <vector>
#include <string>
class Var; class Var;
class Factor; class Factor;
class VarNode; class VarNode;
class FacNode; class FacNode;
typedef vector<double> Params; typedef std::vector<double> Params;
typedef unsigned VarId; typedef unsigned VarId;
typedef vector<VarId> VarIds; typedef std::vector<VarId> VarIds;
typedef vector<Var*> Vars; typedef std::vector<Var*> Vars;
typedef vector<VarNode*> VarNodes; typedef std::vector<VarNode*> VarNodes;
typedef vector<FacNode*> FacNodes; typedef std::vector<FacNode*> FacNodes;
typedef vector<Factor*> Factors; typedef std::vector<Factor*> Factors;
typedef vector<string> States; typedef std::vector<std::string> States;
typedef vector<unsigned> Ranges; typedef std::vector<unsigned> Ranges;
typedef unsigned long long ullong; typedef unsigned long long ullong;
enum LiftedSolverType enum LiftedSolverType
@ -69,19 +72,5 @@ const unsigned PRECISION = 6;
}; };
namespace BpOptions
{
enum Schedule {
SEQ_FIXED,
SEQ_RANDOM,
PARALLEL,
MAX_RESIDUAL
};
extern Schedule schedule;
extern double accuracy;
extern unsigned maxIter;
}
#endif // HORUS_HORUS_H #endif // HORUS_HORUS_H

View File

@ -16,22 +16,39 @@ VarIds readQueryAndEvidence (FactorGraph&, int, const char* [], int);
void runSolver (const FactorGraph&, const VarIds&); void runSolver (const FactorGraph&, const VarIds&);
const string USAGE = "usage: ./hcli [HORUS_FLAG=VALUE] \ const string USAGE = "usage: ./hcli [solver=hve|bp|cbp] \
NETWORK_FILE [VARIABLE | OBSERVED_VARIABLE=EVIDENCE] ..." ; [<HORUS_KEY>=<VALUE>]... <FILE> [<VAR>|<VAR>=<EVIDENCE>]... " ;
int int
main (int argc, const char* argv[]) main (int argc, const char* argv[])
{ {
if (argc <= 1) { if (argc <= 1) {
cerr << "error: no graphical model specified" << endl; cerr << "Error: no probabilistic graphical model was given." << endl;
cerr << USAGE << endl; cerr << USAGE << endl;
exit (0); exit (EXIT_FAILURE);
} }
int idx = readHorusFlags (argc, argv); int idx = readHorusFlags (argc, argv);
FactorGraph fg; FactorGraph fg;
readFactorGraph (fg, argv[idx]); readFactorGraph (fg, argv[idx]);
VarIds queryIds = readQueryAndEvidence (fg, argc, argv, idx + 1); VarIds queryIds = readQueryAndEvidence (fg, argc, argv, idx + 1);
if (FactorGraph::exportToLibDai()) {
fg.exportToLibDai ("model.fg");
}
if (FactorGraph::exportToUai()) {
fg.exportToUai ("model.uai");
}
if (FactorGraph::exportGraphViz()) {
fg.exportToGraphViz ("model.dot");
}
if (FactorGraph::printFactorGraph()) {
fg.print();
}
if (Globals::verbosity > 0) {
cout << "factor graph contains " ;
cout << fg.nrVarNodes() << " variables and " ;
cout << fg.nrFacNodes() << " factors " << endl;
}
runSolver (fg, queryIds); runSolver (fg, queryIds);
return 0; return 0;
} }
@ -51,14 +68,14 @@ readHorusFlags (int argc, const char* argv[])
string leftArg = arg.substr (0, pos); string leftArg = arg.substr (0, pos);
string rightArg = arg.substr (pos + 1); string rightArg = arg.substr (pos + 1);
if (leftArg.empty()) { if (leftArg.empty()) {
cerr << "error: missing left argument" << endl; cerr << "Error: missing left argument." << endl;
cerr << USAGE << endl; cerr << USAGE << endl;
exit (0); exit (EXIT_FAILURE);
} }
if (rightArg.empty()) { if (rightArg.empty()) {
cerr << "error: missing right argument" << endl; cerr << "Error: missing right argument." << endl;
cerr << USAGE << endl; cerr << USAGE << endl;
exit (0); exit (EXIT_FAILURE);
} }
Util::setHorusFlag (leftArg, rightArg); Util::setHorusFlag (leftArg, rightArg);
} }
@ -77,9 +94,9 @@ readFactorGraph (FactorGraph& fg, const char* s)
} else if (extension == "fg") { } else if (extension == "fg") {
fg.readFromLibDaiFormat (fileName.c_str()); fg.readFromLibDaiFormat (fileName.c_str());
} else { } else {
cerr << "error: the graphical model must be defined either " ; cerr << "Error: the probabilistic graphical model must be " ;
cerr << "in a UAI or libDAI file" << endl; cerr << "defined either in a UAI or libDAI file." << endl;
exit (0); exit (EXIT_FAILURE);
} }
} }
@ -97,17 +114,17 @@ readQueryAndEvidence (
const string& arg = argv[i]; const string& arg = argv[i];
if (arg.find ('=') == std::string::npos) { if (arg.find ('=') == std::string::npos) {
if (Util::isInteger (arg) == false) { if (Util::isInteger (arg) == false) {
cerr << "error: `" << arg << "' " ; cerr << "Error: `" << arg << "' " ;
cerr << "is not a variable id" ; cerr << "is not a variable id." ;
cerr << endl; cerr << endl;
exit (0); exit (EXIT_FAILURE);
} }
VarId vid = Util::stringToUnsigned (arg); VarId vid = Util::stringToUnsigned (arg);
VarNode* queryVar = fg.getVarNode (vid); VarNode* queryVar = fg.getVarNode (vid);
if (queryVar == false) { if (queryVar == false) {
cerr << "error: unknow variable with id " ; cerr << "Error: unknow variable with id " ;
cerr << "`" << vid << "'" << endl; cerr << "`" << vid << "'." << endl;
exit (0); exit (EXIT_FAILURE);
} }
queryIds.push_back (vid); queryIds.push_back (vid);
} else { } else {
@ -115,39 +132,38 @@ readQueryAndEvidence (
string leftArg = arg.substr (0, pos); string leftArg = arg.substr (0, pos);
string rightArg = arg.substr (pos + 1); string rightArg = arg.substr (pos + 1);
if (leftArg.empty()) { if (leftArg.empty()) {
cerr << "error: missing left argument" << endl; cerr << "Error: missing left argument." << endl;
cerr << USAGE << endl; cerr << USAGE << endl;
exit (0); exit (EXIT_FAILURE);
} }
if (Util::isInteger (leftArg) == false) { if (Util::isInteger (leftArg) == false) {
cerr << "error: `" << leftArg << "' " ; cerr << "Error: `" << leftArg << "' " ;
cerr << "is not a variable id" << endl ; cerr << "is not a variable id." << endl ;
exit (0); exit (EXIT_FAILURE);
continue;
} }
VarId vid = Util::stringToUnsigned (leftArg); VarId vid = Util::stringToUnsigned (leftArg);
VarNode* observedVar = fg.getVarNode (vid); VarNode* observedVar = fg.getVarNode (vid);
if (observedVar == false) { if (observedVar == false) {
cerr << "error: unknow variable with id " ; cerr << "Error: unknow variable with id " ;
cerr << "`" << vid << "'" << endl; cerr << "`" << vid << "'." << endl;
exit (0); exit (EXIT_FAILURE);
} }
if (rightArg.empty()) { if (rightArg.empty()) {
cerr << "error: missing right argument" << endl; cerr << "Error: missing right argument." << endl;
cerr << USAGE << endl; cerr << USAGE << endl;
exit (0); exit (EXIT_FAILURE);
} }
if (Util::isInteger (rightArg) == false) { if (Util::isInteger (rightArg) == false) {
cerr << "error: `" << rightArg << "' " ; cerr << "Error: `" << rightArg << "' " ;
cerr << "is not a state index" << endl ; cerr << "is not a state index." << endl ;
exit (0); exit (EXIT_FAILURE);
} }
unsigned stateIdx = Util::stringToUnsigned (rightArg); unsigned stateIdx = Util::stringToUnsigned (rightArg);
if (observedVar->isValidState (stateIdx) == false) { if (observedVar->isValidState (stateIdx) == false) {
cerr << "error: `" << stateIdx << "' " ; cerr << "Error: `" << stateIdx << "' " ;
cerr << "is not a valid state index for variable with id " ; cerr << "is not a valid state index for variable with id " ;
cerr << "`" << vid << "'" << endl; cerr << "`" << vid << "'." << endl;
exit (0); exit (EXIT_FAILURE);
} }
observedVar->setEvidence (stateIdx); observedVar->setEvidence (stateIdx);
} }

View File

@ -57,7 +57,7 @@ createLiftedNetwork (void)
} }
ParfactorList* pfList = new ParfactorList (parfactors); ParfactorList* pfList = new ParfactorList (parfactors);
if (Globals::verbosity > 2) { if (Globals::verbosity > 2) {
Util::printHeader ("SHATTERED PARFACTORS"); Util::printHeader ("SHATTERED PARFACTORS");
pfList->print(); pfList->print();
@ -91,7 +91,7 @@ createGroundNetwork (void)
// read the ranges // read the ranges
Ranges ranges = readUnsignedList (YAP_ArgOfTerm (2, factor)); Ranges ranges = readUnsignedList (YAP_ArgOfTerm (2, factor));
// read the parameters // read the parameters
Params params = readParameters (YAP_ArgOfTerm (3, factor)); Params params = readParameters (YAP_ArgOfTerm (3, factor));
// read dist id // read dist id
unsigned distId = (unsigned) YAP_IntOfTerm (YAP_ArgOfTerm (4, factor)); unsigned distId = (unsigned) YAP_IntOfTerm (YAP_ArgOfTerm (4, factor));
fg->addFactor (Factor (varIds, ranges, params, distId)); fg->addFactor (Factor (varIds, ranges, params, distId));
@ -108,10 +108,21 @@ createGroundNetwork (void)
evidenceList = YAP_TailOfTerm (evidenceList); evidenceList = YAP_TailOfTerm (evidenceList);
nrObservedVars ++; nrObservedVars ++;
} }
if (FactorGraph::exportToLibDai()) {
fg->exportToLibDai ("model.fg");
}
if (FactorGraph::exportToUai()) {
fg->exportToUai ("model.uai");
}
if (FactorGraph::exportGraphViz()) {
fg->exportToGraphViz ("model.dot");
}
if (FactorGraph::printFactorGraph()) {
fg->print();
}
if (Globals::verbosity > 0) { if (Globals::verbosity > 0) {
cout << "factor graph contains " ; cout << "factor graph contains " ;
cout << fg->nrVarNodes() << " variables " ; cout << fg->nrVarNodes() << " variables and " ;
cout << "(" << nrObservedVars << " observed) and " ;
cout << fg->nrFacNodes() << " factors " << endl; cout << fg->nrFacNodes() << " factors " << endl;
} }
YAP_Int p = (YAP_Int) (fg); YAP_Int p = (YAP_Int) (fg);
@ -126,19 +137,19 @@ runLiftedSolver (void)
LiftedNetwork* network = (LiftedNetwork*) YAP_IntOfTerm (YAP_ARG1); LiftedNetwork* network = (LiftedNetwork*) YAP_IntOfTerm (YAP_ARG1);
ParfactorList pfListCopy (*network->first); ParfactorList pfListCopy (*network->first);
LiftedOperations::absorveEvidence (pfListCopy, *network->second); LiftedOperations::absorveEvidence (pfListCopy, *network->second);
LiftedSolver* solver = 0; LiftedSolver* solver = 0;
switch (Globals::liftedSolver) { switch (Globals::liftedSolver) {
case LiftedSolverType::LVE: solver = new LiftedVe (pfListCopy); break; case LiftedSolverType::LVE: solver = new LiftedVe (pfListCopy); break;
case LiftedSolverType::LBP: solver = new LiftedBp (pfListCopy); break; case LiftedSolverType::LBP: solver = new LiftedBp (pfListCopy); break;
case LiftedSolverType::LKC: solver = new LiftedKc (pfListCopy); break; case LiftedSolverType::LKC: solver = new LiftedKc (pfListCopy); break;
} }
if (Globals::verbosity > 0) { if (Globals::verbosity > 0) {
solver->printSolverFlags(); solver->printSolverFlags();
cout << endl; cout << endl;
} }
YAP_Term taskList = YAP_ARG2; YAP_Term taskList = YAP_ARG2;
vector<Params> results; vector<Params> results;
while (taskList != YAP_TermNil()) { while (taskList != YAP_TermNil()) {
@ -181,7 +192,7 @@ int
runGroundSolver (void) runGroundSolver (void)
{ {
FactorGraph* fg = (FactorGraph*) YAP_IntOfTerm (YAP_ARG1); FactorGraph* fg = (FactorGraph*) YAP_IntOfTerm (YAP_ARG1);
vector<VarIds> tasks; vector<VarIds> tasks;
YAP_Term taskList = YAP_ARG2; YAP_Term taskList = YAP_ARG2;
while (taskList != YAP_TermNil()) { while (taskList != YAP_TermNil()) {
@ -200,7 +211,7 @@ runGroundSolver (void)
} }
GroundSolver* solver = 0; GroundSolver* solver = 0;
CountingBp::checkForIdenticalFactors = false; CountingBp::setFindIdenticalFactorsFlag (false);
switch (Globals::groundSolver) { switch (Globals::groundSolver) {
case GroundSolverType::VE: solver = new VarElim (*mfg); break; case GroundSolverType::VE: solver = new VarElim (*mfg); break;
case GroundSolverType::BP: solver = new BeliefProp (*mfg); break; case GroundSolverType::BP: solver = new BeliefProp (*mfg); break;
@ -233,19 +244,21 @@ setParfactorsParams (void)
{ {
LiftedNetwork* network = (LiftedNetwork*) YAP_IntOfTerm (YAP_ARG1); LiftedNetwork* network = (LiftedNetwork*) YAP_IntOfTerm (YAP_ARG1);
ParfactorList* pfList = network->first; ParfactorList* pfList = network->first;
YAP_Term distList = YAP_ARG2; YAP_Term distIdsList = YAP_ARG2;
YAP_Term paramsList = YAP_ARG3;
unordered_map<unsigned, Params> paramsMap; unordered_map<unsigned, Params> paramsMap;
while (distList != YAP_TermNil()) { while (distIdsList != YAP_TermNil()) {
YAP_Term dist = YAP_HeadOfTerm (distList); unsigned distId = (unsigned) YAP_IntOfTerm (
unsigned distId = (unsigned) YAP_IntOfTerm (YAP_ArgOfTerm (1, dist)); YAP_HeadOfTerm (distIdsList));
assert (Util::contains (paramsMap, distId) == false); assert (Util::contains (paramsMap, distId) == false);
paramsMap[distId] = readParameters (YAP_ArgOfTerm (2, dist)); paramsMap[distId] = readParameters (YAP_HeadOfTerm (paramsList));
distList = YAP_TailOfTerm (distList); distIdsList = YAP_TailOfTerm (distIdsList);
paramsList = YAP_TailOfTerm (paramsList);
} }
ParfactorList::iterator it = pfList->begin(); ParfactorList::iterator it = pfList->begin();
while (it != pfList->end()) { while (it != pfList->end()) {
assert (Util::contains (paramsMap, (*it)->distId())); assert (Util::contains (paramsMap, (*it)->distId()));
// (*it)->setParams (paramsMap[(*it)->distId()]); (*it)->setParams (paramsMap[(*it)->distId()]);
++ it; ++ it;
} }
return TRUE; return TRUE;
@ -256,16 +269,17 @@ setParfactorsParams (void)
int int
setFactorsParams (void) setFactorsParams (void)
{ {
return TRUE; // TODO
FactorGraph* fg = (FactorGraph*) YAP_IntOfTerm (YAP_ARG1); FactorGraph* fg = (FactorGraph*) YAP_IntOfTerm (YAP_ARG1);
YAP_Term distList = YAP_ARG2; YAP_Term distIdsList = YAP_ARG2;
YAP_Term paramsList = YAP_ARG3;
unordered_map<unsigned, Params> paramsMap; unordered_map<unsigned, Params> paramsMap;
while (distList != YAP_TermNil()) { while (distIdsList != YAP_TermNil()) {
YAP_Term dist = YAP_HeadOfTerm (distList); unsigned distId = (unsigned) YAP_IntOfTerm (
unsigned distId = (unsigned) YAP_IntOfTerm (YAP_ArgOfTerm (1, dist)); YAP_HeadOfTerm (distIdsList));
assert (Util::contains (paramsMap, distId) == false); assert (Util::contains (paramsMap, distId) == false);
paramsMap[distId] = readParameters (YAP_ArgOfTerm (2, dist)); paramsMap[distId] = readParameters (YAP_HeadOfTerm (paramsList));
distList = YAP_TailOfTerm (distList); distIdsList = YAP_TailOfTerm (distIdsList);
paramsList = YAP_TailOfTerm (paramsList);
} }
const FacNodes& facNodes = fg->facNodes(); const FacNodes& facNodes = fg->facNodes();
for (size_t i = 0; i < facNodes.size(); i++) { for (size_t i = 0; i < facNodes.size(); i++) {
@ -317,11 +331,11 @@ setHorusFlag (void)
stringstream ss; stringstream ss;
ss << (int) YAP_IntOfTerm (YAP_ARG2); ss << (int) YAP_IntOfTerm (YAP_ARG2);
ss >> value; ss >> value;
} else if (key == "accuracy") { } else if (key == "bp_accuracy") {
stringstream ss; stringstream ss;
ss << (float) YAP_FloatOfTerm (YAP_ARG2); ss << (float) YAP_FloatOfTerm (YAP_ARG2);
ss >> value; ss >> value;
} else if (key == "max_iter") { } else if (key == "bp_max_iter") {
stringstream ss; stringstream ss;
ss << (int) YAP_IntOfTerm (YAP_ARG2); ss << (int) YAP_IntOfTerm (YAP_ARG2);
ss >> value; ss >> value;
@ -404,7 +418,7 @@ readParfactor (YAP_Term pfTerm)
} }
// read the parameters // read the parameters
const Params& params = readParameters (YAP_ArgOfTerm (4, pfTerm)); const Params& params = readParameters (YAP_ArgOfTerm (4, pfTerm));
// read the constraint // read the constraint
Tuples tuples; Tuples tuples;
@ -420,8 +434,8 @@ readParfactor (YAP_Term pfTerm)
for (unsigned i = 1; i <= arity; i++) { for (unsigned i = 1; i <= arity; i++) {
YAP_Term ti = YAP_ArgOfTerm (i, term); YAP_Term ti = YAP_ArgOfTerm (i, term);
if (YAP_IsAtomTerm (ti) == false) { if (YAP_IsAtomTerm (ti) == false) {
cerr << "error: constraint has free variables" << endl; cerr << "Error: the constraint contains free variables." << endl;
abort(); exit (EXIT_FAILURE);
} }
string name ((char*) YAP_AtomName (YAP_AtomOfTerm (ti))); string name ((char*) YAP_AtomName (YAP_AtomOfTerm (ti)));
tuple[i - 1] = LiftedUtils::getSymbol (name); tuple[i - 1] = LiftedUtils::getSymbol (name);
@ -475,7 +489,7 @@ readLiftedEvidence (
obsFormulas.push_back (ObservedFormula (functor, evidence, args)); obsFormulas.push_back (ObservedFormula (functor, evidence, args));
} }
observedList = YAP_TailOfTerm (observedList); observedList = YAP_TailOfTerm (observedList);
} }
} }
@ -534,15 +548,34 @@ fillAnswersPrologList (vector<Params>& results)
extern "C" void extern "C" void
init_predicates (void) init_predicates (void)
{ {
YAP_UserCPredicate ("cpp_create_lifted_network", createLiftedNetwork, 3); YAP_UserCPredicate ("cpp_create_lifted_network",
YAP_UserCPredicate ("cpp_create_ground_network", createGroundNetwork, 4); createLiftedNetwork, 3);
YAP_UserCPredicate ("cpp_run_lifted_solver", runLiftedSolver, 3);
YAP_UserCPredicate ("cpp_run_ground_solver", runGroundSolver, 3); YAP_UserCPredicate ("cpp_create_ground_network",
YAP_UserCPredicate ("cpp_set_parfactors_params", setParfactorsParams, 2); createGroundNetwork, 4);
YAP_UserCPredicate ("cpp_cpp_set_factors_params", setFactorsParams, 2);
YAP_UserCPredicate ("cpp_set_vars_information", setVarsInformation, 2); YAP_UserCPredicate ("cpp_run_lifted_solver",
YAP_UserCPredicate ("cpp_set_horus_flag", setHorusFlag, 2); runLiftedSolver, 3);
YAP_UserCPredicate ("cpp_free_lifted_network", freeLiftedNetwork, 1);
YAP_UserCPredicate ("cpp_free_ground_network", freeGroundNetwork, 1); YAP_UserCPredicate ("cpp_run_ground_solver",
runGroundSolver, 3);
YAP_UserCPredicate ("cpp_set_parfactors_params",
setParfactorsParams, 3);
YAP_UserCPredicate ("cpp_set_factors_params",
setFactorsParams, 3);
YAP_UserCPredicate ("cpp_set_vars_information",
setVarsInformation, 2);
YAP_UserCPredicate ("cpp_set_horus_flag",
setHorusFlag, 2);
YAP_UserCPredicate ("cpp_free_lifted_network",
freeLiftedNetwork, 1);
YAP_UserCPredicate ("cpp_free_ground_network",
freeGroundNetwork, 1);
} }

View File

@ -120,6 +120,8 @@ class Indexer
const Ranges& ranges_; const Ranges& ranges_;
size_t size_; size_t size_;
vector<size_t> offsets_; vector<size_t> offsets_;
DISALLOW_COPY_AND_ASSIGN (Indexer);
}; };
@ -167,7 +169,7 @@ class MapIndexer
} }
} }
} }
template <typename T> template <typename T>
MapIndexer ( MapIndexer (
const vector<T>& allArgs, const vector<T>& allArgs,
@ -239,6 +241,8 @@ class MapIndexer
const Ranges& ranges_; const Ranges& ranges_;
bool valid_; bool valid_;
vector<size_t> offsets_; vector<size_t> offsets_;
DISALLOW_COPY_AND_ASSIGN (MapIndexer);
}; };

View File

@ -1,7 +1,7 @@
#include "LiftedBp.h" #include "LiftedBp.h"
#include "LiftedOperations.h"
#include "WeightedBp.h" #include "WeightedBp.h"
#include "FactorGraph.h" #include "FactorGraph.h"
#include "LiftedOperations.h"
LiftedBp::LiftedBp (const ParfactorList& parfactorList) LiftedBp::LiftedBp (const ParfactorList& parfactorList)
@ -62,16 +62,15 @@ LiftedBp::printSolverFlags (void) const
{ {
stringstream ss; stringstream ss;
ss << "lifted bp [" ; ss << "lifted bp [" ;
ss << "schedule=" ; ss << "bp_msg_schedule=" ;
typedef BpOptions::Schedule Sch; switch (WeightedBp::msgSchedule()) {
switch (BpOptions::schedule) { case MsgSchedule::SEQ_FIXED: ss << "seq_fixed"; break;
case Sch::SEQ_FIXED: ss << "seq_fixed"; break; case MsgSchedule::SEQ_RANDOM: ss << "seq_random"; break;
case Sch::SEQ_RANDOM: ss << "seq_random"; break; case MsgSchedule::PARALLEL: ss << "parallel"; break;
case Sch::PARALLEL: ss << "parallel"; break; case MsgSchedule::MAX_RESIDUAL: ss << "max_residual"; break;
case Sch::MAX_RESIDUAL: ss << "max_residual"; break;
} }
ss << ",max_iter=" << BpOptions::maxIter; ss << ",bp_max_iter=" << WeightedBp::maxIterations();
ss << ",accuracy=" << BpOptions::accuracy; ss << ",bp_accuracy=" << WeightedBp::accuracy();
ss << ",log_domain=" << Util::toString (Globals::logDomain); ss << ",log_domain=" << Util::toString (Globals::logDomain);
ss << "]" ; ss << "]" ;
cout << ss.str() << endl; cout << ss.str() << endl;
@ -182,10 +181,10 @@ LiftedBp::rangeOfGround (const Ground& gr)
} }
++ it; ++ it;
} }
return std::numeric_limits<unsigned>::max(); return Util::maxUnsigned();
} }
Params Params
LiftedBp::getJointByConditioning ( LiftedBp::getJointByConditioning (

View File

@ -28,7 +28,7 @@ class LiftedBp : public LiftedSolver
void createFactorGraph (void); void createFactorGraph (void);
vector<vector<unsigned>> getWeights (void) const; vector<vector<unsigned>> getWeights (void) const;
unsigned rangeOfGround (const Ground&); unsigned rangeOfGround (const Ground&);
Params getJointByConditioning (const ParfactorList&, const Grounds&); Params getJointByConditioning (const ParfactorList&, const Grounds&);
@ -37,6 +37,8 @@ class LiftedBp : public LiftedSolver
WeightedBp* solver_; WeightedBp* solver_;
FactorGraph* fg_; FactorGraph* fg_;
DISALLOW_COPY_AND_ASSIGN (LiftedBp);
}; };
#endif // HORUS_LIFTEDBP_H #endif // HORUS_LIFTEDBP_H

File diff suppressed because it is too large Load Diff

View File

@ -1,262 +0,0 @@
#ifndef HORUS_LIFTEDCIRCUIT_H
#define HORUS_LIFTEDCIRCUIT_H
#include <stack>
#include "LiftedWCNF.h"
enum CircuitNodeType {
OR_NODE,
AND_NODE,
SET_OR_NODE,
SET_AND_NODE,
INC_EXC_NODE,
LEAF_NODE,
SMOOTH_NODE,
TRUE_NODE,
COMPILATION_FAILED_NODE
};
class CircuitNode
{
public:
CircuitNode (void) { }
virtual double weight (void) const = 0;
};
class OrNode : public CircuitNode
{
public:
OrNode (void) : CircuitNode(), leftBranch_(0), rightBranch_(0) { }
CircuitNode** leftBranch (void) { return &leftBranch_; }
CircuitNode** rightBranch (void) { return &rightBranch_; }
double weight (void) const;
private:
CircuitNode* leftBranch_;
CircuitNode* rightBranch_;
};
class AndNode : public CircuitNode
{
public:
AndNode (void) : CircuitNode(), leftBranch_(0), rightBranch_(0) { }
AndNode (CircuitNode* leftBranch, CircuitNode* rightBranch)
: CircuitNode(), leftBranch_(leftBranch), rightBranch_(rightBranch) { }
CircuitNode** leftBranch (void) { return &leftBranch_; }
CircuitNode** rightBranch (void) { return &rightBranch_; }
double weight (void) const;
private:
CircuitNode* leftBranch_;
CircuitNode* rightBranch_;
};
class SetOrNode : public CircuitNode
{
public:
SetOrNode (unsigned nrGroundings)
: CircuitNode(), follow_(0), nrGroundings_(nrGroundings) { }
CircuitNode** follow (void) { return &follow_; }
static unsigned nrPositives (void) { return nrPos_; }
static unsigned nrNegatives (void) { return nrNeg_; }
static bool isSet (void) { return nrPos_ >= 0; }
double weight (void) const;
private:
CircuitNode* follow_;
unsigned nrGroundings_;
static int nrPos_;
static int nrNeg_;
};
class SetAndNode : public CircuitNode
{
public:
SetAndNode (unsigned nrGroundings)
: CircuitNode(), follow_(0), nrGroundings_(nrGroundings) { }
CircuitNode** follow (void) { return &follow_; }
double weight (void) const;
private:
CircuitNode* follow_;
unsigned nrGroundings_;
};
class IncExcNode : public CircuitNode
{
public:
IncExcNode (void)
: CircuitNode(), plus1Branch_(0), plus2Branch_(0), minusBranch_(0) { }
CircuitNode** plus1Branch (void) { return &plus1Branch_; }
CircuitNode** plus2Branch (void) { return &plus2Branch_; }
CircuitNode** minusBranch (void) { return &minusBranch_; }
double weight (void) const;
private:
CircuitNode* plus1Branch_;
CircuitNode* plus2Branch_;
CircuitNode* minusBranch_;
};
class LeafNode : public CircuitNode
{
public:
LeafNode (Clause* clause, const LiftedWCNF& lwcnf)
: CircuitNode(), clause_(clause), lwcnf_(lwcnf) { }
const Clause* clause (void) const { return clause_; }
Clause* clause (void) { return clause_; }
double weight (void) const;
private:
Clause* clause_;
const LiftedWCNF& lwcnf_;
};
class SmoothNode : public CircuitNode
{
public:
SmoothNode (const Clauses& clauses, const LiftedWCNF& lwcnf)
: CircuitNode(), clauses_(clauses), lwcnf_(lwcnf) { }
const Clauses& clauses (void) const { return clauses_; }
Clauses clauses (void) { return clauses_; }
double weight (void) const;
private:
Clauses clauses_;
const LiftedWCNF& lwcnf_;
};
class TrueNode : public CircuitNode
{
public:
TrueNode (void) : CircuitNode() { }
double weight (void) const;
};
class CompilationFailedNode : public CircuitNode
{
public:
CompilationFailedNode (void) : CircuitNode() { }
double weight (void) const;
};
class LiftedCircuit
{
public:
LiftedCircuit (const LiftedWCNF* lwcnf);
bool isCompilationSucceeded (void) const;
double getWeightedModelCount (void) const;
void exportToGraphViz (const char*);
private:
void compile (CircuitNode** follow, Clauses& clauses);
bool tryUnitPropagation (CircuitNode** follow, Clauses& clauses);
bool tryIndependence (CircuitNode** follow, Clauses& clauses);
bool tryShannonDecomp (CircuitNode** follow, Clauses& clauses);
bool tryInclusionExclusion (CircuitNode** follow, Clauses& clauses);
bool tryIndepPartialGrounding (CircuitNode** follow, Clauses& clauses);
bool tryIndepPartialGroundingAux (Clauses& clauses, ConstraintTree& ct,
LogVars& rootLogVars);
bool tryAtomCounting (CircuitNode** follow, Clauses& clauses);
void shatterCountedLogVars (Clauses& clauses);
bool shatterCountedLogVarsAux (Clauses& clauses);
bool shatterCountedLogVarsAux (Clauses& clauses, size_t idx1, size_t idx2);
bool independentClause (Clause& clause, Clauses& otherClauses) const;
bool independentLiteral (const Literal& lit,
const Literals& otherLits) const;
LitLvTypesSet smoothCircuit (CircuitNode* node);
void createSmoothNode (const LitLvTypesSet& lids,
CircuitNode** prev);
vector<LogVarTypes> getAllPossibleTypes (unsigned nrLogVars) const;
bool containsTypes (const LogVarTypes& typesA,
const LogVarTypes& typesB) const;
CircuitNodeType getCircuitNodeType (const CircuitNode* node) const;
void exportToGraphViz (CircuitNode* node, ofstream&);
void printClauses (CircuitNode* node, ofstream&,
string extraOptions = "");
string escapeNode (const CircuitNode* node) const;
string getExplanationString (CircuitNode* node);
CircuitNode* root_;
const LiftedWCNF* lwcnf_;
Clauses backupClauses_;
unordered_map<CircuitNode*, Clauses> originClausesMap_;
unordered_map<CircuitNode*, string> explanationMap_;
bool compilationSucceeded_;
};
#endif // HORUS_LIFTEDCIRCUIT_H

File diff suppressed because it is too large Load Diff

View File

@ -2,10 +2,280 @@
#define HORUS_LIFTEDKC_H #define HORUS_LIFTEDKC_H
#include "LiftedSolver.h" #include "LiftedSolver.h"
#include "LiftedWCNF.h"
#include "ParfactorList.h" #include "ParfactorList.h"
class LiftedWCNF;
class LiftedCircuit; enum CircuitNodeType {
OR_NODE,
AND_NODE,
SET_OR_NODE,
SET_AND_NODE,
INC_EXC_NODE,
LEAF_NODE,
SMOOTH_NODE,
TRUE_NODE,
COMPILATION_FAILED_NODE
};
class CircuitNode
{
public:
CircuitNode (void) { }
virtual ~CircuitNode (void) { }
virtual double weight (void) const = 0;
};
class OrNode : public CircuitNode
{
public:
OrNode (void) : CircuitNode(), leftBranch_(0), rightBranch_(0) { }
~OrNode (void);
CircuitNode** leftBranch (void) { return &leftBranch_; }
CircuitNode** rightBranch (void) { return &rightBranch_; }
double weight (void) const;
private:
CircuitNode* leftBranch_;
CircuitNode* rightBranch_;
};
class AndNode : public CircuitNode
{
public:
AndNode (void) : CircuitNode(), leftBranch_(0), rightBranch_(0) { }
AndNode (CircuitNode* leftBranch, CircuitNode* rightBranch)
: CircuitNode(), leftBranch_(leftBranch), rightBranch_(rightBranch) { }
~AndNode (void);
CircuitNode** leftBranch (void) { return &leftBranch_; }
CircuitNode** rightBranch (void) { return &rightBranch_; }
double weight (void) const;
private:
CircuitNode* leftBranch_;
CircuitNode* rightBranch_;
};
class SetOrNode : public CircuitNode
{
public:
SetOrNode (unsigned nrGroundings)
: CircuitNode(), follow_(0), nrGroundings_(nrGroundings) { }
~SetOrNode (void);
CircuitNode** follow (void) { return &follow_; }
static unsigned nrPositives (void) { return nrPos_; }
static unsigned nrNegatives (void) { return nrNeg_; }
static bool isSet (void) { return nrPos_ >= 0; }
double weight (void) const;
private:
CircuitNode* follow_;
unsigned nrGroundings_;
static int nrPos_;
static int nrNeg_;
};
class SetAndNode : public CircuitNode
{
public:
SetAndNode (unsigned nrGroundings)
: CircuitNode(), follow_(0), nrGroundings_(nrGroundings) { }
~SetAndNode (void);
CircuitNode** follow (void) { return &follow_; }
double weight (void) const;
private:
CircuitNode* follow_;
unsigned nrGroundings_;
};
class IncExcNode : public CircuitNode
{
public:
IncExcNode (void)
: CircuitNode(), plus1Branch_(0), plus2Branch_(0), minusBranch_(0) { }
~IncExcNode (void);
CircuitNode** plus1Branch (void) { return &plus1Branch_; }
CircuitNode** plus2Branch (void) { return &plus2Branch_; }
CircuitNode** minusBranch (void) { return &minusBranch_; }
double weight (void) const;
private:
CircuitNode* plus1Branch_;
CircuitNode* plus2Branch_;
CircuitNode* minusBranch_;
};
class LeafNode : public CircuitNode
{
public:
LeafNode (Clause* clause, const LiftedWCNF& lwcnf)
: CircuitNode(), clause_(clause), lwcnf_(lwcnf) { }
~LeafNode (void);
const Clause* clause (void) const { return clause_; }
Clause* clause (void) { return clause_; }
double weight (void) const;
private:
Clause* clause_;
const LiftedWCNF& lwcnf_;
};
class SmoothNode : public CircuitNode
{
public:
SmoothNode (const Clauses& clauses, const LiftedWCNF& lwcnf)
: CircuitNode(), clauses_(clauses), lwcnf_(lwcnf) { }
~SmoothNode (void);
const Clauses& clauses (void) const { return clauses_; }
Clauses clauses (void) { return clauses_; }
double weight (void) const;
private:
Clauses clauses_;
const LiftedWCNF& lwcnf_;
};
class TrueNode : public CircuitNode
{
public:
TrueNode (void) : CircuitNode() { }
double weight (void) const;
};
class CompilationFailedNode : public CircuitNode
{
public:
CompilationFailedNode (void) : CircuitNode() { }
double weight (void) const;
};
class LiftedCircuit
{
public:
LiftedCircuit (const LiftedWCNF* lwcnf);
~LiftedCircuit (void);
bool isCompilationSucceeded (void) const;
double getWeightedModelCount (void) const;
void exportToGraphViz (const char*);
private:
void compile (CircuitNode** follow, Clauses& clauses);
bool tryUnitPropagation (CircuitNode** follow, Clauses& clauses);
bool tryIndependence (CircuitNode** follow, Clauses& clauses);
bool tryShannonDecomp (CircuitNode** follow, Clauses& clauses);
bool tryInclusionExclusion (CircuitNode** follow, Clauses& clauses);
bool tryIndepPartialGrounding (CircuitNode** follow, Clauses& clauses);
bool tryIndepPartialGroundingAux (Clauses& clauses, ConstraintTree& ct,
LogVars& rootLogVars);
bool tryAtomCounting (CircuitNode** follow, Clauses& clauses);
void shatterCountedLogVars (Clauses& clauses);
bool shatterCountedLogVarsAux (Clauses& clauses);
bool shatterCountedLogVarsAux (Clauses& clauses, size_t idx1, size_t idx2);
bool independentClause (Clause& clause, Clauses& otherClauses) const;
bool independentLiteral (const Literal& lit,
const Literals& otherLits) const;
LitLvTypesSet smoothCircuit (CircuitNode* node);
void createSmoothNode (const LitLvTypesSet& lids,
CircuitNode** prev);
vector<LogVarTypes> getAllPossibleTypes (unsigned nrLogVars) const;
bool containsTypes (const LogVarTypes& typesA,
const LogVarTypes& typesB) const;
CircuitNodeType getCircuitNodeType (const CircuitNode* node) const;
void exportToGraphViz (CircuitNode* node, ofstream&);
void printClauses (CircuitNode* node, ofstream&,
string extraOptions = "");
string escapeNode (const CircuitNode* node) const;
string getExplanationString (CircuitNode* node);
CircuitNode* root_;
const LiftedWCNF* lwcnf_;
bool compilationSucceeded_;
Clauses backupClauses_;
unordered_map<CircuitNode*, Clauses> originClausesMap_;
unordered_map<CircuitNode*, string> explanationMap_;
DISALLOW_COPY_AND_ASSIGN (LiftedCircuit);
};
class LiftedKc : public LiftedSolver class LiftedKc : public LiftedSolver
@ -24,6 +294,8 @@ class LiftedKc : public LiftedSolver
LiftedWCNF* lwcnf_; LiftedWCNF* lwcnf_;
LiftedCircuit* circuit_; LiftedCircuit* circuit_;
ParfactorList pfList_; ParfactorList pfList_;
DISALLOW_COPY_AND_ASSIGN (LiftedKc);
}; };
#endif // HORUS_LIFTEDKC_H #endif // HORUS_LIFTEDKC_H

View File

@ -35,9 +35,9 @@ LiftedOperations::shatterAgainstQuery (
} }
} }
if (found == false) { if (found == false) {
cerr << "error: could not find a parfactor with ground " ; cerr << "Error: could not find a parfactor with ground " ;
cerr << "`" << query[i] << "'" << endl; cerr << "`" << query[i] << "'." << endl;
exit (0); exit (EXIT_FAILURE);
} }
pfList.add (newPfs); pfList.add (newPfs);
} }
@ -60,12 +60,12 @@ LiftedOperations::runWeakBayesBall (
const Grounds& query) const Grounds& query)
{ {
queue<PrvGroup> todo; // groups to process queue<PrvGroup> todo; // groups to process
set<PrvGroup> done; // processed or in queue set<PrvGroup> done; // processed or in queue
for (size_t i = 0; i < query.size(); i++) { for (size_t i = 0; i < query.size(); i++) {
ParfactorList::iterator it = pfList.begin(); ParfactorList::iterator it = pfList.begin();
while (it != pfList.end()) { while (it != pfList.end()) {
PrvGroup group = (*it)->findGroup (query[i]); PrvGroup group = (*it)->findGroup (query[i]);
if (group != numeric_limits<PrvGroup>::max()) { if (group != std::numeric_limits<PrvGroup>::max()) {
todo.push (group); todo.push (group);
done.insert (group); done.insert (group);
break; break;
@ -128,7 +128,7 @@ LiftedOperations::absorveEvidence (
it = pfList.remove (it); it = pfList.remove (it);
Parfactors absorvedPfs = absorve (obsFormulas[i], pf); Parfactors absorvedPfs = absorve (obsFormulas[i], pf);
if (absorvedPfs.empty() == false) { if (absorvedPfs.empty() == false) {
if (absorvedPfs.size() == 1 && absorvedPfs[0] == 0) { if (absorvedPfs.size() == 1 && !absorvedPfs[0]) {
// just remove pf; // just remove pf;
} else { } else {
Util::addToVector (newPfs, absorvedPfs); Util::addToVector (newPfs, absorvedPfs);
@ -225,7 +225,7 @@ LiftedOperations::absorve (
absorvedPfs.push_back (0); absorvedPfs.push_back (0);
} }
break; break;
} }
g->constr()->moveToTop (formulas[i].logVars()); g->constr()->moveToTop (formulas[i].logVars());
std::pair<ConstraintTree*, ConstraintTree*> res; std::pair<ConstraintTree*, ConstraintTree*> res;

View File

@ -8,19 +8,22 @@ class LiftedOperations
public: public:
static void shatterAgainstQuery ( static void shatterAgainstQuery (
ParfactorList& pfList, const Grounds& query); ParfactorList& pfList, const Grounds& query);
static void runWeakBayesBall ( static void runWeakBayesBall (
ParfactorList& pfList, const Grounds&); ParfactorList& pfList, const Grounds&);
static void absorveEvidence ( static void absorveEvidence (
ParfactorList& pfList, ObservedFormulas& obsFormulas); ParfactorList& pfList, ObservedFormulas& obsFormulas);
static Parfactors countNormalize (Parfactor*, const LogVarSet&); static Parfactors countNormalize (Parfactor*, const LogVarSet&);
static Parfactor calcGroundMultiplication (Parfactor pf); static Parfactor calcGroundMultiplication (Parfactor pf);
private: private:
static Parfactors absorve (ObservedFormula&, Parfactor*); static Parfactors absorve (ObservedFormula&, Parfactor*);
DISALLOW_COPY_AND_ASSIGN (LiftedOperations);
}; };
#endif // HORUS_LIFTEDOPERATIONS_H #endif // HORUS_LIFTEDOPERATIONS_H

View File

@ -21,6 +21,9 @@ class LiftedSolver
protected: protected:
const ParfactorList& parfactorList; const ParfactorList& parfactorList;
private:
DISALLOW_COPY_AND_ASSIGN (LiftedSolver);
}; };
#endif // HORUS_LIFTEDSOLVER_H #endif // HORUS_LIFTEDSOLVER_H

View File

@ -1,6 +1,5 @@
#include <cassert> #include <cassert>
#include <algorithm>
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
@ -61,7 +60,7 @@ ostream& operator<< (ostream &os, const Symbol& s)
ostream& operator<< (ostream &os, const LogVar& X) ostream& operator<< (ostream &os, const LogVar& X)
{ {
const string labels[] = { const string labels[] = {
"A", "B", "C", "D", "E", "F", "A", "B", "C", "D", "E", "F",
"G", "H", "I", "J", "K", "M" }; "G", "H", "I", "J", "K", "M" };
(X >= 12) ? os << "X_" << X.id_ : os << labels[X]; (X >= 12) ? os << "X_" << X.id_ : os << labels[X];
return os; return os;

View File

@ -1,12 +1,11 @@
#ifndef HORUS_LIFTEDUTILS_H #ifndef HORUS_LIFTEDUTILS_H
#define HORUS_LIFTEDUTILS_H #define HORUS_LIFTEDUTILS_H
#include <limits>
#include <string> #include <string>
#include <vector> #include <vector>
#include <unordered_map> #include <unordered_map>
#include "TinySet.h" #include "TinySet.h"
#include "Util.h" #include "Util.h"
@ -51,7 +50,7 @@ class LogVar
} }
bool valid (void) const bool valid (void) const
{ {
return id_ != Util::maxUnsigned(); return id_ != Util::maxUnsigned();
} }
@ -107,7 +106,7 @@ class Ground
size_t arity (void) const { return args_.size(); } size_t arity (void) const { return args_.size(); }
bool isAtom (void) const { return args_.size() == 0; } bool isAtom (void) const { return args_.empty(); }
friend ostream& operator<< (ostream &os, const Ground& gr); friend ostream& operator<< (ostream &os, const Ground& gr);
@ -145,11 +144,11 @@ class Substitution
return X; return X;
} }
bool containsReplacementFor (LogVar X) const bool containsReplacementFor (LogVar X) const
{ {
return Util::contains (subs_, X); return Util::contains (subs_, X);
} }
size_t nrReplacements (void) const { return subs_.size(); } size_t nrReplacements (void) const { return subs_.size(); }
LogVars getDiscardedLogVars (void) const; LogVars getDiscardedLogVars (void) const;
@ -161,6 +160,5 @@ class Substitution
}; };
#endif // HORUS_LIFTEDUTILS_H #endif // HORUS_LIFTEDUTILS_H

View File

@ -1,4 +1,5 @@
#include <algorithm> #include <algorithm>
#include <set> #include <set>
#include "LiftedVe.h" #include "LiftedVe.h"
@ -133,7 +134,7 @@ ProductOperator::toString (void)
stringstream ss; stringstream ss;
ss << "just multiplicate " ; ss << "just multiplicate " ;
ss << (*g1_)->getAllGroups(); ss << (*g1_)->getAllGroups();
ss << " x " ; ss << " x " ;
ss << (*g2_)->getAllGroups(); ss << (*g2_)->getAllGroups();
ss << " [cost=" << std::exp (getLogCost()) << "]" << endl; ss << " [cost=" << std::exp (getLogCost()) << "]" << endl;
return ss.str(); return ss.str();
@ -155,7 +156,7 @@ ProductOperator::validOp (Parfactor* g1, Parfactor* g2)
} }
size_t idx1 = g1->indexOfGroup (intersect[i]); size_t idx1 = g1->indexOfGroup (intersect[i]);
size_t idx2 = g2->indexOfGroup (intersect[i]); size_t idx2 = g2->indexOfGroup (intersect[i]);
if (g1->range (idx1) != g2->range (idx2)) { if (g1->range (idx1) != g2->range (idx2)) {
return false; return false;
} }
} }
@ -710,10 +711,10 @@ LiftedVe::getBestOperation (const Grounds& query)
validOps = LiftedOperator::getValidOps (pfList_, query); validOps = LiftedOperator::getValidOps (pfList_, query);
for (size_t i = 0; i < validOps.size(); i++) { for (size_t i = 0; i < validOps.size(); i++) {
double cost = validOps[i]->getLogCost(); double cost = validOps[i]->getLogCost();
if ((bestOp == 0) || (cost < bestCost)) { if (!bestOp || cost < bestCost) {
bestOp = validOps[i]; bestOp = validOps[i];
bestCost = cost; bestCost = cost;
} }
} }
if (bestCost > largestCost_) { if (bestCost > largestCost_) {
largestCost_ = bestCost; largestCost_ = bestCost;

View File

@ -9,7 +9,7 @@ class LiftedOperator
{ {
public: public:
virtual ~LiftedOperator (void) { } virtual ~LiftedOperator (void) { }
virtual double getLogCost (void) = 0; virtual double getLogCost (void) = 0;
virtual void apply (void) = 0; virtual void apply (void) = 0;
@ -23,6 +23,9 @@ class LiftedOperator
static vector<ParfactorList::iterator> getParfactorsWithGroup ( static vector<ParfactorList::iterator> getParfactorsWithGroup (
ParfactorList&, PrvGroup group); ParfactorList&, PrvGroup group);
private:
DISALLOW_ASSIGN (LiftedOperator);
}; };
@ -48,6 +51,8 @@ class ProductOperator : public LiftedOperator
ParfactorList::iterator g1_; ParfactorList::iterator g1_;
ParfactorList::iterator g2_; ParfactorList::iterator g2_;
ParfactorList& pfList_; ParfactorList& pfList_;
DISALLOW_COPY_AND_ASSIGN (ProductOperator);
}; };
@ -55,7 +60,7 @@ class ProductOperator : public LiftedOperator
class SumOutOperator : public LiftedOperator class SumOutOperator : public LiftedOperator
{ {
public: public:
SumOutOperator (PrvGroup group, ParfactorList& pfList) SumOutOperator (PrvGroup group, ParfactorList& pfList)
: group_(group), pfList_(pfList) { } : group_(group), pfList_(pfList) { }
double getLogCost (void); double getLogCost (void);
@ -74,6 +79,8 @@ class SumOutOperator : public LiftedOperator
PrvGroup group_; PrvGroup group_;
ParfactorList& pfList_; ParfactorList& pfList_;
DISALLOW_COPY_AND_ASSIGN (SumOutOperator);
}; };
@ -101,6 +108,8 @@ class CountingOperator : public LiftedOperator
ParfactorList::iterator pfIter_; ParfactorList::iterator pfIter_;
LogVar X_; LogVar X_;
ParfactorList& pfList_; ParfactorList& pfList_;
DISALLOW_COPY_AND_ASSIGN (CountingOperator);
}; };
@ -123,11 +132,13 @@ class GroundOperator : public LiftedOperator
string toString (void); string toString (void);
private: private:
vector<pair<PrvGroup, unsigned>> getAffectedFormulas (void); vector<pair<PrvGroup, unsigned>> getAffectedFormulas (void);
PrvGroup group_; PrvGroup group_;
unsigned lvIndex_; unsigned lvIndex_;
ParfactorList& pfList_; ParfactorList& pfList_;
DISALLOW_COPY_AND_ASSIGN (GroundOperator);
}; };
@ -149,6 +160,8 @@ class LiftedVe : public LiftedSolver
ParfactorList pfList_; ParfactorList pfList_;
double largestCost_; double largestCost_;
DISALLOW_COPY_AND_ASSIGN (LiftedVe);
}; };
#endif // HORUS_LIFTEDVE_H #endif // HORUS_LIFTEDVE_H

View File

@ -3,11 +3,10 @@
#include "Indexer.h" #include "Indexer.h"
bool bool
Literal::isGround (ConstraintTree constr, LogVarSet ipgLogVars) const Literal::isGround (ConstraintTree constr, LogVarSet ipgLogVars) const
{ {
if (logVars_.size() == 0) { if (logVars_.empty()) {
return true; return true;
} }
LogVarSet lvs (logVars_); LogVarSet lvs (logVars_);
@ -108,7 +107,7 @@ Clause::containsPositiveLiteral (
} }
bool bool
Clause::containsNegativeLiteral ( Clause::containsNegativeLiteral (
LiteralId lid, LiteralId lid,
@ -195,7 +194,7 @@ Clause::isPositiveCountedLogVar (LogVar X) const
assert (constr_.logVarSet().contains (X)); assert (constr_.logVarSet().contains (X));
return posCountedLvs_.contains (X); return posCountedLvs_.contains (X);
} }
bool bool
@ -235,7 +234,7 @@ Clause::ipgCandidates (void) const
LogVarSet allLvs = constr_.logVarSet(); LogVarSet allLvs = constr_.logVarSet();
allLvs -= ipgLvs_; allLvs -= ipgLvs_;
allLvs -= posCountedLvs_; allLvs -= posCountedLvs_;
allLvs -= negCountedLvs_; allLvs -= negCountedLvs_;
for (size_t i = 0; i < allLvs.size(); i++) { for (size_t i = 0; i < allLvs.size(); i++) {
bool valid = true; bool valid = true;
for (size_t j = 0; j < literals_.size(); j++) { for (size_t j = 0; j < literals_.size(); j++) {
@ -262,7 +261,7 @@ Clause::logVarTypes (size_t litIdx) const
if (posCountedLvs_.contains (lvs[i])) { if (posCountedLvs_.contains (lvs[i])) {
types.push_back (LogVarType::POS_LV); types.push_back (LogVarType::POS_LV);
} else if (negCountedLvs_.contains (lvs[i])) { } else if (negCountedLvs_.contains (lvs[i])) {
types.push_back (LogVarType::NEG_LV); types.push_back (LogVarType::NEG_LV);
} else { } else {
types.push_back (LogVarType::FULL_LV); types.push_back (LogVarType::FULL_LV);
} }
@ -327,6 +326,16 @@ Clause::printClauses (const Clauses& clauses)
void
Clause::deleteClauses (Clauses& clauses)
{
for (size_t i = 0; i < clauses.size(); i++) {
delete clauses[i];
}
}
std::ostream& std::ostream&
operator<< (ostream &os, const Clause& clause) operator<< (ostream &os, const Clause& clause)
{ {
@ -381,7 +390,7 @@ LiftedWCNF::LiftedWCNF (const ParfactorList& pfList)
{ {
addIndicatorClauses (pfList); addIndicatorClauses (pfList);
addParameterClauses (pfList); addParameterClauses (pfList);
/* /*
// INCLUSION-EXCLUSION TEST // INCLUSION-EXCLUSION TEST
clauses_.clear(); clauses_.clear();
@ -427,7 +436,7 @@ LiftedWCNF::LiftedWCNF (const ParfactorList& pfList)
c2->addLiteralComplemented (Literal (1, {1,0})); c2->addLiteralComplemented (Literal (1, {1,0}));
clauses_.push_back(c2); clauses_.push_back(c2);
*/ */
if (Globals::verbosity > 1) { if (Globals::verbosity > 1) {
cout << "FORMULA INDICATORS:" << endl; cout << "FORMULA INDICATORS:" << endl;
printFormulaIndicators(); printFormulaIndicators();
@ -445,7 +454,7 @@ LiftedWCNF::LiftedWCNF (const ParfactorList& pfList)
LiftedWCNF::~LiftedWCNF (void) LiftedWCNF::~LiftedWCNF (void)
{ {
Clause::deleteClauses (clauses_);
} }
@ -569,7 +578,7 @@ LiftedWCNF::addParameterClauses (const ParfactorList& pfList)
// ¬θxi|u1,...,un v λu2 -> tempClause // ¬θxi|u1,...,un v λu2 -> tempClause
double posWeight = (**it)[indexer]; double posWeight = (**it)[indexer];
addWeight (paramVarLid, posWeight, LogAware::one()); addWeight (paramVarLid, posWeight, LogAware::one());
Clause* clause1 = new Clause (*(*it)->constr()); Clause* clause1 = new Clause (*(*it)->constr());
for (unsigned i = 0; i < groups.size(); i++) { for (unsigned i = 0; i < groups.size(); i++) {
@ -583,7 +592,7 @@ LiftedWCNF::addParameterClauses (const ParfactorList& pfList)
tempClause->addLiteralComplemented (Literal ( tempClause->addLiteralComplemented (Literal (
paramVarLid, (*it)->constr()->logVars())); paramVarLid, (*it)->constr()->logVars()));
tempClause->addLiteral (Literal (lid, (*it)->argument(i).logVars())); tempClause->addLiteral (Literal (lid, (*it)->argument(i).logVars()));
clauses_.push_back (tempClause); clauses_.push_back (tempClause);
} }
clause1->addLiteral (Literal (paramVarLid, (*it)->constr()->logVars())); clause1->addLiteral (Literal (paramVarLid, (*it)->constr()->logVars()));
clauses_.push_back (clause1); clauses_.push_back (clause1);
@ -631,7 +640,7 @@ LiftedWCNF::printWeights (void) const
unordered_map<LiteralId, std::pair<double,double>>::const_iterator it; unordered_map<LiteralId, std::pair<double,double>>::const_iterator it;
it = weights_.begin(); it = weights_.begin();
while (it != weights_.end()) { while (it != weights_.end()) {
cout << "λ" << it->first << " weights: " ; cout << "λ" << it->first << " weights: " ;
cout << it->second.first << " " << it->second.second; cout << it->second.first << " " << it->second.second;
cout << endl; cout << endl;
++ it; ++ it;

View File

@ -1,15 +1,14 @@
#ifndef HORUS_LIFTEDWCNF_H #ifndef HORUS_LIFTEDWCNF_H
#define HORUS_LIFTEDWCNF_H #define HORUS_LIFTEDWCNF_H
#include <unordered_map>
#include "ParfactorList.h" #include "ParfactorList.h"
using namespace std; using namespace std;
typedef long LiteralId;
class ConstraintTree; class ConstraintTree;
enum LogVarType enum LogVarType
{ {
FULL_LV, FULL_LV,
@ -17,8 +16,8 @@ enum LogVarType
NEG_LV NEG_LV
}; };
typedef vector<LogVarType> LogVarTypes; typedef long LiteralId;
typedef vector<LogVarType> LogVarTypes;
class Literal class Literal
@ -33,19 +32,19 @@ class Literal
LiteralId lid (void) const { return lid_; } LiteralId lid (void) const { return lid_; }
LogVars logVars (void) const { return logVars_; } LogVars logVars (void) const { return logVars_; }
size_t nrLogVars (void) const { return logVars_.size(); } size_t nrLogVars (void) const { return logVars_.size(); }
LogVarSet logVarSet (void) const { return LogVarSet (logVars_); } LogVarSet logVarSet (void) const { return LogVarSet (logVars_); }
void complement (void) { negated_ = !negated_; } void complement (void) { negated_ = !negated_; }
bool isPositive (void) const { return negated_ == false; } bool isPositive (void) const { return negated_ == false; }
bool isNegative (void) const { return negated_; } bool isNegative (void) const { return negated_; }
bool isGround (ConstraintTree constr, LogVarSet ipgLogVars) const; bool isGround (ConstraintTree constr, LogVarSet ipgLogVars) const;
size_t indexOfLogVar (LogVar X) const; size_t indexOfLogVar (LogVar X) const;
string toString (LogVarSet ipgLogVars = LogVarSet(), string toString (LogVarSet ipgLogVars = LogVarSet(),
@ -74,9 +73,9 @@ class Clause
void addLiteral (const Literal& l) { literals_.push_back (l); } void addLiteral (const Literal& l) { literals_.push_back (l); }
const Literals& literals (void) const { return literals_; } const Literals& literals (void) const { return literals_; }
Literals& literals (void) { return literals_; } Literals& literals (void) { return literals_; }
size_t nrLiterals (void) const { return literals_.size(); } size_t nrLiterals (void) const { return literals_.size(); }
const ConstraintTree& constr (void) const { return constr_; } const ConstraintTree& constr (void) const { return constr_; }
@ -100,7 +99,7 @@ class Clause
unsigned nrPosCountedLogVars (void) const { return posCountedLvs_.size(); } unsigned nrPosCountedLogVars (void) const { return posCountedLvs_.size(); }
unsigned nrNegCountedLogVars (void) const { return negCountedLvs_.size(); } unsigned nrNegCountedLogVars (void) const { return negCountedLvs_.size(); }
void addLiteralComplemented (const Literal& lit); void addLiteralComplemented (const Literal& lit);
bool containsLiteral (LiteralId lid) const; bool containsLiteral (LiteralId lid) const;
@ -119,8 +118,8 @@ class Clause
bool isPositiveCountedLogVar (LogVar X) const; bool isPositiveCountedLogVar (LogVar X) const;
bool isNegativeCountedLogVar (LogVar X) const; bool isNegativeCountedLogVar (LogVar X) const;
bool isIpgLogVar (LogVar X) const; bool isIpgLogVar (LogVar X) const;
TinySet<LiteralId> lidSet (void) const; TinySet<LiteralId> lidSet (void) const;
@ -130,13 +129,15 @@ class Clause
LogVarTypes logVarTypes (size_t litIdx) const; LogVarTypes logVarTypes (size_t litIdx) const;
void removeLiteral (size_t litIdx); void removeLiteral (size_t litIdx);
static bool independentClauses (Clause& c1, Clause& c2); static bool independentClauses (Clause& c1, Clause& c2);
static vector<Clause*> copyClauses (const vector<Clause*>& clauses); static vector<Clause*> copyClauses (const vector<Clause*>& clauses);
static void printClauses (const vector<Clause*>& clauses); static void printClauses (const vector<Clause*>& clauses);
static void deleteClauses (vector<Clause*>& clauses);
friend std::ostream& operator<< (ostream &os, const Clause& clause); friend std::ostream& operator<< (ostream &os, const Clause& clause);
private: private:
@ -147,6 +148,8 @@ class Clause
LogVarSet posCountedLvs_; LogVarSet posCountedLvs_;
LogVarSet negCountedLvs_; LogVarSet negCountedLvs_;
ConstraintTree constr_; ConstraintTree constr_;
DISALLOW_ASSIGN (Clause);
}; };
typedef vector<Clause*> Clauses; typedef vector<Clause*> Clauses;
@ -171,14 +174,14 @@ class LitLvTypes
return false; return false;
} }
}; };
LitLvTypes (LiteralId lid, const LogVarTypes& lvTypes) : LitLvTypes (LiteralId lid, const LogVarTypes& lvTypes) :
lid_(lid), lvTypes_(lvTypes) { } lid_(lid), lvTypes_(lvTypes) { }
LiteralId lid (void) const { return lid_; } LiteralId lid (void) const { return lid_; }
const LogVarTypes& logVarTypes (void) const { return lvTypes_; } const LogVarTypes& logVarTypes (void) const { return lvTypes_; }
void setAllFullLogVars (void) { void setAllFullLogVars (void) {
std::fill (lvTypes_.begin(), lvTypes_.end(), LogVarType::FULL_LV); } std::fill (lvTypes_.begin(), lvTypes_.end(), LogVarType::FULL_LV); }
@ -219,7 +222,6 @@ class LiftedWCNF
void printClauses (void) const; void printClauses (void) const;
private: private:
LiteralId getLiteralId (PrvGroup prvGroup, unsigned range); LiteralId getLiteralId (PrvGroup prvGroup, unsigned range);
void addIndicatorClauses (const ParfactorList& pfList); void addIndicatorClauses (const ParfactorList& pfList);
@ -228,9 +230,11 @@ class LiftedWCNF
Clauses clauses_; Clauses clauses_;
LiteralId freeLiteralId_; LiteralId freeLiteralId_;
const ParfactorList& pfList_; const ParfactorList& pfList_;
unordered_map<PrvGroup, vector<LiteralId>> map_; unordered_map<PrvGroup, vector<LiteralId>> map_;
unordered_map<LiteralId, std::pair<double,double>> weights_; unordered_map<LiteralId, std::pair<double,double>> weights_;
DISALLOW_COPY_AND_ASSIGN (LiftedWCNF);
}; };
#endif // HORUS_LIFTEDWCNF_H #endif // HORUS_LIFTEDWCNF_H

View File

@ -23,10 +23,10 @@ CC=@CC@
CXX=@CXX@ CXX=@CXX@
# normal # normal
#CXXFLAGS= -std=c++0x @SHLIB_CXXFLAGS@ $(YAP_EXTRAS) $(DEFS) -D_YAP_NOT_INSTALLED_=1 -I$(srcdir) -I../../.. -I$(srcdir)/../../../include @CPPFLAGS@ -DNDEBUG CXXFLAGS= -std=c++0x @SHLIB_CXXFLAGS@ $(YAP_EXTRAS) $(DEFS) -D_YAP_NOT_INSTALLED_=1 -I$(srcdir) -I../../.. -I$(srcdir)/../../../include @CPPFLAGS@ -DNDEBUG
# debug # debug
CXXFLAGS= -std=c++0x @SHLIB_CXXFLAGS@ $(YAP_EXTRAS) $(DEFS) -D_YAP_NOT_INSTALLED_=1 -I$(srcdir) -I../../.. -I$(srcdir)/../../../include @CPPFLAGS@ -g -O0 -Wextra #CXXFLAGS= -std=c++0x @SHLIB_CXXFLAGS@ $(YAP_EXTRAS) $(DEFS) -D_YAP_NOT_INSTALLED_=1 -I$(srcdir) -I../../.. -I$(srcdir)/../../../include @CPPFLAGS@ -g -O0 -Wextra
# #
@ -43,6 +43,7 @@ SO=@SO@
#4.1VPATH=@srcdir@:@srcdir@/OPTYap #4.1VPATH=@srcdir@:@srcdir@/OPTYap
CWD=$(PWD) CWD=$(PWD)
HCLI = $(srcdir)/hcli
HEADERS = \ HEADERS = \
$(srcdir)/BayesBall.h \ $(srcdir)/BayesBall.h \
@ -57,13 +58,12 @@ HEADERS = \
$(srcdir)/Horus.h \ $(srcdir)/Horus.h \
$(srcdir)/Indexer.h \ $(srcdir)/Indexer.h \
$(srcdir)/LiftedBp.h \ $(srcdir)/LiftedBp.h \
$(srcdir)/LiftedCircuit.h \ $(srcdir)/LiftedKc.h \
$(srcdir)/LiftedKc.h \ $(srcdir)/LiftedOperations.h \
$(srcdir)/LiftedOperations.h \ $(srcdir)/LiftedSolver.h \
$(srcdir)/LiftedSolver.h \
$(srcdir)/LiftedUtils.h \ $(srcdir)/LiftedUtils.h \
$(srcdir)/LiftedVe.h \ $(srcdir)/LiftedVe.h \
$(srcdir)/LiftedWCNF.h \ $(srcdir)/LiftedWCNF.h \
$(srcdir)/Parfactor.h \ $(srcdir)/Parfactor.h \
$(srcdir)/ParfactorList.h \ $(srcdir)/ParfactorList.h \
$(srcdir)/ProbFormula.h \ $(srcdir)/ProbFormula.h \
@ -73,7 +73,7 @@ HEADERS = \
$(srcdir)/Var.h \ $(srcdir)/Var.h \
$(srcdir)/VarElim.h \ $(srcdir)/VarElim.h \
$(srcdir)/WeightedBp.h $(srcdir)/WeightedBp.h
CPP_SOURCES = \ CPP_SOURCES = \
$(srcdir)/BayesBall.cpp \ $(srcdir)/BayesBall.cpp \
$(srcdir)/BayesBallGraph.cpp \ $(srcdir)/BayesBallGraph.cpp \
@ -87,12 +87,11 @@ CPP_SOURCES = \
$(srcdir)/HorusCli.cpp \ $(srcdir)/HorusCli.cpp \
$(srcdir)/HorusYap.cpp \ $(srcdir)/HorusYap.cpp \
$(srcdir)/LiftedBp.cpp \ $(srcdir)/LiftedBp.cpp \
$(srcdir)/LiftedCircuit.cpp \ $(srcdir)/LiftedKc.cpp \
$(srcdir)/LiftedKc.cpp \ $(srcdir)/LiftedOperations.cpp \
$(srcdir)/LiftedOperations.cpp \
$(srcdir)/LiftedUtils.cpp \ $(srcdir)/LiftedUtils.cpp \
$(srcdir)/LiftedVe.cpp \ $(srcdir)/LiftedVe.cpp \
$(srcdir)/LiftedWCNF.cpp \ $(srcdir)/LiftedWCNF.cpp \
$(srcdir)/Parfactor.cpp \ $(srcdir)/Parfactor.cpp \
$(srcdir)/ParfactorList.cpp \ $(srcdir)/ParfactorList.cpp \
$(srcdir)/ProbFormula.cpp \ $(srcdir)/ProbFormula.cpp \
@ -114,12 +113,11 @@ OBJS = \
Histogram.o \ Histogram.o \
HorusYap.o \ HorusYap.o \
LiftedBp.o \ LiftedBp.o \
LiftedCircuit.o \ LiftedKc.o \
LiftedKc.o \ LiftedOperations.o \
LiftedOperations.o \
LiftedUtils.o \ LiftedUtils.o \
LiftedVe.o \ LiftedVe.o \
LiftedWCNF.o \ LiftedWCNF.o \
ProbFormula.o \ ProbFormula.o \
Parfactor.o \ Parfactor.o \
ParfactorList.o \ ParfactorList.o \
@ -159,15 +157,16 @@ all: $(SOBJS) hcli
hcli: $(HCLI_OBJS) hcli: $(HCLI_OBJS)
$(CXX) -o hcli $(HCLI_OBJS) $(CXX) -o $(HCLI) $(HCLI_OBJS)
install: all install: all
$(INSTALL_PROGRAM) $(SOBJS) $(DESTDIR)$(YAPLIBDIR) $(INSTALL_PROGRAM) $(SOBJS) $(DESTDIR)$(YAPLIBDIR)
$(INSTALL_PROGRAM) $(HCLI) $(DESTDIR)$(BINDIR)
clean: clean:
rm -f *.o *~ $(OBJS) $(SOBJS) *.BAK hcli rm -f *.o *~ $(OBJS) $(SOBJS) $(HCLI) *.BAK
erase_dots: erase_dots:
@ -178,8 +177,8 @@ depend: $(HEADERS) $(CPP_SOURCES)
-@if test "$(GCC)" = yes; then\ -@if test "$(GCC)" = yes; then\
$(CC) -std=c++0x -MM -MG $(CFLAGS) -I$(srcdir) -I$(srcdir)/../../../../include -I$(srcdir)/../../../../H $(CPP_SOURCES) >> Makefile;\ $(CC) -std=c++0x -MM -MG $(CFLAGS) -I$(srcdir) -I$(srcdir)/../../../../include -I$(srcdir)/../../../../H $(CPP_SOURCES) >> Makefile;\
else\ else\
makedepend -f - -- $(CFLAGS) -I$(srcdir)/../../../../H -I$(srcdir)/../../../../include -- $(CPP_SOURCES) |\ makedepend -f - -- $(CFLAGS) -I$(srcdir)/../../../../H -I$(srcdir)/../../../../include -- $(CPP_SOURCES) |\
sed 's|.*/\([^:]*\):|\1:|' >> Makefile ;\ sed 's|.*/\([^:]*\):|\1:|' >> Makefile ;\
fi fi
# DO NOT DELETE THIS LINE -- make depend depends on it. # DO NOT DELETE THIS LINE -- make depend depends on it.

View File

@ -1,4 +1,3 @@
#include "Parfactor.h" #include "Parfactor.h"
#include "Histogram.h" #include "Histogram.h"
#include "Indexer.h" #include "Indexer.h"
@ -8,7 +7,7 @@
Parfactor::Parfactor ( Parfactor::Parfactor (
const ProbFormulas& formulas, const ProbFormulas& formulas,
const Params& params, const Params& params,
const Tuples& tuples, const Tuples& tuples,
unsigned distId) unsigned distId)
{ {
@ -26,7 +25,24 @@ Parfactor::Parfactor (
} }
} }
} }
LogVar newLv = logVars.size();
constr_ = new ConstraintTree (logVars, tuples); constr_ = new ConstraintTree (logVars, tuples);
// Change formulas like f(X,X), X in {(p1),(p2),...}
// to be like f(X,Y), (X,Y) in {(p1,p1),(p2,p2),...}.
// This will simplify shattering on the constraint tree.
for (size_t i = 0; i < args_.size(); i++) {
LogVarSet lvSet;
LogVars& lvs = args_[i].logVars();
for (size_t j = 0; j < lvs.size(); j++) {
if (lvSet.contains (lvs[j]) == false) {
lvSet |= lvs[j];
} else {
constr_->cloneLogVar (lvs[j], newLv);
lvs[j] = newLv;
++ newLv;
}
}
}
assert (params_.size() == Util::sizeExpected (ranges_)); assert (params_.size() == Util::sizeExpected (ranges_));
} }
@ -204,7 +220,7 @@ Parfactor::countConvert (LogVar X)
assert (constr_->isCountNormalized (X)); assert (constr_->isCountNormalized (X));
assert (constr_->getConditionalCount (X) > 1); assert (constr_->getConditionalCount (X) > 1);
assert (canCountConvert (X)); assert (canCountConvert (X));
unsigned N = constr_->getConditionalCount (X); unsigned N = constr_->getConditionalCount (X);
unsigned R = ranges_[fIdx]; unsigned R = ranges_[fIdx];
unsigned H = HistogramSet::nrHistograms (N, R); unsigned H = HistogramSet::nrHistograms (N, R);
@ -319,7 +335,7 @@ Parfactor::fullExpand (LogVar X)
sumIndexes.push_back (HistogramSet::findIndex (hist, originHists)); sumIndexes.push_back (HistogramSet::findIndex (hist, originHists));
++ indexer; ++ indexer;
} }
expandPotential (fIdx, std::pow (R, N), sumIndexes); expandPotential (fIdx, std::pow (R, N), sumIndexes);
ProbFormula f = args_[fIdx]; ProbFormula f = args_[fIdx];
@ -343,7 +359,7 @@ Parfactor::reorderAccordingGrounds (const Grounds& grounds)
ProbFormulas newFormulas; ProbFormulas newFormulas;
for (size_t i = 0; i < grounds.size(); i++) { for (size_t i = 0; i < grounds.size(); i++) {
for (size_t j = 0; j < args_.size(); j++) { for (size_t j = 0; j < args_.size(); j++) {
if (grounds[i].functor() == args_[j].functor() && if (grounds[i].functor() == args_[j].functor() &&
grounds[i].arity() == args_[j].arity()) { grounds[i].arity() == args_[j].arity()) {
constr_->moveToTop (args_[j].logVars()); constr_->moveToTop (args_[j].logVars());
if (constr_->containsTuple (grounds[i].args())) { if (constr_->containsTuple (grounds[i].args())) {
@ -407,7 +423,7 @@ Parfactor::indexOfGround (const Ground& ground) const
{ {
size_t idx = args_.size(); size_t idx = args_.size();
for (size_t i = 0; i < args_.size(); i++) { for (size_t i = 0; i < args_.size(); i++) {
if (args_[i].functor() == ground.functor() && if (args_[i].functor() == ground.functor() &&
args_[i].arity() == ground.arity()) { args_[i].arity() == ground.arity()) {
constr_->moveToTop (args_[i].logVars()); constr_->moveToTop (args_[i].logVars());
if (constr_->containsTuple (ground.args())) { if (constr_->containsTuple (ground.args())) {
@ -426,7 +442,7 @@ Parfactor::findGroup (const Ground& ground) const
{ {
size_t idx = indexOfGround (ground); size_t idx = indexOfGround (ground);
return idx == args_.size() return idx == args_.size()
? numeric_limits<PrvGroup>::max() ? std::numeric_limits<PrvGroup>::max()
: args_[idx].group(); : args_[idx].group();
} }
@ -435,7 +451,7 @@ Parfactor::findGroup (const Ground& ground) const
bool bool
Parfactor::containsGround (const Ground& ground) const Parfactor::containsGround (const Ground& ground) const
{ {
return findGroup (ground) != numeric_limits<PrvGroup>::max(); return findGroup (ground) != std::numeric_limits<PrvGroup>::max();
} }
@ -672,9 +688,9 @@ Parfactor::expandPotential (
{ {
ullong newSize = (params_.size() / ranges_[fIdx]) * newRange; ullong newSize = (params_.size() / ranges_[fIdx]) * newRange;
if (newSize > params_.max_size()) { if (newSize > params_.max_size()) {
cerr << "error: an overflow occurred when performing expansion" ; cerr << "Error: an overflow occurred when performing expansion." ;
cerr << endl; cerr << endl;
abort(); exit (EXIT_FAILURE);
} }
Params backup = params_; Params backup = params_;
@ -789,7 +805,7 @@ Parfactor::simplifyParfactor (size_t fIdx1, size_t fIdx2)
while (indexer.valid()) { while (indexer.valid()) {
if (indexer[fIdx1] == indexer[fIdx2]) { if (indexer[fIdx1] == indexer[fIdx2]) {
params_.push_back (backup[indexer]); params_.push_back (backup[indexer]);
} }
++ indexer; ++ indexer;
} }
for (size_t i = 0; i < args_[fIdx2].logVars().size(); i++) { for (size_t i = 0; i < args_[fIdx2].logVars().size(); i++) {
@ -812,7 +828,7 @@ Parfactor::getAlignLogVars (Parfactor* g1, Parfactor* g2)
TinySet<size_t> matchedI; TinySet<size_t> matchedI;
TinySet<size_t> matchedJ; TinySet<size_t> matchedJ;
ProbFormulas& formulas1 = g1->arguments(); ProbFormulas& formulas1 = g1->arguments();
ProbFormulas& formulas2 = g2->arguments(); ProbFormulas& formulas2 = g2->arguments();
for (size_t i = 0; i < formulas1.size(); i++) { for (size_t i = 0; i < formulas1.size(); i++) {
for (size_t j = 0; j < formulas2.size(); j++) { for (size_t j = 0; j < formulas2.size(); j++) {
if (formulas1[i].group() == formulas2[j].group() && if (formulas1[i].group() == formulas2[j].group() &&
@ -865,7 +881,7 @@ Parfactor::alignLogicalVars (Parfactor* g1, Parfactor* g2)
LogVar freeLogVar (0); LogVar freeLogVar (0);
Substitution theta1, theta2; Substitution theta1, theta2;
for (size_t i = 0; i < alignLvs1.size(); i++) { for (size_t i = 0; i < alignLvs1.size(); i++) {
bool b1 = theta1.containsReplacementFor (alignLvs1[i]); bool b1 = theta1.containsReplacementFor (alignLvs1[i]);
bool b2 = theta2.containsReplacementFor (alignLvs2[i]); bool b2 = theta2.containsReplacementFor (alignLvs2[i]);
if (b1 == false && b2 == false) { if (b1 == false && b2 == false) {
theta1.add (alignLvs1[i], freeLogVar); theta1.add (alignLvs1[i], freeLogVar);
@ -894,11 +910,11 @@ Parfactor::alignLogicalVars (Parfactor* g1, Parfactor* g2)
} }
// handle this type of situation: // handle this type of situation:
// g1 = p(X), q(X) ; X in {(p1),(p2)} // g1 = p(X), q(X) ; X in {(p1),(p2)}
// g2 = p(X), q(Y) ; (X,Y) in {(p1,p2),(p2,p1)} // g2 = p(X), q(Y) ; (X,Y) in {(p1,p2),(p2,p1)}
LogVars discardedLvs1 = theta1.getDiscardedLogVars(); LogVars discardedLvs1 = theta1.getDiscardedLogVars();
for (size_t i = 0; i < discardedLvs1.size(); i++) { for (size_t i = 0; i < discardedLvs1.size(); i++) {
if (g1->constr()->isSingleton (discardedLvs1[i]) && if (g1->constr()->isSingleton (discardedLvs1[i]) &&
g1->nrFormulas (discardedLvs1[i]) == 1) { g1->nrFormulas (discardedLvs1[i]) == 1) {
g1->constr()->remove (discardedLvs1[i]); g1->constr()->remove (discardedLvs1[i]);
} else { } else {

View File

@ -1,15 +1,12 @@
#ifndef HORUS_PARFACTOR_H #ifndef HORUS_PARFACTOR_H
#define HORUS_PARFACTOR_H #define HORUS_PARFACTOR_H
#include <list> #include "Factor.h"
#include <unordered_map>
#include "ProbFormula.h" #include "ProbFormula.h"
#include "ConstraintTree.h" #include "ConstraintTree.h"
#include "LiftedUtils.h" #include "LiftedUtils.h"
#include "Horus.h" #include "Horus.h"
#include "Factor.h"
class Parfactor : public TFactor<ProbFormula> class Parfactor : public TFactor<ProbFormula>
{ {
@ -33,21 +30,21 @@ class Parfactor : public TFactor<ProbFormula>
const ConstraintTree* constr (void) const { return constr_; } const ConstraintTree* constr (void) const { return constr_; }
const LogVars& logVars (void) const { return constr_->logVars(); } const LogVars& logVars (void) const { return constr_->logVars(); }
const LogVarSet& logVarSet (void) const { return constr_->logVarSet(); } const LogVarSet& logVarSet (void) const { return constr_->logVarSet(); }
LogVarSet countedLogVars (void) const; LogVarSet countedLogVars (void) const;
LogVarSet uncountedLogVars (void) const; LogVarSet uncountedLogVars (void) const;
LogVarSet elimLogVars (void) const; LogVarSet elimLogVars (void) const;
LogVarSet exclusiveLogVars (size_t fIdx) const; LogVarSet exclusiveLogVars (size_t fIdx) const;
void sumOutIndex (size_t fIdx); void sumOutIndex (size_t fIdx);
void multiply (Parfactor&); void multiply (Parfactor&);
bool canCountConvert (LogVar X); bool canCountConvert (LogVar X);
void countConvert (LogVar); void countConvert (LogVar);
@ -75,7 +72,7 @@ class Parfactor : public TFactor<ProbFormula>
bool containsGroup (PrvGroup) const; bool containsGroup (PrvGroup) const;
bool containsGroups (vector<PrvGroup>) const; bool containsGroups (vector<PrvGroup>) const;
unsigned nrFormulas (LogVar) const; unsigned nrFormulas (LogVar) const;
int indexOfLogVar (LogVar) const; int indexOfLogVar (LogVar) const;
@ -99,7 +96,6 @@ class Parfactor : public TFactor<ProbFormula>
static bool canMultiply (Parfactor*, Parfactor*); static bool canMultiply (Parfactor*, Parfactor*);
private: private:
void simplifyCountingFormulas (size_t fIdx); void simplifyCountingFormulas (size_t fIdx);
void simplifyParfactor (size_t fIdx1, size_t fIdx2); void simplifyParfactor (size_t fIdx1, size_t fIdx2);
@ -113,11 +109,11 @@ class Parfactor : public TFactor<ProbFormula>
static void alignAndExponentiate (Parfactor*, Parfactor*); static void alignAndExponentiate (Parfactor*, Parfactor*);
static void alignLogicalVars (Parfactor*, Parfactor*); static void alignLogicalVars (Parfactor*, Parfactor*);
ConstraintTree* constr_;
};
ConstraintTree* constr_;
DISALLOW_ASSIGN (Parfactor);
};
typedef vector<Parfactor*> Parfactors; typedef vector<Parfactor*> Parfactors;

Some files were not shown because too many files have changed in this diff Show More