fix the case when you refer a variable that does not affect the marginals.

This commit is contained in:
Vitor Santos Costa 2008-11-02 16:00:46 +00:00
parent 4490aa4bb6
commit 259313b603

View File

@ -21,7 +21,9 @@
:- attribute size/1, all_diffs/1. :- attribute size/1, all_diffs/1.
:- use_module(library(ordsets), [ord_union/3]). :- use_module(library(ordsets),
[ord_union/3,
ord_member/2]).
:- use_module(library('clpbn/xbif'), [clpbn2xbif/3]). :- use_module(library('clpbn/xbif'), [clpbn2xbif/3]).
@ -50,6 +52,7 @@
reorder_CPT/5, reorder_CPT/5,
multiply_CPTs/4, multiply_CPTs/4,
normalise_CPT/2, normalise_CPT/2,
sum_out_from_CPT/4,
list_from_CPT/2]). list_from_CPT/2]).
:- use_module(library(lists), :- use_module(library(lists),
@ -84,13 +87,14 @@ init_vel_solver(Qs, Vs0, _, LVis) :-
(clpbn:output(gviz(XBifStream)) -> clpbn2gviz(XBifStream,vel,Vs,_) ; true). (clpbn:output(gviz(XBifStream)) -> clpbn2gviz(XBifStream,vel,Vs,_) ; true).
init_vel_solver_for_questions([], _, _, [], []). init_vel_solver_for_questions([], _, _, [], []).
init_vel_solver_for_questions([Vs|MVs], G, RG, [NVs0|MNVs0], [NVs0|LVis]) :- init_vel_solver_for_questions([Vs|MVs], G, RG, [NVs|MNVs0], [NVs|LVis]) :-
influences(Vs, _, NVs0, G, RG), influences(Vs, _, NVs0, G, RG),
sort(NVs0, NVs),
init_vel_solver_for_questions(MVs, G, RG, MNVs0, LVis). init_vel_solver_for_questions(MVs, G, RG, MNVs0, LVis).
run_vel_solver([], [], []). run_vel_solver([], [], []).
run_vel_solver([LVs|MoreLVs], [Ps|MorePs], [NVs0|MoreLVis]) :- run_vel_solver([LVs|MoreLVs], [Ps|MorePs], [NVs0|MoreLVis]) :-
find_all_clpbn_vars(NVs0, LV0, LVi, Tables0), find_all_clpbn_vars(NVs0, NVs0, LV0, LVi, Tables0),
sort(LV0, LV), sort(LV0, LV),
% construct the graph % construct the graph
find_all_table_deps(Tables0, LV), find_all_table_deps(Tables0, LV),
@ -103,9 +107,9 @@ run_vel_solver([LVs|MoreLVs], [Ps|MorePs], [NVs0|MoreLVis]) :-
% %
% just get a list of variables plus associated tables % just get a list of variables plus associated tables
% %
find_all_clpbn_vars([], [], [], []) :- !. find_all_clpbn_vars([], _, [], [], []) :- !.
find_all_clpbn_vars([V|Vs], [Var|LV], ProcessedVars, [table(I,Table,Parents,Sizes)|Tables]) :- find_all_clpbn_vars([V|Vs], NVs0, [Var|LV], ProcessedVars, [table(I,Table,Parents,Sizes)|Tables]) :-
var_with_deps(V, Table, Parents, Sizes, Ev, Vals), !, var_with_deps(V, NVs0, Table, Parents, Sizes, Ev, Vals), !,
% variables with evidence should not be processed. % variables with evidence should not be processed.
(var(Ev) -> (var(Ev) ->
Var = var(V,I,Sz,Vals,Parents,Ev,_,_), Var = var(V,I,Sz,Vals,Parents,Ev,_,_),
@ -114,16 +118,22 @@ find_all_clpbn_vars([V|Vs], [Var|LV], ProcessedVars, [table(I,Table,Parents,Size
; ;
ProcessedVars = ProcessedVars0 ProcessedVars = ProcessedVars0
), ),
find_all_clpbn_vars(Vs, LV, ProcessedVars0, Tables). find_all_clpbn_vars(Vs, NVs0, LV, ProcessedVars0, Tables).
var_with_deps(V, Table, Deps, Sizes, Ev, Vals) :- var_with_deps(V, NVs0, Table, Deps, Sizes, Ev, Vals) :-
clpbn:get_atts(V, [dist(Id,Parents)]), clpbn:get_atts(V, [dist(Id,Parents)]),
get_dist_matrix(Id,Parents,_,Vals,TAB0), get_dist_matrix(Id,Parents,_,Vals,TAB0),
( clpbn:get_atts(V, [evidence(Ev)]) -> true ; true), (
clpbn:get_atts(V, [evidence(Ev)])
->
true
;
true
), !,
% set CPT in canonical form % set CPT in canonical form
reorder_CPT([V|Parents],TAB0,Deps0,TAB1,Sizes1), reorder_CPT([V|Parents],TAB0,Deps0,TAB1,Sizes1),
% remove evidence. % remove evidence.
simplify_evidence(Deps0, TAB1, Deps0, Sizes1, Table, Deps, Sizes). simplify_evidence(Deps0, NVs0, TAB1, Deps0, Sizes1, Table, Deps, Sizes).
find_all_table_deps(Tables0, LV) :- find_all_table_deps(Tables0, LV) :-
find_dep_graph(Tables0, DepGraph0), find_dep_graph(Tables0, DepGraph0),
@ -205,13 +215,17 @@ multiply_tables([TAB1, TAB2| Tables], Out) :-
multiply_tables([TAB| Tables], Out). multiply_tables([TAB| Tables], Out).
simplify_evidence([], Table, Deps, Sizes, Table, Deps, Sizes). simplify_evidence([], _, Table, Deps, Sizes, Table, Deps, Sizes).
simplify_evidence([V|VDeps], Table0, Deps0, Sizes0, Table, Deps, Sizes) :- simplify_evidence([V|VDeps], NVs0, Table0, Deps0, Sizes0, Table, Deps, Sizes) :-
clpbn:get_atts(V, [evidence(_)]), !, clpbn:get_atts(V, [evidence(_)]), !,
project_from_CPT(V,tab(Table0,Deps0,Sizes0),tab(NewTable,Deps1,Sizes1)), project_from_CPT(V,tab(Table0,Deps0,Sizes0),tab(NewTable,Deps1,Sizes1)),
simplify_evidence(VDeps, NewTable, Deps1, Sizes1, Table, Deps, Sizes). simplify_evidence(VDeps, NVs0, NewTable, Deps1, Sizes1, Table, Deps, Sizes).
simplify_evidence([_|VDeps], Table0, Deps0, Sizes0, Table, Deps, Sizes) :- simplify_evidence([V|VDeps], NVs0, Table0, Deps0, Sizes0, Table, Deps, Sizes) :-
simplify_evidence(VDeps, Table0, Deps0, Sizes0, Table, Deps, Sizes). ord_member(V, NVs0), !,
simplify_evidence(VDeps, NVs0, Table0, Deps0, Sizes0, Table, Deps, Sizes).
simplify_evidence([V|VDeps], NVs0, Table0, Deps0, Sizes0, Table, Deps, Sizes) :-
project_from_CPT(V,tab(Table0,Deps0,Sizes0),tab(NewTable,Deps1,Sizes1)),
simplify_evidence(VDeps, NVs0, NewTable, Deps1, Sizes1, Table, Deps, Sizes).
fetch_tables([], []). fetch_tables([], []).
fetch_tables([var(_,_,_,_,_,_,Deps,_)|LV0], Tables) :- fetch_tables([var(_,_,_,_,_,_,Deps,_)|LV0], Tables) :-