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

History | View | Annotate | Download (1.76 KB)

1
function fg = mk_fgraph(G, node_sizes, factors, varargin)
2
% MK_FGRAPH Make a factor graph
3
% fg = mk_fgraph(G, node_sizes, factors, ...)
4
%
5
% A factor graph is a bipartite graph, with one side containing variables,
6
% and the other containing functions of (subsets of) these variables.
7
% For details, see "Factor Graphs and the Sum-Product Algorithm",
8
%  F. Kschischang and B. Frey and H-A. Loeliger,
9
%  IEEE Trans. Info. Theory, 2001
10
%
11
% G(i,j) = 1 if there is an arc from variable i to factor j
12
%
13
% node_sizes(i) is the number of values node i can take on,
14
%   or the length of node i if i is a continuous-valued vector.
15
%
16
% 'factors' is the list of factors (kernel functions)
17
%
18
% The list below gives optional arguments [default value in brackets].
19
% 
20
% equiv_class - equiv_class(i)=j  means factor node i gets its params from factors{j} [1:F]
21
% discrete - the list of nodes which are discrete random variables [1:N]
22
%
23
% e.g., fg = mk_fgraph(G, [2 2], {bnet.CPD{1},bnet.CPD{2}}, 'discrete', [1 2])
24

    
25
fg.G = G;
26
fg.node_sizes = node_sizes;
27
fg.factors = factors;
28
[fg.nvars fg.nfactors] = size(G);
29

    
30
% default values for parameters
31
fg.equiv_class = 1:fg.nfactors;
32
fg.dnodes = 1:fg.nvars;
33

    
34
if nargin >= 4
35
  args = varargin;
36
  nargs = length(args);
37
  for i=1:2:nargs
38
    switch args{i},
39
     case 'equiv_class', fg.equiv_class = args{i+1}; 
40
     case 'discrete',    fg.dnodes = args{i+1}; 
41
     otherwise,  
42
      error(['invalid argument name ' args{i}]);       
43
    end
44
  end
45
end
46

    
47
% so that determine_pot_type will work...
48
fg.utility_nodes = [];
49
%fg.decision_nodes = [];
50
%fg.chance_nodes = fg.nvars;
51

    
52
fg.dom = cell(1, fg.nfactors);
53
for f=1:fg.nfactors
54
  fg.dom{f} = find(G(:,f));
55
end
56
fg.dep = cell(1, fg.nvars);
57
for x=1:fg.nvars
58
  fg.dep{x} = find(G(x,:));
59
end
60
fg.cnodes = mysetdiff(1:fg.nvars, fg.dnodes);