Daniel@0: function [mpe, prob] = calc_mpe_given_inf_engine(engine, evidence) Daniel@0: % CALC_MPE_GIVEN_ENGINE Computes the most probable explanation of the evidence Daniel@0: % [mpe, prob] = calc_mpe_given_inf_engine(engine, evidence) Daniel@0: % Daniel@0: % INPUT Daniel@0: % engine must support max-propagation Daniel@0: % evidence{i} is the obsevred value of node i, or [] if hidden Daniel@0: % Daniel@0: % OUTPUT Daniel@0: % mpe(i) is the most likely value of node i Daniel@0: % prob is the likelihood of the globally best assignment Daniel@0: % Daniel@0: % This currently only works when all nodes are discrete Daniel@0: Daniel@0: [engine, ll] = enter_evidence(engine, evidence); Daniel@0: Daniel@0: observed = ~isemptycell(evidence); Daniel@0: N = length(evidence); Daniel@0: mpe = zeros(1,N); Daniel@0: for i=1:N Daniel@0: m = marginal_nodes(engine, i); Daniel@0: % discrete observed nodes are all set to 1 inside the inference engine, so we must undo this Daniel@0: if observed(i) Daniel@0: mpe(i) = evidence{i}; Daniel@0: else Daniel@0: mpe(i) = argmax(m.T); Daniel@0: end Daniel@0: end Daniel@0: Daniel@0: bnet = bnet_from_engine(engine); Daniel@0: ll = log_lik_complete(bnet, num2cell(mpe(:))); Daniel@0: prob = exp(ll);