function [samples] = sampleNet(parents,cpts,biggestinputs,N)
%
% function [samples] = sampleNet(parents,cpts,biggestinputs,N)
%
% 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
%
% samples is an NxM matrix where the values at the
% m'th column range from 0..D_m
%
% N is the number of samples you want to randomly generate
%
% biggest input is a vector of the largest cardinality you
% expect for each node, this will be usually a vector of
% M ones for binary nodes.
%
% cpts is a matrix of rows where each row corresponds
% to a node and contains its conditional probability
% hypercube rasterized as a long vector
%
[M,M2]=size(parents);
samples = zeros(N,M);
% Figure out the cptsizes
cards = biggestinputs;
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
for n=1:N
sofar = zeros(size(parents(1,:)));
for i=1:M
p = rand(1,1);
index = 0;
for j=1:(i-1)
if (parents(i,j)>0.5)
index = (index + sofar(j))*cards(j);
end
end
tot = 0.0;
value = -1;
while (p>=tot)
tot = tot+cpts(i,index+1);
index = index+1;
value = value+1;
end
samples(n,i) = value;
sofar(i) = value;
end
end