annotate toolboxes/FullBNT-1.0.7/bnt/examples/static/fgraph/fg1.m @ 0:cc4b1211e677 tip

initial commit to HG from Changeset: 646 (e263d8a21543) added further path and more save "camirversion.m"
author Daniel Wolff
date Fri, 19 Aug 2016 13:07:06 +0200
parents
children
rev   line source
Daniel@0 1 % make an unrolled HMM, convert to factor graph, and check that
Daniel@0 2 % loopy propagation on the fgraph gives the exact answers.
Daniel@0 3
Daniel@0 4 seed = 1;
Daniel@0 5 rand('state', seed);
Daniel@0 6 randn('state', seed);
Daniel@0 7
Daniel@0 8 T = 3;
Daniel@0 9 Q = 3;
Daniel@0 10 O = 3;
Daniel@0 11 cts_obs = 0;
Daniel@0 12 param_tying = 1;
Daniel@0 13 bnet = mk_hmm_bnet(T, Q, O, cts_obs, param_tying);
Daniel@0 14
Daniel@0 15 data = sample_bnet(bnet);
Daniel@0 16
Daniel@0 17 fgraph = bnet_to_fgraph(bnet);
Daniel@0 18 big_bnet = fgraph_to_bnet(fgraph);
Daniel@0 19 % converting factor graph back does not recover the structure of the original bnet
Daniel@0 20
Daniel@0 21 max_iter = 2*T;
Daniel@0 22
Daniel@0 23 engine = {};
Daniel@0 24 engine{1} = jtree_inf_engine(bnet);
Daniel@0 25 engine{2} = belprop_inf_engine(bnet, 'max_iter', max_iter);
Daniel@0 26 engine{3} = belprop_fg_inf_engine(fgraph, 'max_iter', max_iter);
Daniel@0 27 engine{4} = jtree_inf_engine(big_bnet);
Daniel@0 28 nengines = length(engine);
Daniel@0 29
Daniel@0 30 big_engine = 4;
Daniel@0 31 fgraph_engine = 3;
Daniel@0 32
Daniel@0 33
Daniel@0 34 N = 2*T;
Daniel@0 35 evidence = cell(1,N);
Daniel@0 36 onodes = bnet.observed;
Daniel@0 37 evidence(onodes) = data(onodes);
Daniel@0 38 hnodes = mysetdiff(1:N, onodes);
Daniel@0 39
Daniel@0 40 bigN = length(big_bnet.dag);
Daniel@0 41 big_evidence = cell(1, bigN);
Daniel@0 42 big_evidence(onodes) = data(onodes);
Daniel@0 43 big_evidence(N+1:end) = {1}; % factors are observed to be 1
Daniel@0 44
Daniel@0 45 ll = zeros(1, nengines);
Daniel@0 46 for i=1:nengines
Daniel@0 47 if i==big_engine
Daniel@0 48 tic; [engine{i}, ll(i)] = enter_evidence(engine{i}, big_evidence); toc
Daniel@0 49 else
Daniel@0 50 tic; [engine{i}, ll(i)] = enter_evidence(engine{i}, evidence); toc
Daniel@0 51 end
Daniel@0 52 end
Daniel@0 53
Daniel@0 54 % compare all engines to engine{1}
Daniel@0 55
Daniel@0 56 % the log likelihood values may be bogus...
Daniel@0 57 for i=2:nengines
Daniel@0 58 %assert(approxeq(ll(1), ll(i)));
Daniel@0 59 end
Daniel@0 60
Daniel@0 61
Daniel@0 62 marg = zeros(T, nengines, Q); % marg(t,e,:)
Daniel@0 63 for t=1:T
Daniel@0 64 for e=1:nengines
Daniel@0 65 m = marginal_nodes(engine{e}, t);
Daniel@0 66 marg(t,e,:) = m.T;
Daniel@0 67 end
Daniel@0 68 end
Daniel@0 69 marg
Daniel@0 70
Daniel@0 71
Daniel@0 72 m = cell(nengines, T);
Daniel@0 73 for i=1:T
Daniel@0 74 for e=1:nengines
Daniel@0 75 m{e,i} = marginal_nodes(engine{e}, hnodes(i));
Daniel@0 76 end
Daniel@0 77 for e=2:nengines
Daniel@0 78 assert(approxeq(m{e,i}.T, m{1,i}.T));
Daniel@0 79 end
Daniel@0 80 end
Daniel@0 81
Daniel@0 82 mpe = {};
Daniel@0 83 ll = zeros(1, nengines);
Daniel@0 84 for e=1:nengines
Daniel@0 85 if e==big_engine
Daniel@0 86 mpe{e} = find_mpe(engine{e}, big_evidence);
Daniel@0 87 mpe{e} = mpe{e}(1:N); % chop off dummy nodes
Daniel@0 88 else
Daniel@0 89 mpe{e} = find_mpe(engine{e}, evidence);
Daniel@0 90 end
Daniel@0 91 end
Daniel@0 92
Daniel@0 93 % fgraph can't compute loglikelihood for software reasons
Daniel@0 94 % jtree on the big_bnet gives the wrong ll
Daniel@0 95 for e=2:nengines
Daniel@0 96 %assert(approxeq(ll(1), ll(e)));
Daniel@0 97 assert(approxeq(cell2num(mpe{1}), cell2num(mpe{e})))
Daniel@0 98 end