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 (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: H = length(hnodes); wolffd@0: local_logscale = zeros(1,ss); wolffd@0: wolffd@0: obschild = zeros(1,ss); wolffd@0: for i=hnodes wolffd@0: ocs = myintersect(children(bnet.dag, i), onodes); wolffd@0: assert(length(ocs)==1); wolffd@0: obschild(i) = ocs(1); wolffd@0: end wolffd@0: wolffd@0: t = 1; wolffd@0: for i=hnodes wolffd@0: fwd{i,t} = CPDpot{i,t}; wolffd@0: c = obschild(i); wolffd@0: temp = pot_to_marginal(CPDpot{c,t}); wolffd@0: ev = dpot(i, ns(i), temp.T); wolffd@0: fwd{i,t} = multiply_by_pot(fwd{i,t}, ev); 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 = obschild(i); wolffd@0: temp = pot_to_marginal(CPDpot{c,t}); wolffd@0: ev = dpot(i, ns(i), temp.T); wolffd@0: fwd{i,t} = multiply_by_pot(fwd{i,t}, ev); 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: wolffd@0: if filter wolffd@0: marginals = fwd; wolffd@0: return; wolffd@0: end wolffd@0: wolffd@0: back = cell(ss,T); wolffd@0: t = T; wolffd@0: for i=hnodes wolffd@0: back{i,t} = dpot(i, ns(i)); 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 = CPDpot{i,t+1}; wolffd@0: pot = multiply_by_pot(pot, back{i,t+1}); wolffd@0: c = obschild(i); wolffd@0: temp = pot_to_marginal(CPDpot{c,t+1}); wolffd@0: ev = dpot(i, ns(i), temp.T); wolffd@0: pot = multiply_by_pot(pot, ev); 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: 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: %fwdback{i,t} = normalize_pot(multiply_pots(fwd{i,t}, back{i,t})); wolffd@0: end wolffd@0: end