wolffd@0: function marginal = marginal_family(engine, i, t) wolffd@0: % MARGINAL_FAMILY Compute the marginal on the specified family (ff) wolffd@0: % marginal = marginal_family(engine, i, t) wolffd@0: wolffd@0: if nargin < 3, t = 1; end wolffd@0: wolffd@0: % The method is similar to the following HMM equation: wolffd@0: % xi(i,j,t) = normalise( alpha(i,t) * transmat(i,j) * obsmat(j,t+1) * beta(j,t+1) ) wolffd@0: % where xi(i,j,t) = Pr(Q(t)=i, Q(t+1)=j | y(1:T)) wolffd@0: wolffd@0: bnet = bnet_from_engine(engine); wolffd@0: wolffd@0: if myismember(i, engine.onodes) wolffd@0: ps = parents(bnet.dag, i); wolffd@0: p = ps(1); wolffd@0: marginal = pot_to_marginal(engine.marginals{p,t}); wolffd@0: marginal.domain = [p i]; wolffd@0: return; wolffd@0: end wolffd@0: wolffd@0: if t==1 wolffd@0: marginal = pot_to_marginal(engine.marginals{i,t}); wolffd@0: return; wolffd@0: end wolffd@0: wolffd@0: bnet = bnet_from_engine(engine); wolffd@0: ss = length(bnet.intra); wolffd@0: pot = engine.CPDpot{i,t}; wolffd@0: c = engine.obschild(i); wolffd@0: pot = multiply_by_pot(pot, engine.CPDpot{c,t}); wolffd@0: pot = multiply_by_pot(pot, engine.back{i,t}); wolffd@0: ps = parents(bnet.dag, i+ss); wolffd@0: for p=ps(:)' wolffd@0: pot = multiply_by_pot(pot, engine.fwd{p,t-1}); wolffd@0: end wolffd@0: marginal = pot_to_marginal(normalize_pot(pot)); wolffd@0: wolffd@0: