function [likelihood] = likeNet(parents,cpts,inputs)
%
% function [likelihood] = likeNet(parents,cpts,inputs)
%
% Computes the log-likelihood of the discrete Bayes Net
% on the data in inputs
%
% Parents is an MxM matrix for each node listing
% which nodes are its parents. A one says that the
% corresponding column is a parent of the current row
% and zero means not a parents
% Make sure that parents come first (topological)
% Make sure that this is a valid DAG
% Make sure that nodes are not self-parents
%
% inputs is an NxM matrix where the values at the
% m'th column range from 0..D_m
%
% cpts is a matrix of rows where each row corresponds
% to a node and contains its conditional probability
% hypercube rasterized as a long vector
%
[N,M] = size(inputs);
% Figure out the conditional probability tables (cpt) sizes
cards = max(inputs);
cards = cards+ones(size(cards));
cptsize = zeros(M,1);
for i=1:M
cptsize(i) = cards(i);
for j=1:(i-1)
if (parents(i,j)>0.5)
cptsize(i) = cptsize(i)*cards(j);
end
end
end
% Verify that the cpts are normalized properly
for i=1:M
index = 1;
while (index0.0001)
fprintf(1,'BAD: The cpt for node %d sums to %f at index %d.\n',i,tot,index);
end
index = index+cards(i);
end
end
% Compute the log-likelihood for each data point for
% each node (sum log probs across all N points and M nodes)
likelihood = 0.0;
for n=1:N
logp = 0;
for i=1:M
index = 0;
for j=1:(i-1)
if (parents(i,j)>0.5)
index = (index + inputs(n,j))*cards(j+1);
end
end
index = index + inputs(n,i);
if (cpts(i,index+1)<0.0)
fprintf(1,'BAD: Found Negative in Conditional Probability Table Storage\n');
else
logp = logp + log(cpts(i,index+1));
end
end
likelihood = likelihood + logp;
end