Daniel@0: function y = sample_node(CPD, pvals) Daniel@0: % SAMPLE_NODE Draw a random sample from P(Xi | x(pi_i), theta_i) (discrete) Daniel@0: % y = sample_node(CPD, parent_evidence) Daniel@0: % Daniel@0: % parent_evidence{i} is the value of the i'th parent Daniel@0: Daniel@0: if 0 Daniel@0: n = length(pvals)+1; Daniel@0: dom = 1:n; Daniel@0: evidence = cell(1,n); Daniel@0: evidence(1:n-1) = pvals; Daniel@0: T = convert_to_table(CPD, dom, evidence); Daniel@0: y = sample_discrete(T); Daniel@0: end Daniel@0: Daniel@0: Daniel@0: CPT = CPD_to_CPT(CPD); Daniel@0: sz = mysize(CPT); Daniel@0: nparents = length(sz)-1; Daniel@0: switch nparents Daniel@0: case 0, T = CPT; Daniel@0: case 1, T = CPT(pvals{1}, :); Daniel@0: case 2, T = CPT(pvals{1}, pvals{2}, :); Daniel@0: case 3, T = CPT(pvals{1}, pvals{2}, pvals{3}, :); Daniel@0: case 4, T = CPT(pvals{1}, pvals{2}, pvals{3}, pvals{4}, :); Daniel@0: otherwise, Daniel@0: pvals = cat(1, pvals{:}); Daniel@0: psz = sz(1:end-1); Daniel@0: ssz = sz(end); Daniel@0: i = subv2ind(psz, pvals(:)'); Daniel@0: T = reshape(CPT, [prod(psz) ssz]); Daniel@0: T = T(i,:); Daniel@0: end Daniel@0: y = sample_discrete(T);