wolffd@0: function [fwd, loglik] = filter_evidence(engine, CPDpot, observed, pot_type) wolffd@0: % [fwd, loglik] = filter_evidence(engine, CPDpot, observed, pot_type) (ff) wolffd@0: wolffd@0: [ss T] = size(CPDpot); wolffd@0: fwd = cell(ss,T); wolffd@0: hnodes = engine.hnodes(:)'; wolffd@0: onodes = engine.onodes(:)'; wolffd@0: bnet = bnet_from_engine(engine); wolffd@0: ns = bnet.node_sizes; wolffd@0: onodes2 = [onodes onodes+ss]; wolffd@0: ns(onodes2) = 1; wolffd@0: wolffd@0: logscale = zeros(1,T); wolffd@0: H = length(hnodes); wolffd@0: local_logscale = zeros(1,ss); wolffd@0: wolffd@0: t = 1; wolffd@0: for i=hnodes wolffd@0: fwd{i,t} = CPDpot{i,t}; wolffd@0: c = engine.obschild(i); wolffd@0: if c > 0 wolffd@0: fwd{i,t} = multiply_by_pot(fwd{i,t}, CPDpot{c, t}); wolffd@0: end wolffd@0: [fwd{i,t}, local_logscale(i)] = normalize_pot(fwd{i,t}); wolffd@0: end wolffd@0: logscale(t) = sum(local_logscale); wolffd@0: wolffd@0: for t=2:T wolffd@0: for i=hnodes wolffd@0: ps = parents(bnet.dag, i+ss); wolffd@0: assert(all(ps<=ss)); % in previous slice wolffd@0: prior = CPDpot{i,t}; wolffd@0: for p=ps(:)' wolffd@0: prior = multiply_by_pot(prior, fwd{p,t-1}); wolffd@0: end wolffd@0: fwd{i,t} = marginalize_pot(prior, i+ss); wolffd@0: fwd{i,t} = set_domain_pot(fwd{i,t}, i); wolffd@0: c = engine.obschild(i); wolffd@0: if c > 0 wolffd@0: fwd{i,t} = multiply_by_pot(fwd{i,t}, CPDpot{c,t}); wolffd@0: end wolffd@0: [fwd{i,t}, local_logscale(i)] = normalize_pot(fwd{i,t}); wolffd@0: end wolffd@0: logscale(t) = sum(local_logscale); wolffd@0: end wolffd@0: wolffd@0: loglik = sum(logscale); wolffd@0: