/usr/share/Yap/clpbn/bp.yap is in yap 6.2.2-6+b2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | /***********************************
Belief Propagation in CLP(BN)
This should connect to C-code.
*********************************/
:- module(clpbn_bp, [bp/3,
check_if_bp_done/1,
init_bp_solver/4,
run_bp_solver/3]).
:- attribute all_diffs/1.
:- use_module(library(ordsets),
[ord_union/3,
ord_member/2]).
:- use_module(library('clpbn/matrix_cpt_utils'),
[reorder_CPT/5]).
:- use_module(library('clpbn/dists'),
[
dist/4,
get_dist_domain/2,
get_dist_params/2]).
:- use_module(library('clpbn/utils'), [
clpbn_not_var_member/2]).
:- use_module(library('clpbn/display'), [
clpbn_bind_vals/3]).
:- use_module(library('clpbn/connected'),
[
init_influences/3,
influences/5
]).
:- use_module(library(lists),
[
append/3
]).
:- use_module(library('clpbn/aggregates'),
[check_for_agg_vars/2]).
check_if_bp_done(_Var).
%
% implementation of belief propagation
%
% A1=+QueryVars -> sets of independent marginalization variables
% A2=*AllVars -> list
% A3=-Output -> output probabilities
%
%
% Other important variables:
%
% State0 initialized graph, is used to pass data from initialization
% to query solving (eg, State might be the JT and be used to run
% different queries).
%
% Process
%
bp([[]],_,_) :- !.
bp([QueryVars],AllVars,Output) :-
writeln(QueryVars:AllVars:Output),
init_bp_solver([QueryVars], AllVars, Output, State),
writeln(State),
% variable elimination proper
run_bp_solver([], [LPs], State),
% bind Probs back to variables so that they can be output.
clpbn_bind_vals([QueryVars],[LPs],Output).
% initialise necessary data for query solver
init_bp_solver(Qs, AllVars, _, graph(LVis)) :-
% replace average, max, min and friends
% by binary nodes.
check_for_agg_vars(AllVars, UnFoldedVars),
writeln(AllVars:UnFoldedVars),
% replace the variables reachable from G
% Tables0 will have the full data on each variable
init_influences(UnfoldedVars, G, RG),
writeln(G:RG),
init_bp_solver_for_questions(Qs, G, RG, _, LVis).
init_bp_solver_for_questions([], _, _, [], []).
init_bp_solver_for_questions([Vs|MVs], G, RG, [NVs|MNVs0], [NVs|LVis]) :-
% find variables connectd to Vs
% influences(Vs, _, NVs0, G, RG),
G = RG,
sort(NVs0, NVs),
%clpbn_gviz:clpbn2gviz(user_error, test, NVs, Vs),
init_bp_solver_for_questions(MVs, G, RG, MNVs0, LVis).
% use a findall to recover space without needing for GC
run_bp_solver(LVs, LPs, graph(LNVs)) :-
findall(Ps, solve_bp(LVs, LNVs, Ps), LPs).
solve_bp([LVs|_], [NVs0|_], Ps) :-
% length(NVs0, L), (L > 64 -> clpbn_gviz:clpbn2gviz(user_error,sort,NVs0,LVs) ; true ),
find_all_clpbn_vars(NVs0, LVi),
% construct the graph
process(LVi, LVs, P).
solve_bp([_|MoreLVs], [_|MoreLVis], Ps) :-
solve_bp(MoreLVs, MoreLVis, Ps).
% get a list of variables plus associated tables
%
find_all_clpbn_vars([], []).
find_all_clpbn_vars([V|Vs], [var(V,Id,Parents,Domain,Matrix,Ev)|LV]) :-
clpbn:get_atts(V, [dist(Id,Parents)]), !,
get_dist_domain(Id, Domain),
get_dist_params(Id, Matrix),
get_evidence(V, Ev),
find_all_clpbn_vars(Vs, LV).
find_all_clpbn_vars([_|Vs], LV) :-
find_all_clpbn_vars(Vs, LV).
get_evidence(V, Ev) :-
clpbn:get_atts(V, [evidence(Ev)]), !.
get_evidence(V, -1). % no evidence!!!
% to be defined in C
% +LVO is the list of all variables
% +InputVs are the variables to be marginalised
% -Out is some output term stating the probabilities
%
process(LV0, InputVs, Out) :-
length(LV0, N),
length(InputVs, NI),
writeln(process(LV0, InputVs, Out)),
bp_process(N, LV0, NI, InputVs, Out),
fail.
|