annotate toolboxes/FullBNT-1.0.7/bnt/inference/dynamic/@ff_inf_engine/Old/enter_soft_evidence.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
rev   line source
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);