Daniel@0: function [mpe, ll] = calc_mpe(engine, evidence, break_ties) Daniel@0: % CALC_MPE Computes the most probable explanation of the evidence Daniel@0: % [mpe, ll] = calc_mpe_given_inf_engine(engine, evidence, break_ties) Daniel@0: % Daniel@0: % INPUT Daniel@0: % engine must support max-propagation Daniel@0: % evidence{i} is the observed value of node i, or [] if hidden Daniel@0: % break_ties is optional. If 1, we will force ties to be broken consistently Daniel@0: % by calling enter_evidence N times. Daniel@0: % Daniel@0: % OUTPUT Daniel@0: % mpe{i} is the most likely value of node i (cell array!) Daniel@0: % ll is the log-likelihood of the globally best assignment Daniel@0: % Daniel@0: % This currently only works when all hidden nodes are discrete Daniel@0: Daniel@0: if nargin < 3, break_ties = 0; end Daniel@0: Daniel@0: Daniel@0: [engine, ll] = enter_evidence(engine, evidence, 'maximize', 1); Daniel@0: Daniel@0: observed = ~isemptycell(evidence); Daniel@0: Daniel@0: if 0 % fgraphs don't support bnet_from_engine Daniel@0: onodes = find(observed); Daniel@0: bnet = bnet_from_engine(engine); Daniel@0: pot_type = determine_pot_type(bnet, onodes); Daniel@0: assert(pot_type == 'd'); Daniel@0: end Daniel@0: Daniel@0: scalar = 1; Daniel@0: evidence = evidence(:); % hack to handle unrolled DBNs Daniel@0: N = length(evidence); Daniel@0: mpe = cell(1,N); Daniel@0: for i=1:N Daniel@0: m = marginal_nodes(engine, i); Daniel@0: % 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: % Bug fix by Ron Zohar, 8/15/01 Daniel@0: % If there are ties, we must break them as follows (see Jensen96, p106) Daniel@0: if break_ties Daniel@0: evidence{i} = mpe{i}; Daniel@0: [engine, ll] = enter_evidence(engine, evidence, 'maximize', 1); Daniel@0: end Daniel@0: end Daniel@0: if length(mpe{i}) > 1, scalar = 0; end Daniel@0: end Daniel@0: Daniel@0: if nargout >= 2 Daniel@0: bnet = bnet_from_engine(engine); Daniel@0: ll = log_lik_complete(bnet, mpe(:)); Daniel@0: end Daniel@0: if 0 % scalar Daniel@0: mpe = cell2num(mpe); Daniel@0: end