Daniel@0: function bnet = fgraph_to_bnet(fg) Daniel@0: % FGRAPH_TO_BNET Convert a factor graph to a Bayes net Daniel@0: % bnet = fgraph_to_bnet(fg) Daniel@0: % Daniel@0: % We assume all factors are tabular_CPD. Daniel@0: % We create 1 dummy observed node for every factor. Daniel@0: Daniel@0: N = fg.nvars + fg.nfactors; Daniel@0: vnodes = 1:fg.nvars; Daniel@0: fnodes = fg.nvars+1:N; Daniel@0: dag = zeros(N); Daniel@0: for x=1:fg.nvars Daniel@0: dag(x, fnodes(fg.dep{x})) = 1; Daniel@0: end Daniel@0: ns = [fg.node_sizes ones(1, fg.nfactors)]; Daniel@0: discrete = [fg.dnodes fnodes]; Daniel@0: bnet = mk_bnet(dag, ns, 'discrete', discrete); Daniel@0: for x=1:fg.nvars Daniel@0: bnet.CPD{x} = tabular_CPD(bnet, x, 'CPT', 'unif'); Daniel@0: end Daniel@0: ev = cell(1, fg.nvars); % no evidence Daniel@0: for i=1:fg.nfactors Daniel@0: f = fnodes(i); Daniel@0: e = fg.equiv_class(i); Daniel@0: pot = convert_to_pot(fg.factors{e}, 'd', fg.dom{i}, ev); Daniel@0: m = pot_to_marginal(pot); Daniel@0: bnet.CPD{f} = tabular_CPD(bnet, f, 'CPT', m.T); Daniel@0: end Daniel@0: Daniel@0: