function P = logprobflat(B,Y,C)
%    LOGPROB Return the log probability of a configuration
%
%  P = LOGPROB(B,Y) where B is the model containing the beliefs, and Y
% is the configuration
%
%  P = LOGPROB(B,Y,C) where C==1 indicates the beliefs are in
%  logspace.

% Jerod Weinman
% jerod@acm.org
    
% $Id: logprobflat.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/>.


% See Equation (39) in
%
% JS Yedidia, WT Freeman, Y Weiss. Constructing Free Energy
% Approximations and Generalized Belief Propagation Algorithms. IEEE
% Transactions on Information Theory, 2005
  
  
  if nargin<3
	C = 0;
  end;
  
  N = B.numNodes;
  L = B.numLabels;
  
  dg = hist(B.adjmat(:),1:N); % Degree of each node
  
  
  nx = sub2ind( size(B.node), (1:N), Y );

  if C
	P = -sum( (dg-1) .* B.node(nx) );
  else
	P = -sum( (dg-1) .* log( B.node(nx) ) );
  end;

  nxL = sub2ind([L L],Y(B.adjmat(:,1)),Y(B.adjmat(:,2)));
  
  nx = sub2ind(size(B.edge),(1:size(B.adjmat,1)),nxL);
  
  if C
    P = P + sum(B.edge(nx));
  else
    P = P + sum(log( B.edge(nx) ));
  end;

 
