wolffd@0
|
1 function [f, logscale] = fwd(engine, fpast, ev, t)
|
wolffd@0
|
2 % Forwards pass.
|
wolffd@0
|
3
|
wolffd@0
|
4 bnet = bnet_from_engine(engine);
|
wolffd@0
|
5 ss = bnet.nnodes_per_slice;
|
wolffd@0
|
6
|
wolffd@0
|
7 ev2 = cell(ss, 2);
|
wolffd@0
|
8 ev2(:,1) = fpast.evidence;
|
wolffd@0
|
9 ev2(:,2) = ev;
|
wolffd@0
|
10 CPDpot = cell(1,ss);
|
wolffd@0
|
11 for n=1:ss
|
wolffd@0
|
12 fam = family(bnet.dag, n, 2);
|
wolffd@0
|
13 e = bnet.equiv_class(n, 2);
|
wolffd@0
|
14 CPDpot{n} = convert_to_pot(bnet.CPD{e}, engine.pot_type, fam(:), ev2);
|
wolffd@0
|
15 end
|
wolffd@0
|
16 f.evidence = ev;
|
wolffd@0
|
17 f.t = t;
|
wolffd@0
|
18
|
wolffd@0
|
19 % get prior
|
wolffd@0
|
20 int = engine.interface;
|
wolffd@0
|
21 if fpast.t==1
|
wolffd@0
|
22 prior = marginalize_pot(fpast.clpot{engine.int_clq1}, int, engine.maximize);
|
wolffd@0
|
23 else
|
wolffd@0
|
24 prior = marginalize_pot(fpast.clpot{engine.out_clq}, int+ss, engine.maximize);
|
wolffd@0
|
25 prior = set_domain_pot(prior, int); % shift back to slice 1
|
wolffd@0
|
26 end
|
wolffd@0
|
27
|
wolffd@0
|
28 pots = [ {prior} CPDpot ];
|
wolffd@0
|
29 slice1 = 1:ss;
|
wolffd@0
|
30 slice2 = slice1 + ss;
|
wolffd@0
|
31 CPDclqs = engine.clq_ass_to_node(slice2);
|
wolffd@0
|
32 D = engine.in_clq;
|
wolffd@0
|
33 clqs = [D CPDclqs];
|
wolffd@0
|
34
|
wolffd@0
|
35 [f.clpot, f.seppot] = init_pot(engine.jtree_engine, clqs, pots, engine.pot_type, engine.observed);
|
wolffd@0
|
36 [f.clpot, f.seppot] = collect_evidence(engine.jtree_engine, f.clpot, f.seppot);
|
wolffd@0
|
37 for c=1:length(f.clpot)
|
wolffd@0
|
38 if isa(f.clpot{c}, 'struct')
|
wolffd@0
|
39 domain = f.clpot{c}.domain;
|
wolffd@0
|
40 sizes = f.clpot{c}.sizes;
|
wolffd@0
|
41 T = f.clpot{c}.T;
|
wolffd@0
|
42 f.clpot{c} = dpot(domain, sizes, T);
|
wolffd@0
|
43 end
|
wolffd@0
|
44 [f.clpot{c}, ll(c)] = normalize_pot(f.clpot{c});
|
wolffd@0
|
45 end
|
wolffd@0
|
46 logscale = ll(engine.root);
|
wolffd@0
|
47
|