wolffd@0: function [P, p] = prob_node(CPD, self_ev, pev) wolffd@0: % PROB_NODE Compute prod_m P(x(i,m)| x(pi_i,m), theta_i) for node i (discrete) wolffd@0: % [P, 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 (if there are any parents). wolffd@0: % (These may also be cell arrays.) wolffd@0: % wolffd@0: % p(m) = P(x(i,m)| x(pi_i,m), theta_i) wolffd@0: % P = prod p(m) wolffd@0: wolffd@0: if iscell(self_ev), usecell = 1; else usecell = 0; end wolffd@0: wolffd@0: ncases = length(self_ev); wolffd@0: sz = dom_sizes(CPD); wolffd@0: wolffd@0: nparents = length(sz)-1; wolffd@0: if nparents == 0 wolffd@0: assert(isempty(pev)); wolffd@0: else wolffd@0: assert(isequal(size(pev), [nparents ncases])); wolffd@0: end wolffd@0: wolffd@0: n = length(sz); wolffd@0: dom = 1:n; wolffd@0: p = zeros(1, ncases); wolffd@0: if nparents == 0 wolffd@0: for m=1:ncases wolffd@0: if usecell wolffd@0: evidence = {self_ev{m}}; wolffd@0: else wolffd@0: evidence = num2cell(self_ev(m)); wolffd@0: end wolffd@0: T = convert_to_table(CPD, dom, evidence); wolffd@0: p(m) = T; wolffd@0: end wolffd@0: else wolffd@0: for m=1:ncases wolffd@0: if usecell wolffd@0: evidence = cell(1,n); wolffd@0: evidence(1:n-1) = pev(:,m); wolffd@0: evidence(n) = self_ev(m); wolffd@0: else wolffd@0: evidence = num2cell([pev(:,m)', self_ev(m)]); wolffd@0: end wolffd@0: T = convert_to_table(CPD, dom, evidence); wolffd@0: p(m) = T; wolffd@0: end wolffd@0: end wolffd@0: P = prod(p); wolffd@0: