wolffd@0: function [marginals, loglik] = enter_soft_evidence(engine, CPDpot, observed, pot_type, filter) wolffd@0: % ENTER_SOFT_EVIDENCE Add the specified soft evidence to the network (bk_ff) wolffd@0: % [marginals, loglik] = enter_soft_evidence(engine, CPDpot, observed, pot_type, filter) wolffd@0: wolffd@0: assert(pot_type == 'd'); 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: local_logscale = zeros(1,length(hnodes)); wolffd@0: wolffd@0: t = 1; wolffd@0: for i=hnodes wolffd@0: fwd{i,t} = CPDpot{i,t}; wolffd@0: end wolffd@0: for i=onodes wolffd@0: p = parents(bnet.dag, i); wolffd@0: assert(length(p)==1); wolffd@0: ev = marginalize_pot(CPDpot{i,t}, p); wolffd@0: fwd{p,t} = multiply_by_pot(fwd{p,t}, ev); wolffd@0: end wolffd@0: for i=hnodes 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: end wolffd@0: for i=onodes wolffd@0: p = parents(bnet.dag, i); wolffd@0: assert(length(p)==1); wolffd@0: temp = pot_to_marginal(CPDpot{i,t}); wolffd@0: ev = dpot(p, ns(p), temp.T); wolffd@0: fwd{p,t} = multiply_by_pot(fwd{p,t}, ev); wolffd@0: end wolffd@0: wolffd@0: for i=hnodes 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: marginals = fwd; wolffd@0: loglik = sum(logscale);