annotate toolboxes/FullBNT-1.0.7/bnt/inference/dynamic/@ff_inf_engine/smooth_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, fwd, back, loglik] = smooth_evidence(engine, CPDpot, observed, pot_type)
wolffd@0 2 % [marginals, fwd, back, loglik] = smooth_evidence(engine, CPDpot, observed, pot_type) (ff)
wolffd@0 3
wolffd@0 4 error('ff smoothing is broken');
wolffd@0 5
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 H = length(hnodes);
wolffd@0 17 local_logscale = zeros(1,ss);
wolffd@0 18
wolffd@0 19 t = 1;
wolffd@0 20 for i=hnodes
wolffd@0 21 fwd{i,t} = CPDpot{i,t};
wolffd@0 22 c = engine.obschild(i);
wolffd@0 23 if 0 % c > 0
wolffd@0 24 fwd{i,t} = multiply_by_pot(fwd{i,t}, CPDpot{c, t});
wolffd@0 25 end
wolffd@0 26 [fwd{i,t}, local_logscale(i)] = normalize_pot(fwd{i,t});
wolffd@0 27 end
wolffd@0 28 logscale(t) = sum(local_logscale);
wolffd@0 29
wolffd@0 30 for t=2:T
wolffd@0 31 for i=hnodes
wolffd@0 32 ps = parents(bnet.dag, i+ss);
wolffd@0 33 assert(all(ps<=ss)); % in previous slice
wolffd@0 34 prior = CPDpot{i,t};
wolffd@0 35 for p=ps(:)'
wolffd@0 36 prior = multiply_by_pot(prior, fwd{p,t-1});
wolffd@0 37 end
wolffd@0 38 fwd{i,t} = marginalize_pot(prior, i+ss);
wolffd@0 39 fwd{i,t} = set_domain_pot(fwd{i,t}, i);
wolffd@0 40 c = engine.obschild(i);
wolffd@0 41 if 0 % c > 0
wolffd@0 42 fwd{i,t} = multiply_by_pot(fwd{i,t}, CPDpot{c,t});
wolffd@0 43 end
wolffd@0 44 [fwd{i,t}, local_logscale(i)] = normalize_pot(fwd{i,t});
wolffd@0 45 end
wolffd@0 46 logscale(t) = sum(local_logscale);
wolffd@0 47 end
wolffd@0 48
wolffd@0 49 loglik = sum(logscale);
wolffd@0 50
wolffd@0 51 back = cell(ss,T);
wolffd@0 52 t = T;
wolffd@0 53 for i=hnodes
wolffd@0 54 pot = dpot(i, ns(i));
wolffd@0 55 cs = children(bnet.intra, i);
wolffd@0 56 for c=cs(:)'
wolffd@0 57 pot = multiply_pots(pot, CPDpot{c,t});
wolffd@0 58 end
wolffd@0 59 back{i,t} = marginalize_pot(pot, i);
wolffd@0 60 back{i,t} = normalize_pot(back{i,t});
wolffd@0 61 back{i,t} = set_domain_pot(back{i,t}, i+ss);
wolffd@0 62 end
wolffd@0 63 for t=T-1:-1:1
wolffd@0 64 for i=hnodes
wolffd@0 65 pot = dpot(i, ns(i));
wolffd@0 66 cs = children(bnet.inter, i);
wolffd@0 67 for c=cs(:)'
wolffd@0 68 pot = multiply_pots(pot, back{c,t+1});
wolffd@0 69 pot = multiply_pots(pot, CPDpot{c,t+1});
wolffd@0 70 end
wolffd@0 71 cs = children(bnet.intra, i);
wolffd@0 72 for c=cs(:)'
wolffd@0 73 pot = multiply_pots(pot, CPDpot{c,t});
wolffd@0 74 end
wolffd@0 75 back{i,t} = marginalize_pot(pot, i);
wolffd@0 76 back{i,t} = normalize_pot(back{i,t});
wolffd@0 77 back{i,t} = set_domain_pot(back{i,t}, i+ss);
wolffd@0 78 end
wolffd@0 79 end
wolffd@0 80
wolffd@0 81
wolffd@0 82 % COMBINE
wolffd@0 83 for t=1:T
wolffd@0 84 for i=hnodes
wolffd@0 85 back{i,t} = set_domain_pot(back{i,t}, i);
wolffd@0 86 fwd{i,t} = multiply_by_pot(fwd{i,t}, back{i,t});
wolffd@0 87 marginals{i,t} = normalize_pot(fwd{i,t});
wolffd@0 88 end
wolffd@0 89 end