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 isa(CPD, 'tabular_CPD') wolffd@0: % speed up by looking up CPT using index Zhang Yimin 2001-12-31 wolffd@0: if usecell wolffd@0: if nparents == 0 wolffd@0: data = [cell2num(self_ev)]; wolffd@0: else wolffd@0: data = [cell2num(pev); cell2num(self_ev)]; wolffd@0: end wolffd@0: else wolffd@0: if nparents == 0 wolffd@0: data = [self_ev]; wolffd@0: else wolffd@0: data = [pev; self_ev]; wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: indices = subv2ind(sz, data'); % each row of data' is a case wolffd@0: wolffd@0: CPT=CPD_to_CPT(CPD); wolffd@0: p = CPT(indices); wolffd@0: wolffd@0: %get the prob list wolffd@0: %cpt_size = prod(sz); wolffd@0: %prob_list=reshape(CPT, cpt_size, 1); wolffd@0: %for m=1:ncases %here we assume we get evidence for node and all its parents wolffd@0: % idx=indices(m); wolffd@0: % p(m)=prob_list(idx); wolffd@0: %end wolffd@0: wolffd@0: else % eg. softmax wolffd@0: wolffd@0: for m=1:ncases wolffd@0: if usecell wolffd@0: if nparents == 0 wolffd@0: evidence = {self_ev{m}}; wolffd@0: else wolffd@0: evidence = cell(1,n); wolffd@0: evidence(1:n-1) = pev(:,m); wolffd@0: evidence(n) = self_ev(m); wolffd@0: end wolffd@0: else wolffd@0: if nparents == 0 wolffd@0: evidence = num2cell(self_ev(m)); wolffd@0: else wolffd@0: evidence = num2cell([pev(:,m)', self_ev(m)]); wolffd@0: end 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: wolffd@0: P = prod(p); wolffd@0: wolffd@0: