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

History | View | Annotate | Download (2.79 KB)

1
function order = best_first_elim_order(G, node_sizes, stage)
2
% BEST_FIRST_ELIM_ORDER Greedily search for an optimal elimination order.
3
% order = best_first_elim_order(moral_graph, node_sizes)
4
%
5
% Find an order in which to eliminate nodes from the graph in such a way as to try and minimize the
6
% weight of the resulting triangulated graph.  The weight of a graph is the sum of the weights of each
7
% of its cliques; the weight of a clique is the product of the weights of each of its members; the
8
% weight of a node is the number of values it can take on.
9
%
10
% Since this is an NP-hard problem, we use the following greedy heuristic:
11
% at each step, eliminate that node which will result in the addition of the least
12
% number of fill-in edges, breaking ties by choosing the node that induces the lighest clique.
13
% For details, see
14
% - Kjaerulff, "Triangulation of graphs -- algorithms giving small total state space",
15
%      Univ. Aalborg tech report, 1990 (www.cs.auc.dk/~uk)
16
% - C. Huang and A. Darwiche, "Inference in Belief Networks: A procedural guide",
17
%      Intl. J. Approx. Reasoning, 11, 1994
18
%
19

    
20
% Warning: This code is pretty old and could probably be made faster.
21

    
22
n = length(G);
23
if nargin < 3, stage = { 1:n }; end % no constraints
24

    
25
% For long DBNs, it may be useful to eliminate all the nodes in slice t before slice t+1.
26
% This will ensure that the jtree has a repeating structure (at least away from both edges).
27
% This is why we have stages.
28
% See the discussion of splicing jtrees on p68 of
29
% Geoff Zweig's PhD thesis, Dept. Comp. Sci., UC Berkeley, 1998.
30
% This constraint can increase the clique size significantly.
31

    
32
MG = G; % copy the original graph
33
uneliminated = ones(1,n);
34
order = zeros(1,n);
35
t = 1;  % Counts which time slice we are on        
36
for i=1:n
37
  U = find(uneliminated);
38
  valid = myintersect(U, stage{t});
39
  % Choose the best node from the set of valid candidates
40
  min_fill = zeros(1,length(valid));
41
  min_weight = zeros(1,length(valid));
42
  for j=1:length(valid)
43
    k = valid(j);
44
    nbrs = myintersect(neighbors(G, k), U);
45
    l = length(nbrs);
46
    M = MG(nbrs,nbrs);
47
    min_fill(j) = l^2 - sum(M(:)); % num. added edges
48
    min_weight(j) = prod(node_sizes([k nbrs])); % weight of clique
49
  end
50
  lightest_nbrs = find(min_weight==min(min_weight));
51
  % break ties using min-fill heuristic
52
  best_nbr_ndx = argmin(min_fill(lightest_nbrs));
53
  j = lightest_nbrs(best_nbr_ndx); % we will eliminate the j'th element of valid
54
  %j1s = find(score1==min(score1));
55
  %j = j1s(argmin(score2(j1s)));
56
  k = valid(j);
57
  uneliminated(k) = 0;
58
  order(i) = k;
59
  ns = myintersect(neighbors(G, k), U);
60
  if ~isempty(ns)
61
    G(ns,ns) = 1;
62
    G = setdiag(G,0);
63
  end
64
  if ~any(logical(uneliminated(stage{t}))) % are we allowed to the next slice?
65
    t = t + 1;
66
  end   
67
end
68