This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/packages/CLPBN/clpbn/ground_factors.yap

170 lines
4.5 KiB
Plaintext
Raw Normal View History

2012-01-10 17:01:06 +00:00
%parfactor(
% [ability(P),grade(C,S), satisfaction(C,S,P)],
% \phi = [....],
% [P,C,S],
% [P \in [p1,p2,p4], C \in [c1,c3], S \in [s2,s3]]).
% [S \= s2])
:- module(clpbn_ground_factors, [
2012-08-09 04:16:37 +01:00
generate_networks/5,
generate_network/5]).
2012-01-10 17:01:06 +00:00
:- use_module(library(bhash), [
b_hash_new/1,
b_hash_lookup/3,
2012-08-09 04:16:37 +01:00
b_hash_insert/4,
b_hash_to_list/2]).
2012-01-10 17:01:06 +00:00
2012-04-03 15:01:35 +01:00
:- use_module(library(lists), [
delete/3,
2012-04-03 17:12:58 +01:00
nth0/3,
2012-04-03 15:01:35 +01:00
member/2]).
2012-01-10 17:01:06 +00:00
:- use_module(library(pfl), [
2012-04-03 15:01:35 +01:00
factor/6,
defined_in_factor/2,
2012-01-10 17:01:06 +00:00
skolem/2]).
:- use_module(library(clpbn/dists), [
dist/4]).
2012-04-12 18:11:29 +01:00
:- dynamic currently_defined/1, f/4.
2012-01-10 17:01:06 +00:00
2012-08-09 04:16:37 +01:00
%
% as you add query vars the network grows
% until you reach the last variable.
%
generate_networks(QueryVars, QueryKeys, Keys, Factors, EList) :-
init_global_search,
attributes:all_attvars(AVars),
b_hash_new(Evidence0),
include_evidence(AVars, Evidence0, Evidence),
b_hash_to_list(Evidence, EList0), list_to_evlist(EList0, EList),
run_through_evidence(EList),
run_through_queries(QueryVars, QueryKeys, Evidence),
collect(Keys, Factors).
%
% clean global stateq
%
init_global_search :-
retractall(currently_defined(_)),
retractall(f(_,_,_,_)).
list_to_evlist([], []).
list_to_evlist([K-E|EList0], [K=E|EList]) :-
list_to_evlist(EList0, EList).
include_evidence([], Evidence0, Evidence) :-
findall(Sk=Var, pfl:evidence(Sk,Var), Evs),
include_static_evidence(Evs, Evidence0, Evidence).
include_evidence([V|AVars], Evidence0, Evidence) :-
clpbn:get_atts(V,[key(K),evidence(E)]), !,
(
b_hash_lookup(K, E1, Evidence0)
->
(E \= E1 -> throw(clpbn:incompatible_evidence(K,E,E1)) ; EvidenceI = Evidence0)
;
b_hash_insert(Evidence0, K, E, EvidenceI)
),
include_evidence(AVars, EvidenceI, Evidence).
include_evidence([_|AVars], Evidence0, Evidence) :-
include_evidence(AVars, Evidence0, Evidence).
include_static_evidence([], Evidence, Evidence).
include_static_evidence([K=E|AVars], Evidence0, Evidence) :-
(
b_hash_lookup(K, E1, Evidence0)
->
(E \= E1 -> throw(incompatible_evidence(K,E,E1)) ; EvidenceI = Evidence0)
;
b_hash_insert(Evidence0, K, E, EvidenceI)
),
include_evidence(AVars, EvidenceI, Evidence).
run_through_queries([QVars|QueryVars], [GKs|GKeys], E) :-
run_through_query(QVars, GKs, E),
run_through_queries(QueryVars, GKeys, E).
run_through_queries([], [], _).
generate_network(QueryVars0, QueryKeys, Keys, Factors, EList) :-
init_global_search,
2012-01-10 17:01:06 +00:00
attributes:all_attvars(AVars),
2012-08-09 04:16:37 +01:00
b_hash_new(Evidence0),
include_evidence(AVars, Evidence0, Evidence),
b_hash_to_list(Evidence, EList0), list_to_evlist(EList0, EList),
run_through_evidence(EList),
run_through_query(QueryVars0, QueryKeys, Evidence),
collect(Keys,Factors),
writeln(gn:Keys:QueryKeys:Factors:EList).
run_through_query([], [], _).
run_through_query([V|QueryVars], QueryKeys, Evidence) :-
clpbn:get_atts(V,[key(K)]),
b_hash_lookup(K, _, Evidence), !,
run_through_query(QueryVars, QueryKeys, Evidence).
run_through_query([V|QueryVars], [K|QueryKeys], Evidence) :-
clpbn:get_atts(V,[key(K)]),
( find_factors(K), fail ; true ),
run_through_query(QueryVars, QueryKeys, Evidence).
collect(Keys, Factors) :-
2012-04-03 15:01:35 +01:00
findall(K, currently_defined(K), Keys),
2012-04-12 18:11:29 +01:00
findall(f(FType,FId,FKeys,FCPT), f(FType,FId,FKeys,FCPT), Factors).
2012-04-03 16:22:40 +01:00
2012-08-09 04:16:37 +01:00
run_through_evidence([]).
run_through_evidence([K=_|_]) :-
find_factors(K),
fail.
2012-08-09 04:16:37 +01:00
run_through_evidence([_|Ev]) :-
run_through_evidence(Ev).
ground_all_keys([], _).
ground_all_keys([V|GVars], AllKeys) :-
clpbn:get_atts(V,[key(Key)]),
\+ ground(Key), !,
member(Key, AllKeys),
ground_all_keys(GVars, AllKeys).
ground_all_keys([_V|GVars], AllKeys) :-
ground_all_keys(GVars, AllKeys).
2012-06-01 13:17:39 +01:00
2012-04-03 16:22:40 +01:00
keys([], []).
keys([Var|QueryVars], [Key|QueryKeys]) :-
clpbn:get_atts(Var,[key(Key)]),
keys(QueryVars, QueryKeys).
2012-01-10 17:01:06 +00:00
2012-04-03 15:01:35 +01:00
initialize_evidence([]).
initialize_evidence([V|EVars]) :-
clpbn:get_atts(V, [key(K)]),
ground(K),
2012-04-03 15:01:35 +01:00
assert(currently_defined(K)),
initialize_evidence(EVars).
2012-01-10 17:01:06 +00:00
%
2012-04-03 15:01:35 +01:00
% gets key K, and collects factors that define it
find_factors(K) :-
2012-04-03 17:12:58 +01:00
\+ currently_defined(K),
( ground(K) -> assert(currently_defined(K)) ; true),
2012-04-03 15:01:35 +01:00
defined_in_factor(K, ParFactor),
add_factor(ParFactor, Ks),
member(K1, Ks),
\+ currently_defined(K1),
find_factors(K1).
2012-04-12 18:11:29 +01:00
add_factor(factor(Type, Id, Ks, _, Phi, Constraints), Ks) :-
F = f(Type, Id, Ks, CPT),
2012-04-12 17:17:21 +01:00
( is_list(Phi) -> CPT = Phi ; call(user:Phi, CPT) ),
2012-04-03 15:01:35 +01:00
run(Constraints),
2012-04-12 18:11:29 +01:00
\+ f(Type, Id, Ks, CPT),
2012-04-03 15:01:35 +01:00
assert(F).
run([Goal|Goals]) :-
call(user:Goal),
run(Goals).
run([]).