To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Revision:

root / _FullBNT / BNT / CPDs / @gaussian_CPD / Old / CPD_to_lambda_msg.m @ 8:b5b38998ef3b

History | View | Annotate | Download (1.97 KB)

1
function lam_msg = CPD_to_lambda_msg(CPD, msg_type, n, ps, msg, p)
2
% CPD_TO_LAMBDA_MSG Compute lambda message (gaussian)
3
% lam_msg = compute_lambda_msg(CPD, msg_type, n, ps, msg, p)
4
% Pearl p183 eq 4.52
5

    
6
switch msg_type
7
 case 'd',
8
  error('gaussian_CPD can''t create discrete msgs')
9
 case 'g',
10
  self_size = CPD.sizes(end);
11
  if all(msg{n}.lambda.precision == 0) % no info to send on
12
    lam_msg.precision = zeros(self_size);
13
    lam_msg.info_state = zeros(self_size, 1);
14
    return;
15
  end
16
  cpsizes = CPD.sizes(CPD.cps);
17
  dpval = 1;
18
  Q = CPD.cov(:,:,dpval);
19
  Sigmai = Q;
20
  wmu = zeros(self_size, 1);
21
  for k=1:length(ps)
22
    pk = ps(k);
23
    if pk ~= p
24
      bk = block(k, cpsizes);
25
      Bk = CPD.weights(:, bk, dpval);
26
      m = msg{n}.pi_from_parent{k};
27
      Sigmai = Sigmai + Bk * m.Sigma * Bk';
28
      wmu = wmu + Bk * m.mu; % m.mu = u(k)
29
    end
30
  end
31
  % Sigmai = Q + sum_{k \neq i} B_k Sigma_k B_k'
32
  i = find_equiv_posns(p, ps);
33
  bi = block(i, cpsizes);
34
  Bi = CPD.weights(:,bi, dpval);
35
  
36
  if 0
37
  P = msg{n}.lambda.precision;
38
  if isinf(P) % inv(P)=Sigma_lambda=0
39
    precision_temp = inv(Sigmai);
40
    lam_msg.precision = Bi' * precision_temp * Bi;
41
    lam_msg.info_state = precision_temp * (msg{n}.lambda.mu - wmu);
42
  else
43
    A = inv(P + inv(Sigmai));
44
    precision_temp = P + P*A*P;
45
    lam_msg.precision = Bi' * precision_temp * Bi;
46
    self_size = length(P);
47
    C = eye(self_size) + P*A;
48
    z = msg{n}.lambda.info_state;
49
    lam_msg.info_state = C*z - C*P*wmu;
50
  end
51
  end
52
  
53
  if isinf(msg{n}.lambda.precision)
54
    Sigma_lambda = zeros(self_size, self_size); % infinite precision => 0 variance
55
    mu_lambda = msg{n}.lambda.mu; % observed_value;
56
  else
57
    Sigma_lambda = inv(msg{n}.lambda.precision);
58
    mu_lambda = Sigma_lambda * msg{n}.lambda.info_state;
59
  end
60
  precision_temp = inv(Sigma_lambda + Sigmai);
61
  lam_msg.precision = Bi' * precision_temp * Bi;
62
  lam_msg.info_state = Bi' * precision_temp * (mu_lambda - wmu);
63
end
64