wolffd@0
|
1 function [marginals, loglik] = enter_soft_evidence(engine, CPDpot, observed, pot_type, filter)
|
wolffd@0
|
2 % ENTER_SOFT_EVIDENCE Add the specified soft evidence to the network (bk_ff)
|
wolffd@0
|
3 % [marginals, loglik] = enter_soft_evidence(engine, CPDpot, observed, pot_type, filter)
|
wolffd@0
|
4
|
wolffd@0
|
5 assert(pot_type == 'd');
|
wolffd@0
|
6 [ss T] = size(CPDpot);
|
wolffd@0
|
7 fwd = cell(ss,T);
|
wolffd@0
|
8 hnodes = engine.hnodes(:)';
|
wolffd@0
|
9 onodes = engine.onodes(:)';
|
wolffd@0
|
10 bnet = bnet_from_engine(engine);
|
wolffd@0
|
11 ns = bnet.node_sizes;
|
wolffd@0
|
12 onodes2 = [onodes onodes+ss];
|
wolffd@0
|
13 ns(onodes2) = 1;
|
wolffd@0
|
14
|
wolffd@0
|
15 logscale = zeros(1,T);
|
wolffd@0
|
16 local_logscale = zeros(1,length(hnodes));
|
wolffd@0
|
17
|
wolffd@0
|
18 t = 1;
|
wolffd@0
|
19 for i=hnodes
|
wolffd@0
|
20 fwd{i,t} = CPDpot{i,t};
|
wolffd@0
|
21 end
|
wolffd@0
|
22 for i=onodes
|
wolffd@0
|
23 p = parents(bnet.dag, i);
|
wolffd@0
|
24 assert(length(p)==1);
|
wolffd@0
|
25 ev = marginalize_pot(CPDpot{i,t}, p);
|
wolffd@0
|
26 fwd{p,t} = multiply_by_pot(fwd{p,t}, ev);
|
wolffd@0
|
27 end
|
wolffd@0
|
28 for i=hnodes
|
wolffd@0
|
29 [fwd{i,t}, local_logscale(i)] = normalize_pot(fwd{i,t});
|
wolffd@0
|
30 end
|
wolffd@0
|
31 logscale(t) = sum(local_logscale);
|
wolffd@0
|
32
|
wolffd@0
|
33 for t=2:T
|
wolffd@0
|
34 for i=hnodes
|
wolffd@0
|
35 ps = parents(bnet.dag, i+ss);
|
wolffd@0
|
36 assert(all(ps<=ss)); % in previous slice
|
wolffd@0
|
37 prior = CPDpot{i,t};
|
wolffd@0
|
38 for p=ps(:)'
|
wolffd@0
|
39 prior = multiply_by_pot(prior, fwd{p,t-1});
|
wolffd@0
|
40 end
|
wolffd@0
|
41 fwd{i,t} = marginalize_pot(prior, i+ss);
|
wolffd@0
|
42 fwd{i,t} = set_domain_pot(fwd{i,t}, i);
|
wolffd@0
|
43 end
|
wolffd@0
|
44 for i=onodes
|
wolffd@0
|
45 p = parents(bnet.dag, i);
|
wolffd@0
|
46 assert(length(p)==1);
|
wolffd@0
|
47 temp = pot_to_marginal(CPDpot{i,t});
|
wolffd@0
|
48 ev = dpot(p, ns(p), temp.T);
|
wolffd@0
|
49 fwd{p,t} = multiply_by_pot(fwd{p,t}, ev);
|
wolffd@0
|
50 end
|
wolffd@0
|
51
|
wolffd@0
|
52 for i=hnodes
|
wolffd@0
|
53 [fwd{i,t}, local_logscale(i)] = normalize_pot(fwd{i,t});
|
wolffd@0
|
54 end
|
wolffd@0
|
55 logscale(t) = sum(local_logscale);
|
wolffd@0
|
56 end
|
wolffd@0
|
57
|
wolffd@0
|
58 marginals = fwd;
|
wolffd@0
|
59 loglik = sum(logscale);
|