From baf823eb5c36c10a2e615a83461116dbb7d96652 Mon Sep 17 00:00:00 2001 From: vsc Date: Sat, 15 Jan 2005 05:21:36 +0000 Subject: [PATCH] fix bug in clause emulator git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1234 b08c6af1-5177-4d33-ba66-4b1c6b8b522a --- C/index.c | 12 ++++++++---- CLPBN/clpbn/vel.yap | 22 ++++++++++++++++++++-- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/C/index.c b/C/index.c index c45014ee2..511f09f24 100644 --- a/C/index.c +++ b/C/index.c @@ -11,8 +11,12 @@ * File: index.c * * comments: Indexing a Prolog predicate * * * -* Last rev: $Date: 2004-12-28 22:20:35 $,$Author: vsc $ * +* Last rev: $Date: 2005-01-15 05:21:36 $,$Author: vsc $ * * $Log: not supported by cvs2svn $ +* Revision 1.112 2004/12/28 22:20:35 vsc +* some extra bug fixes for trail overflows: some cannot be recovered that easily, +* some can. +* * Revision 1.111 2004/12/21 17:17:15 vsc * miscounting of variable-only clauses in groups might lead to bug in indexing * code. @@ -7791,11 +7795,11 @@ Yap_FollowIndexingCode(PredEntry *ap, yamop *ipc, Term Terms[3], yamop *ap_pc, y jlbl = &(ipc->u.clll.l3); ipc = ipc->u.clll.l3; } else if (!IsVarTerm(t) && t != ipc->u.clll.c) { - jlbl = &(ipc->u.clll.l2); - ipc = ipc->u.clll.l2; - } else { jlbl = &(ipc->u.clll.l1); ipc = ipc->u.clll.l1; + } else { + jlbl = &(ipc->u.clll.l2); + ipc = ipc->u.clll.l2; } break; /* instructions type ollll */ diff --git a/CLPBN/clpbn/vel.yap b/CLPBN/clpbn/vel.yap index 69f5ac585..dd7accf1b 100644 --- a/CLPBN/clpbn/vel.yap +++ b/CLPBN/clpbn/vel.yap @@ -38,7 +38,12 @@ check_if_vel_done(Var) :- get_atts(Var, [size(_)]), !. -vel(LVs,Vs0,AllDiffs) :- +vel(LVs0,Vs0,AllDiffs) :- + get_rid_of_ev_vars(LVs0,LVs), + do_vel(LVs,Vs0,AllDiffs). + +do_vel([],_,_) :- !. +do_vel(LVs,Vs0,AllDiffs) :- check_for_hidden_vars(Vs0, Vs0, Vs1), sort(Vs1,Vs), find_all_clpbn_vars(Vs, LV0, LVi, Tables0), @@ -50,6 +55,17 @@ vel(LVs,Vs0,AllDiffs) :- normalise(Ps0,Ps), bind_vals(LVs,Ps,AllDiffs). +% +% some variables might already have evidence in the data-base. +% +get_rid_of_ev_vars([],[]). +get_rid_of_ev_vars([V|LVs0],LVs) :- + clpbn:get_atts(V, [evidence(_)]), !, + get_rid_of_ev_vars(LVs0,LVs). +get_rid_of_ev_vars([V|LVs0],[V|LVs]) :- + get_rid_of_ev_vars(LVs0,LVs). + + find_all_clpbn_vars([], [], [], []) :- !. find_all_clpbn_vars([V|Vs], [Var|LV], ProcessedVars, [table(I,Table,Deps,Sizes)|Tables]) :- var_with_deps(V, Table, Deps, Sizes, Ev, Vals), !, @@ -370,8 +386,10 @@ divide_by_sum([P|Ps0],Sum,[PN|Ps]) :- % what is actually output % attribute_goal(V, G) :- - get_atts(V, [posterior(Vs,Vals,Ps,AllDiffs)]), + get_atts(V, [posterior(Vs,Vals,Ps,AllDiffs)]), !, massage_out(Vs, Vals, Ps, G, AllDiffs). +attribute_goal(V, true) :- + get_atts(V, [evidence(Ev)]), Ev = V. massage_out(Vs, [D], [P], p(CEqs)=P, AllDiffs) :- !, gen_eqs(Vs,D,Eqs),