| wolffd@0 | 1 function [P, p] = prob_node(CPD, self_ev, pev) | 
| wolffd@0 | 2 % PROB_NODE Compute prod_m P(x(i,m)| x(pi_i,m), theta_i) for node i (discrete) | 
| wolffd@0 | 3 % [P, p] = prob_node(CPD, self_ev, pev) | 
| wolffd@0 | 4 % | 
| wolffd@0 | 5 % self_ev(m) is the evidence on this node in case m. | 
| wolffd@0 | 6 % pev(i,m) is the evidence on the i'th parent in case m (if there are any parents). | 
| wolffd@0 | 7 % (These may also be cell arrays.) | 
| wolffd@0 | 8 % | 
| wolffd@0 | 9 % p(m) = P(x(i,m)| x(pi_i,m), theta_i) | 
| wolffd@0 | 10 % P = prod p(m) | 
| wolffd@0 | 11 | 
| wolffd@0 | 12 if iscell(self_ev), usecell = 1; else usecell = 0; end | 
| wolffd@0 | 13 | 
| wolffd@0 | 14 ncases = length(self_ev); | 
| wolffd@0 | 15 sz = dom_sizes(CPD); | 
| wolffd@0 | 16 | 
| wolffd@0 | 17 nparents = length(sz)-1; | 
| wolffd@0 | 18 if nparents == 0 | 
| wolffd@0 | 19   assert(isempty(pev)); | 
| wolffd@0 | 20 else | 
| wolffd@0 | 21   assert(isequal(size(pev), [nparents ncases])); | 
| wolffd@0 | 22 end | 
| wolffd@0 | 23 | 
| wolffd@0 | 24 n = length(sz); | 
| wolffd@0 | 25 dom = 1:n; | 
| wolffd@0 | 26 p = zeros(1, ncases); | 
| wolffd@0 | 27 if isa(CPD, 'tabular_CPD') | 
| wolffd@0 | 28   % speed up by looking up CPT using index Zhang Yimin  2001-12-31 | 
| wolffd@0 | 29   if usecell | 
| wolffd@0 | 30     if nparents == 0 | 
| wolffd@0 | 31       data = [cell2num(self_ev)]; | 
| wolffd@0 | 32     else | 
| wolffd@0 | 33       data = [cell2num(pev); cell2num(self_ev)]; | 
| wolffd@0 | 34     end | 
| wolffd@0 | 35   else | 
| wolffd@0 | 36     if nparents == 0 | 
| wolffd@0 | 37       data = [self_ev]; | 
| wolffd@0 | 38     else | 
| wolffd@0 | 39       data = [pev; self_ev]; | 
| wolffd@0 | 40     end | 
| wolffd@0 | 41   end | 
| wolffd@0 | 42 | 
| wolffd@0 | 43   indices = subv2ind(sz, data'); % each row of data' is a case | 
| wolffd@0 | 44 | 
| wolffd@0 | 45   CPT=CPD_to_CPT(CPD); | 
| wolffd@0 | 46   p = CPT(indices); | 
| wolffd@0 | 47 | 
| wolffd@0 | 48   %get the prob list | 
| wolffd@0 | 49   %cpt_size = prod(sz); | 
| wolffd@0 | 50   %prob_list=reshape(CPT, cpt_size, 1); | 
| wolffd@0 | 51   %for m=1:ncases  %here we assume we get evidence for node and all its parents | 
| wolffd@0 | 52   %  idx=indices(m); | 
| wolffd@0 | 53   %  p(m)=prob_list(idx); | 
| wolffd@0 | 54   %end | 
| wolffd@0 | 55 | 
| wolffd@0 | 56 else % eg. softmax | 
| wolffd@0 | 57 | 
| wolffd@0 | 58   for m=1:ncases | 
| wolffd@0 | 59     if usecell | 
| wolffd@0 | 60       if nparents == 0 | 
| wolffd@0 | 61 	evidence = {self_ev{m}}; | 
| wolffd@0 | 62       else | 
| wolffd@0 | 63 	evidence = cell(1,n); | 
| wolffd@0 | 64 	evidence(1:n-1) = pev(:,m); | 
| wolffd@0 | 65 	evidence(n) = self_ev(m); | 
| wolffd@0 | 66       end | 
| wolffd@0 | 67     else | 
| wolffd@0 | 68       if nparents == 0 | 
| wolffd@0 | 69 	evidence = num2cell(self_ev(m)); | 
| wolffd@0 | 70       else | 
| wolffd@0 | 71 	evidence = num2cell([pev(:,m)', self_ev(m)]); | 
| wolffd@0 | 72       end | 
| wolffd@0 | 73     end | 
| wolffd@0 | 74     T = convert_to_table(CPD, dom, evidence); | 
| wolffd@0 | 75     p(m) = T; | 
| wolffd@0 | 76   end | 
| wolffd@0 | 77 end | 
| wolffd@0 | 78 | 
| wolffd@0 | 79 P = prod(p); | 
| wolffd@0 | 80 | 
| wolffd@0 | 81 |