about summary refs log tree commit diff
path: root/sourcecodes/bnt-master/BNT/CPDs/@gaussian_CPD/log_prob_node.m
blob: ac10f8a3909fa322764f1b53ce86d971abeece17 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
function L = log_prob_node(CPD, self_ev, pev)
% LOG_PROB_NODE Compute prod_m log P(x(i,m)| x(pi_i,m), theta_i) for node i (gaussian)
% L = log_prob_node(CPD, self_ev, pev)
%
% self_ev(m) is the evidence on this node in case m.
% pev(i,m) is the evidence on the i'th parent in case m (if there are any parents).
% (These may also be cell arrays.)

if iscell(self_ev), usecell = 1; else usecell = 0; end

use_log = 1;
ncases = length(self_ev);
nparents = length(CPD.sizes)-1;
assert(ncases == size(pev, 2));

if ncases == 0
  L = 0;
  return;
end

L = 0;
for m=1:ncases
  if isempty(CPD.dps)
    i = 1;
  else
    if usecell
      dpvals = cat(1, pev{CPD.dps, m});
    else
      dpvals = pev(CPD.dps, m);
    end
    i = subv2ind(CPD.sizes(CPD.dps), dpvals(:)');
  end
  if usecell
    y = self_ev{m};
  else
    y = self_ev(m);
  end
  if length(CPD.cps) == 0 
    L = L + gaussian_prob(y, CPD.mean(:,i), CPD.cov(:,:,i), use_log);
  else
    if usecell
      x = cat(1, pev{CPD.cps, m});
    else
      x = pev(CPD.cps, m);
    end
    L = L + gaussian_prob(y, CPD.mean(:,i) + CPD.weights(:,:,i)*x, CPD.cov(:,:,i), use_log);
  end
end