wolffd@0: function p = prob_node(CPD, self_ev, pev) wolffd@0: % PROB_NODE Compute P(y|pa(y), theta) (tabular) wolffd@0: % p = prob_node(CPD, self_ev, pev) wolffd@0: % wolffd@0: % self_ev{m} is the evidence on this node in case m wolffd@0: % pev{i,m} is the evidence on the i'th parent in case m wolffd@0: % If there is a single case, self_ev can be a scalar instead of a cell array wolffd@0: wolffd@0: ncases = size(pev, 2); wolffd@0: wolffd@0: %assert(~any(isemptycell(pev))); % slow wolffd@0: %assert(~any(isemptycell(self_ev))); % slow wolffd@0: wolffd@0: CPT = CPD_to_CPT(CPD); wolffd@0: sz = mysize(CPT); wolffd@0: nparents = length(sz)-1; wolffd@0: assert(nparents == size(pev, 1)); wolffd@0: wolffd@0: if ncases==1 wolffd@0: x = cat(1, pev{:}); wolffd@0: if iscell(y) wolffd@0: y = self_ev{1}; wolffd@0: else wolffd@0: y = self_ev; wolffd@0: end wolffd@0: switch nparents wolffd@0: case 0, p = CPT(y); wolffd@0: case 1, p = CPT(x(1), y); wolffd@0: case 2, p = CPT(x(1), x(2), y); wolffd@0: case 3, p = CPT(x(1), x(2), x(3), y); wolffd@0: otherwise, wolffd@0: ind = subv2ind(CPD.sizes, [x y]); wolffd@0: p = CPT(ind); wolffd@0: end wolffd@0: else wolffd@0: x = num2cell(pev)'; % each row is a case wolffd@0: y = cat(1, self_ev{:})'; wolffd@0: ind = subv2ind(CPD.sizes, [x y]); wolffd@0: p = CPT(ind); wolffd@0: end