wolffd@0: function [marginals, fwd, back, loglik] = smooth_evidence(engine, CPDpot, observed, pot_type) wolffd@0: % [marginals, fwd, back, loglik] = smooth_evidence(engine, CPDpot, observed, pot_type) (ff) wolffd@0: wolffd@0: error('ff smoothing is broken'); 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 0 % 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 0 % 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: wolffd@0: back = cell(ss,T); wolffd@0: t = T; wolffd@0: for i=hnodes wolffd@0: pot = dpot(i, ns(i)); wolffd@0: cs = children(bnet.intra, i); wolffd@0: for c=cs(:)' wolffd@0: pot = multiply_pots(pot, CPDpot{c,t}); wolffd@0: end wolffd@0: back{i,t} = marginalize_pot(pot, i); wolffd@0: back{i,t} = normalize_pot(back{i,t}); wolffd@0: back{i,t} = set_domain_pot(back{i,t}, i+ss); wolffd@0: end wolffd@0: for t=T-1:-1:1 wolffd@0: for i=hnodes wolffd@0: pot = dpot(i, ns(i)); wolffd@0: cs = children(bnet.inter, i); wolffd@0: for c=cs(:)' wolffd@0: pot = multiply_pots(pot, back{c,t+1}); wolffd@0: pot = multiply_pots(pot, CPDpot{c,t+1}); wolffd@0: end wolffd@0: cs = children(bnet.intra, i); wolffd@0: for c=cs(:)' wolffd@0: pot = multiply_pots(pot, CPDpot{c,t}); wolffd@0: end wolffd@0: back{i,t} = marginalize_pot(pot, i); wolffd@0: back{i,t} = normalize_pot(back{i,t}); wolffd@0: back{i,t} = set_domain_pot(back{i,t}, i+ss); wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: wolffd@0: % COMBINE wolffd@0: for t=1:T wolffd@0: for i=hnodes wolffd@0: back{i,t} = set_domain_pot(back{i,t}, i); wolffd@0: fwd{i,t} = multiply_by_pot(fwd{i,t}, back{i,t}); wolffd@0: marginals{i,t} = normalize_pot(fwd{i,t}); wolffd@0: end wolffd@0: end