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 / graph / strong_elim_order.m @ 8:b5b38998ef3b

History | View | Annotate | Download (2.56 KB)

1
function order = strong_elim_order(G, node_sizes, partial_order)
2
% STRONG_ELIM_ORDER Find an elimination order to produce a strongly triangulated graph.
3
% order = strong_elim_order(moral_graph, node_sizes, partial_order)
4
% 
5
% partial_order(i,j)=1 if we must marginalize i *after* j
6
% (so i will be nearer the strong root).
7
% e.g., if j is a decision node and i is its information set:
8
%   we cannot maximize j if we have marginalized out some of i
9
% e.g., if j is a continuous child and i is its discrete parent:
10
%   we want to integrate out the cts nodes before the discrete ones,
11
%   so that the marginal is strong.
12
%
13
% For details, see
14
% - Jensen, Jensen and Dittmer, "From influence diagrams to junction trees", UAI 94.
15
% - Lauritzen, "Propgation of probabilities, means, and variances in mixed graphical
16
%   association models", JASA 87(420):1098--1108, 1992.
17
%
18
% On p369 of the Jensen paper, they state "the reverse of the elimination order must be some
19
% extension of [the partial order] to a total order".
20
% We make no attempt to find the best such total ordering, in the sense of minimizing the weight
21
% of the resulting cliques.
22

    
23
% Example from the Jensen paper:
24
% Let us number the nodes in Fig 1 from top to bottom, left to right,
25
% so a=1,b=2,D1=3,c=4,...,l=14,j=15,k=16.
26
% The elimination ordering they propose on p370 is [14 15 16 11 12 1 4 5 10 8 13 9 7 6 3 2];
27

    
28
if 0
29
  total_order = topological_sort(partial_order);
30
  order = total_order(end:-1:1); % no attempt to find an optimal constrained ordering!
31
  return;
32
end
33

    
34
% The following implementation is due to Ilya Shpitser and seems to give wrong
35
% results on cg1
36

    
37
n = length(G);
38
MG = G; % copy the original graph
39
uneliminated = ones(1,n);
40
order = zeros(1,n);
41

    
42
for i=1:n
43
  roots = [];
44
  k = 1;
45
  for j=1:n
46
    if sum(partial_order(j,:)) == 0
47
      roots(k) = j;
48
      k = k + 1;
49
    end
50
  end
51
  U = find(uneliminated);
52
  valid = myintersect(U, roots);
53
  % Choose the best node from the set of valid candidates
54
  score1 = zeros(1,length(valid));
55
  score2 = zeros(1,length(valid));
56
  for j=1:length(valid)
57
    k = valid(j);
58
    ns = myintersect(neighbors(G, k), U);
59
    l = length(ns);
60
    M = MG(ns,ns);
61
    score1(j) = l^2 - sum(M(:)); % num. added edges
62
    score2(j) = prod(node_sizes([k ns])); % weight of clique
63
  end
64
  j1s = find(score1==min(score1));
65
  j = j1s(argmin(score2(j1s)));
66
  k = valid(j);
67
  uneliminated(k) = 0;
68
  order(i) = k;
69
  ns = myintersect(neighbors(G, k), U);
70
  if ~isempty(ns)
71
    G(ns,ns) = 1;
72
    G = setdiag(G,0);
73
  end
74
  partial_order(:,k) = 0;
75
end