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/horus_lifted.yap

150 lines
3.7 KiB
Plaintext
Raw Normal View History

2012-03-31 23:27:37 +01:00
/*******************************************************
2012-03-22 11:29:46 +00:00
2012-05-23 19:15:23 +01:00
Interface to Horus Lifted Solvers. Used by:
- Generalized Counting First-Order Variable Elimination (GC-FOVE)
- Lifted First-Order Belief Propagation
- Lifted First-Order Knowledge Compilation
2012-11-22 16:33:22 +00:00
2012-03-31 23:27:37 +01:00
********************************************************/
2012-03-22 11:29:46 +00:00
2012-05-23 19:15:23 +01:00
:- 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
]).
2012-01-10 17:01:06 +00:00
2012-05-23 19:15:23 +01:00
:- use_module(horus,
[cpp_create_lifted_network/3,
cpp_set_parfactors_params/2,
cpp_run_lifted_solver/3,
cpp_free_lifted_network/1
]).
2012-01-10 17:01:06 +00:00
2012-03-22 11:29:46 +00:00
:- use_module(library('clpbn/display'),
[clpbn_bind_vals/3]).
2012-01-10 17:01:06 +00:00
2012-03-22 11:29:46 +00:00
:- use_module(library('clpbn/dists'),
[get_dist_params/2]).
2012-01-10 17:01:06 +00:00
2012-03-22 11:29:46 +00:00
:- use_module(library(pfl),
[factor/6,
skolem/2,
get_pfl_parameters/2
]).
2012-03-22 11:29:46 +00:00
2012-11-22 16:33:22 +00:00
call_horus_lifted_solver(QueryVars, AllVars, Output) :-
init_horus_lifted_solver(_, AllVars, _, State),
run_horus_lifted_solver(QueryVars, Solutions, State),
clpbn_bind_vals(QueryVars, Solutions, Output),
finalize_horus_lifted_solver(State).
2012-03-31 23:27:37 +01:00
2012-11-22 16:33:22 +00:00
init_horus_lifted_solver(_, AllVars, _, state(ParfactorList, DistIds)) :-
get_parfactors(Parfactors),
get_dist_ids(Parfactors, DistIds0),
sort(DistIds0, DistIds),
get_observed_vars(AllVars, ObservedVars),
%writeln(parfactors:Parfactors:'\n'),
%writeln(evidence:ObservedVars:'\n'),
cpp_create_lifted_network(Parfactors, ObservedVars, ParfactorList).
2012-11-22 16:33:22 +00:00
run_horus_lifted_solver(QueryVars, Solutions, state(ParfactorList, DistIds)) :-
get_query_keys(QueryVars, QueryKeys),
get_dists_parameters(DistIds, DistsParams),
%writeln(dists:DistsParams), writeln(''),
cpp_set_parfactors_params(ParfactorList, DistsParams),
cpp_run_lifted_solver(ParfactorList, QueryKeys, Solutions).
2012-11-22 16:33:22 +00:00
finalize_horus_lifted_solver(state(ParfactorList, _)) :-
cpp_free_lifted_network(ParfactorList).
2012-01-10 17:01:06 +00:00
2012-03-22 11:29:46 +00:00
:- table get_parfactors/1.
2012-03-31 23:27:37 +01:00
2012-01-10 17:01:06 +00:00
%
2012-03-22 11:29:46 +00:00
% enumerate all parfactors and enumerate their domain as tuples.
2012-01-10 17:01:06 +00:00
%
% output is list of pf(
2012-03-31 23:27:37 +01:00
% 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)]
2012-01-10 17:01:06 +00:00
%
2012-03-22 11:29:46 +00:00
get_parfactors(Factors) :-
findall(F, is_factor(F), Factors).
2012-03-31 23:27:37 +01:00
2012-01-10 17:01:06 +00:00
2012-03-22 11:29:46 +00:00
is_factor(pf(Id, Ks, Rs, Phi, Tuples)) :-
factor(_Type, Id, Ks, Vs, Table, Constraints),
get_ranges(Ks,Rs),
Table \= avg,
gen_table(Table, Phi),
all_tuples(Constraints, Vs, Tuples).
2012-01-10 17:01:06 +00:00
2012-03-22 11:29:46 +00:00
get_ranges([],[]).
2012-11-22 16:33:22 +00:00
get_ranges(K.Ks, Range.Rs) :- !,
skolem(K,Domain),
length(Domain,Range),
get_ranges(Ks, Rs).
2012-03-22 11:29:46 +00:00
2012-01-10 17:01:06 +00:00
gen_table(Table, Phi) :-
(
is_list(Table)
->
Phi = Table
;
call(user:Table, Phi)
).
2012-03-31 23:27:37 +01:00
2012-03-22 11:29:46 +00:00
2012-01-10 17:01:06 +00:00
all_tuples(Constraints, Tuple, Tuples) :-
setof(Tuple, Constraints^run(Constraints), Tuples).
2012-01-10 17:01:06 +00:00
2012-03-22 11:29:46 +00:00
2012-01-10 17:01:06 +00:00
run([]).
run(Goal.Constraints) :-
user:Goal,
run(Constraints).
2012-01-10 17:01:06 +00:00
2012-03-22 11:29:46 +00:00
get_dist_ids([], []).
get_dist_ids(pf(Id, _, _, _, _).Parfactors, Id.DistIds) :-
get_dist_ids(Parfactors, DistIds).
2012-03-22 11:29:46 +00:00
get_observed_vars([], []).
get_observed_vars(V.AllAttVars, [K:E|ObservedVars]) :-
clpbn:get_atts(V,[key(K)]),
( clpbn:get_atts(V,[evidence(E)]) ; pfl:evidence(K,E) ), !,
get_observed_vars(AllAttVars, ObservedVars).
2012-03-22 11:29:46 +00:00
get_observed_vars(V.AllAttVars, ObservedVars) :-
clpbn:get_atts(V,[key(_K)]), !,
get_observed_vars(AllAttVars, ObservedVars).
2012-03-22 11:29:46 +00:00
2012-11-22 16:33:22 +00:00
get_query_keys([], []).
get_query_keys(E1.L1, E2.L2) :-
get_query_keys_2(E1,E2),
get_query_keys(L1, L2).
2012-03-22 11:29:46 +00:00
2012-11-22 16:33:22 +00:00
get_query_keys_2([], []).
get_query_keys_2(V.AttVars, [RV|RVs]) :-
clpbn:get_atts(V,[key(RV)]), !,
get_query_keys_2(AttVars, RVs).
2012-03-22 11:29:46 +00:00
get_dists_parameters([], []).
2012-03-22 19:08:36 +00:00
get_dists_parameters([Id|Ids], [dist(Id, Params)|DistsInfo]) :-
get_pfl_parameters(Id, Params),
get_dists_parameters(Ids, DistsInfo).
2012-01-10 17:01:06 +00:00