function [Y,F,B,G] = mpm(C,X,P)
% MPM Finds a maximum posterior marginal of data instance X
%
% [Y,F] = MPM(C,X) where C is the CRF, F is the exit flag from BP
% and X is the data instance. Y are the node labels.
%

% Jerod Weinma
% jerod@acm.org
    
% $Id: mpm.m 1 2009-05-07 13:41:00Z weinman $
 
% Jerod Weinman
% jerod@acm.org
% Copyright 2004, 2008, 2009
 
%    This file is part of Matlab GridCRF.
%
%    Matlab GridCRF is free software: you can redistribute it and/or modify
%    it under the terms of the GNU General Public License as published by
%    the Free Software Foundation, either version 3 of the License, or
%    (at your option) any later version.
%
%    Matlab GridCRF is distributed in the hope that it will be useful,
%    but WITHOUT ANY WARRANTY; without even the implied warranty of
%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%    GNU General Public License for more details.
%
%    You should have received a copy of the GNU General Public License
%    along with Matlab GridCRF.  If not, see <http://www.gnu.org/licenses/>.

  if nargin<3
	P = 0;
  end;

  % GCRF.MPM
	
  if 0
    
    M = unrollgm(C,X.node,X.hEdge,X.vEdge);
  % Do sum-product
  if P
	[B,G] = bethemin(M.adjmat, M.nodeEnergies, M.edgeEnergies, 1);
  else
	[B,G,F] = asyncbp(M.adjmat, M.nodeEnergies, M.edgeEnergies, 0,[],1);
  end;
  
  Y = argmax(B,1);
  else
    M = unrollgridflat(get(C,'weights'),X.node,X.hEdge,X.vEdge,get(C,'defEdge'));
    K = nodenum(gridsize(X.node,X.hEdge));
    [B,F,M] = gridsyncbp(K,M,0);
  end;
  
  Y = argmax(B.node,1)';
