wolffd@0: function CPD = update_ess(CPD, fmarginal, evidence, ns, cnodes, hidden_bitv) wolffd@0: % UPDATE_ESS Update the Expected Sufficient Statistics of a hhmmF node. wolffd@0: % function CPD = update_ess(CPD, fmarginal, evidence, ns, cnodes, hidden_bitv) wolffd@0: % wolffd@0: % We assume the F nodes are always hidden wolffd@0: wolffd@0: % Figure out the node numbers associated with each parent wolffd@0: dom = fmarginal.domain; wolffd@0: %Fself = dom(end); wolffd@0: %Fbelow = dom(CPD.Fbelow_ndx); wolffd@0: Qself = dom(CPD.Qself_ndx); wolffd@0: Qps = dom(CPD.Qps_ndx); wolffd@0: wolffd@0: Qsz = CPD.Qsz; wolffd@0: Qpsz = CPD.Qpsz; wolffd@0: wolffd@0: if all(hidden_bitv(Qps)) % we assume all are hidden or all are observed wolffd@0: k_ndx = 1:Qpsz; wolffd@0: eff_Qpsz = Qpsz; wolffd@0: else wolffd@0: k_ndx = subv2ind(Qpsz, cat(1, evidence{Qps})); wolffd@0: eff_Qpsz = 1; wolffd@0: end wolffd@0: wolffd@0: if hidden_bitv(Qself) wolffd@0: j_ndx = 1:Qsz; wolffd@0: eff_Qsz = Qsz; wolffd@0: else wolffd@0: j_ndx = evidence{Qself}; wolffd@0: eff_Qsz = 1; wolffd@0: end wolffd@0: wolffd@0: % Fmarginal(Qps, Q, Fbelow, F) wolffd@0: fmarg = myreshape(fmarginal.T, [eff_Qpsz eff_Qsz 2 2]); wolffd@0: wolffd@0: counts = zeros(Qpsz, Qsz, 2); wolffd@0: %counts(k_ndx, j_ndx, :) = sum(fmarginal.T(:, :, :, :), 3); % sum over Fbelow wolffd@0: counts(k_ndx, j_ndx, :) = fmarg(:, :, 2, :); % Fbelow = 2 wolffd@0: wolffd@0: CPD.sub_CPD_term = update_ess_simple(CPD.sub_CPD_term, counts);