Daniel@0: function marginal = marginal_family(engine, i, t, add_ev) Daniel@0: % MARGINAL_FAMILY Compute the marginal on the specified family (hmm) Daniel@0: % marginal = marginal_family(engine, i, t, add_ev) Daniel@0: Daniel@0: if nargin < 3, t = 1; end Daniel@0: if nargin < 4, add_ev = 0; end Daniel@0: Daniel@0: ns = engine.eff_node_sizes(:); Daniel@0: ss = engine.slice_size; Daniel@0: Daniel@0: if t==1 | ~engine.persist_bitv(i) Daniel@0: bigT = engine.one_slice_marginal(:,t); Daniel@0: ps = engine.parents{i}; Daniel@0: dom = [ps i] + (t-1)*ss; Daniel@0: bigdom = 1:ss; Daniel@0: bigsz = ns(bigdom); Daniel@0: bigdom = bigdom + (t-1)*ss; Daniel@0: else % some parents are in previous slice Daniel@0: bigT = engine.two_slice_marginal(:,t-1); % t-1 and t Daniel@0: ps = engine.parents{i+ss}; Daniel@0: dom = [ps i+ss] + (t-2)*ss; Daniel@0: bigdom = 1:(2*ss); % domain of xi(:,:,t) Daniel@0: bigsz = ns(bigdom); Daniel@0: bigdom = bigdom + (t-2)*ss; Daniel@0: end Daniel@0: marginal.domain = dom; Daniel@0: Daniel@0: marginal.T = marg_table(bigT, bigdom, bigsz, dom, engine.maximize); Daniel@0: marginal.mu = []; Daniel@0: marginal.Sigma = []; Daniel@0: Daniel@0: if add_ev Daniel@0: marginal = add_ev_to_dmarginal(marginal, engine.evidence, engine.node_sizes); Daniel@0: end Daniel@0: