wolffd@0: function [mpe, ll] = calc_mpe_dbn(engine, evidence, break_ties) wolffd@0: % CALC_MPE Computes the most probable explanation of the evidence wolffd@0: % [mpe, ll] = calc_mpe_dbn(engine, evidence, break_ties) wolffd@0: % wolffd@0: % INPUT wolffd@0: % engine must support max-propagation wolffd@0: % evidence{i,t} is the observed value of node i in slice t, or [] if hidden wolffd@0: % wolffd@0: % OUTPUT wolffd@0: % mpe{i,t} is the most likely value of node i (cell array!) wolffd@0: % ll is the log-likelihood of the globally best assignment wolffd@0: % wolffd@0: % This currently only works when all hidden nodes are discrete wolffd@0: wolffd@0: if nargin < 3, break_ties = 0; end wolffd@0: wolffd@0: if break_ties wolffd@0: disp('warning: break ties is ignored') wolffd@0: end wolffd@0: wolffd@0: [engine, ll] = enter_evidence(engine, evidence, 'maximize', 1); wolffd@0: wolffd@0: observed = ~isemptycell(evidence); wolffd@0: [ss T] = size(evidence); wolffd@0: scalar = 1; wolffd@0: N = length(evidence); wolffd@0: mpe = cell(ss,T); wolffd@0: bnet = bnet_from_engine(engine); wolffd@0: ns = bnet.node_sizes; wolffd@0: for t=1:T wolffd@0: for i=1:ss wolffd@0: m = marginal_nodes(engine, i, t); wolffd@0: % observed nodes are all set to 1 inside the inference engine, so we must undo this wolffd@0: if observed(i,t) wolffd@0: mpe{i,t} = evidence{i,t}; wolffd@0: else wolffd@0: assert(length(m.T) == ns(i)); wolffd@0: mpe{i,t} = argmax(m.T); wolffd@0: end wolffd@0: end wolffd@0: end