function [nodeLabels] = UGM_Decode_LBP(nodePot,edgePot,edgeStruct)
% Assumes no ties

if edgeStruct.useMex
	nodeBel = UGM_Decode_LBPC(nodePot,edgePot,edgeStruct.edgeEnds,edgeStruct.nStates,edgeStruct.V,edgeStruct.E,int32(edgeStruct.maxIter));
else
	maximize = 1;
	new_msg = UGM_LoopyBP(nodePot,edgePot,edgeStruct,maximize);
	
	[nNodes,maxState] = size(nodePot);
	nEdges = size(edgePot,3);
	edgeEnds = edgeStruct.edgeEnds;
	V = edgeStruct.V;
	E = edgeStruct.E;
	nStates = edgeStruct.nStates;
	
	% Compute nodeBel
	for n = 1:nNodes
		edges = E(V(n):V(n+1)-1);
        edges = UGM_getEdges(n,edgeStruct);
		prod_of_msgs(1:nStates(n),n) = nodePot(n,1:nStates(n))';
		for e = edges
			if n == edgeEnds(e,2)
				prod_of_msgs(1:nStates(n),n) = prod_of_msgs(1:nStates(n),n) .* new_msg(1:nStates(n),e);
			else
				prod_of_msgs(1:nStates(n),n) = prod_of_msgs(1:nStates(n),n) .* new_msg(1:nStates(n),e+nEdges);
			end
		end
		nodeBel(n,1:nStates(n)) = prod_of_msgs(1:nStates(n),n)'./sum(prod_of_msgs(1:nStates(n),n));
	end
end
[pot nodeLabels] = max(nodeBel,[],2);
