Daniel@0: function [P, p] = prob_node(CPD, self_ev, pev) Daniel@0: % PROB_NODE Compute prod_m P(x(i,m)| x(pi_i,m), theta_i) for node i (discrete) Daniel@0: % [P, p] = prob_node(CPD, self_ev, pev) Daniel@0: % Daniel@0: % self_ev(m) is the evidence on this node in case m. Daniel@0: % pev(i,m) is the evidence on the i'th parent in case m (if there are any parents). Daniel@0: % (These may also be cell arrays.) Daniel@0: % Daniel@0: % p(m) = P(x(i,m)| x(pi_i,m), theta_i) Daniel@0: % P = prod p(m) Daniel@0: Daniel@0: if iscell(self_ev), usecell = 1; else usecell = 0; end Daniel@0: Daniel@0: ncases = length(self_ev); Daniel@0: sz = dom_sizes(CPD); Daniel@0: Daniel@0: nparents = length(sz)-1; Daniel@0: if nparents == 0 Daniel@0: assert(isempty(pev)); Daniel@0: else Daniel@0: assert(isequal(size(pev), [nparents ncases])); Daniel@0: end Daniel@0: Daniel@0: n = length(sz); Daniel@0: dom = 1:n; Daniel@0: p = zeros(1, ncases); Daniel@0: if isa(CPD, 'tabular_CPD') Daniel@0: % speed up by looking up CPT using index Zhang Yimin 2001-12-31 Daniel@0: if usecell Daniel@0: if nparents == 0 Daniel@0: data = [cell2num(self_ev)]; Daniel@0: else Daniel@0: data = [cell2num(pev); cell2num(self_ev)]; Daniel@0: end Daniel@0: else Daniel@0: if nparents == 0 Daniel@0: data = [self_ev]; Daniel@0: else Daniel@0: data = [pev; self_ev]; Daniel@0: end Daniel@0: end Daniel@0: Daniel@0: indices = subv2ind(sz, data'); % each row of data' is a case Daniel@0: Daniel@0: CPT=CPD_to_CPT(CPD); Daniel@0: p = CPT(indices); Daniel@0: Daniel@0: %get the prob list Daniel@0: %cpt_size = prod(sz); Daniel@0: %prob_list=reshape(CPT, cpt_size, 1); Daniel@0: %for m=1:ncases %here we assume we get evidence for node and all its parents Daniel@0: % idx=indices(m); Daniel@0: % p(m)=prob_list(idx); Daniel@0: %end Daniel@0: Daniel@0: else % eg. softmax Daniel@0: Daniel@0: for m=1:ncases Daniel@0: if usecell Daniel@0: if nparents == 0 Daniel@0: evidence = {self_ev{m}}; Daniel@0: else Daniel@0: evidence = cell(1,n); Daniel@0: evidence(1:n-1) = pev(:,m); Daniel@0: evidence(n) = self_ev(m); Daniel@0: end Daniel@0: else Daniel@0: if nparents == 0 Daniel@0: evidence = num2cell(self_ev(m)); Daniel@0: else Daniel@0: evidence = num2cell([pev(:,m)', self_ev(m)]); Daniel@0: end Daniel@0: end Daniel@0: T = convert_to_table(CPD, dom, evidence); Daniel@0: p(m) = T; Daniel@0: end Daniel@0: end Daniel@0: Daniel@0: P = prod(p); Daniel@0: Daniel@0: