more PFL fixes.

This commit is contained in:
Vítor Santos Costa 2012-04-03 17:12:58 +01:00
parent 9ab7ab0a5e
commit 2bdec8f725
4 changed files with 53 additions and 20 deletions

View File

@ -235,12 +235,13 @@ project_attributes(GVars, _AVars0) :-
use_parfactors(on), use_parfactors(on),
clpbn_flag(solver, Solver), Solver \= fove, !, clpbn_flag(solver, Solver), Solver \= fove, !,
generate_network(GVars, GKeys, Keys, Factors, Evidence), generate_network(GVars, GKeys, Keys, Factors, Evidence),
solver(Solver), (ground(GVars) ->
call_ground_solver(Solver, GKeys, Keys, Factors, Evidence, Answ), true
writeln(Answ). ;
project_attributes(GVars, AVars0) :- call_ground_solver(Solver, GKeys, Keys, Factors, Evidence, Answ)
).
project_attributes(GVars, AVars) :-
suppress_attribute_display(false), suppress_attribute_display(false),
generate_vars(GVars, AVars0, AVars),
AVars = [_|_], AVars = [_|_],
solver(Solver), solver(Solver),
( GVars = [_|_] ; Solver = graphs), !, ( GVars = [_|_] ; Solver = graphs), !,

View File

@ -76,9 +76,9 @@ call_bp_ground(QueryKeys, AllKeys, Factors, Evidence, Solutions) :-
list_of_keys_to_ids(QueryKeys, Hash, QueryVarsIds), list_of_keys_to_ids(QueryKeys, Hash, QueryVarsIds),
evidence_to_ids(Evidence, Hash, EvIds, EvIdNames), evidence_to_ids(Evidence, Hash, EvIds, EvIdNames),
factors_to_ids(Factors, Hash, FactorIds), factors_to_ids(Factors, Hash, FactorIds),
set_graphical_model(FactorIds, Network, InvMap, EvIdNames), init_graphical_model(FactorIds, Network, InvMap, EvIdNames),
run_ground_solver(Network, QueryVarsIds, EvIds, Solutions), run_ground_solver(Network, QueryVarsIds, EvIds, Solutions),
free_bayesian_network(Network). free_graphical_model(Network).
keys_to_ids([], _, Hash, Hash). keys_to_ids([], _, Hash, Hash).
keys_to_ids([Key|AllKeys], I0, Hash0, Hash) :- keys_to_ids([Key|AllKeys], I0, Hash0, Hash) :-

View File

@ -1,8 +1,8 @@
:- use_module(library(pfl)). :- use_module(library(pfl)).
:- set_clpbn_flag(solver,ve). :- set_pfl_flag(solver,fove).
%:- set_clpbn_flag(solver,fove). %:- set_pfl_flag(solver,fove).
t(ann). t(ann).
@ -14,7 +14,6 @@ bayes p(X)::[t,f] ; [0.1, 0.3] ; [t(X)].
% use standard Prolog queries: provide evidence first. % use standard Prolog queries: provide evidence first.
?- p(ann,t), p(ann,X). ?- p(dave,t), p(ann,X).
% ?- p(ann,X). % ?- p(ann,X).

View File

@ -17,6 +17,7 @@
:- use_module(library(lists), [ :- use_module(library(lists), [
delete/3, delete/3,
nth0/3,
member/2]). member/2]).
:- use_module(library(pfl), [ :- use_module(library(pfl), [
@ -29,24 +30,55 @@
:- dynamic currently_defined/1, f/3. :- dynamic currently_defined/1, f/3.
generate_network(QueryVars, QueryKeys, Keys, Factors, Evidence) :- generate_network(QueryVars0, QueryKeys0, Keys, Factors, Evidence) :-
attributes:all_attvars(AVars), attributes:all_attvars(AVars),
check_for_evidence(AVars, EVars, Evidence), keys(QueryVars0, QueryKeys0),
check_for_evidence(AVars, EVars, QueryKeys0, QueryVars0, Evidence),
check_for_extra_bindings(QueryVars0, QueryVars, QueryKeys0, QueryKeys),
do_network(QueryVars, EVars, Keys, Factors).
do_network([], _, _, _) :- !.
do_network(QueryVars, EVars, Keys, Factors) :-
retractall(currently_defined(_)), retractall(currently_defined(_)),
retractall(f(_,_,_)), retractall(f(_,_,_)),
initialize_evidence(EVars),
keys(QueryVars, QueryKeys),
run_through_factors(QueryVars), run_through_factors(QueryVars),
run_through_factors(EVars), run_through_factors(EVars),
findall(K, currently_defined(K), Keys), findall(K, currently_defined(K), Keys),
findall(f(FType,FKeys,FCPT), f(FType,FKeys,FCPT), Factors). findall(f(FType,FKeys,FCPT), f(FType,FKeys,FCPT), Factors).
check_for_evidence(V.AVars, V.EVars, (K=E).Evidence) :- %
% look for attributed vars with evidence (should also search the DB)
% verifiy if the evidence overlaps with query
% bind query if so.
%
check_for_evidence(V.AVars, V.EVars, QueryKeys, QueryVars, (K=E).Evidence) :-
clpbn:get_atts(V,[key(K),evidence(E)]), !, clpbn:get_atts(V,[key(K),evidence(E)]), !,
check_for_evidence(AVars, EVars, Evidence). check_for_evidence_in_query(K, QueryKeys, QueryVars, E),
check_for_evidence(_V.AVars, EVars, Evidence) :- check_for_evidence(AVars, EVars, QueryKeys, QueryVars, Evidence).
check_for_evidence(AVars, EVars, Evidence). % ignore no evidence vars
check_for_evidence([], [], []). check_for_evidence(_V.AVars, EVars, QueryKeys, QueryVars, Evidence) :-
check_for_evidence(AVars, EVars, QueryKeys, QueryVars, Evidence).
check_for_evidence([], [], _, _, []).
%
% do we still have free query variables?
%
check_for_extra_bindings([], [], [], []).
check_for_extra_bindings([V|QueryVars0], QueryVars, [_|QueryKeys0], QueryKeys) :-
nonvar(V),!,
check_for_extra_bindings(QueryVars0, QueryVars, QueryKeys0, QueryKeys).
check_for_extra_bindings([V|QueryVars0], [V|QueryVars], [K|QueryKeys0], [K|QueryKeys]) :-
check_for_extra_bindings(QueryVars0, QueryVars, QueryKeys0, QueryKeys).
check_for_evidence_in_query(Key, [Key|QueryKeys], [V|QueryVars], E) :- !,
skolem(Key, Dom),
nth0(E, Dom, Val),
V = Val,
check_for_evidence_in_query(Key, QueryKeys, QueryVars, E).
check_for_evidence_in_query(Key, [_|QueryKeys], [_|QueryVars], E) :-
check_for_evidence_in_query(Key, QueryKeys, QueryVars, E).
check_for_evidence_in_query(_Key, [], [], _E).
keys([], []). keys([], []).
keys([Var|QueryVars], [Key|QueryKeys]) :- keys([Var|QueryVars], [Key|QueryKeys]) :-
@ -70,6 +102,7 @@ initialize_evidence([V|EVars]) :-
% %
% gets key K, and collects factors that define it % gets key K, and collects factors that define it
find_factors(K) :- find_factors(K) :-
\+ currently_defined(K),
assert(currently_defined(K)), assert(currently_defined(K)),
defined_in_factor(K, ParFactor), defined_in_factor(K, ParFactor),
add_factor(ParFactor, Ks), add_factor(ParFactor, Ks),