Mercurial > hg > camir-aes2014
comparison toolboxes/FullBNT-1.0.7/bnt/inference/static/@belprop_inf_engine/Old/enter_evidence.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:e9a9cd732c1e |
---|---|
1 function engine = enter_evidence(engine, evidence) | |
2 | |
3 doms = engine.fg.doms; | |
4 ndoms = length(doms); | |
5 ns = engine.fg.node_sizes; | |
6 obs = find(~isemptycell(evidence)); | |
7 cobs = myintersect(obs, engine.fg.cnodes); | |
8 dobs = myintersect(obs, engine.fg.dnodes); | |
9 ns(cobs) = 0; | |
10 ns(dobs) = 1; | |
11 | |
12 % prime each local kernel with evidence (if any) | |
13 local_kernel = cell(1, ndoms); | |
14 for i=1:length(engine.fg.kernels_of_type) | |
15 u = engine.fg.kernels_of_type{i}; | |
16 local_kernel(u) = kernel_to_dpots(engine.fg.kernels{i}, evidence, engine.fg.domains_of_type{i}); | |
17 end | |
18 | |
19 % initialise all msgs to 1s | |
20 nedges = engine.fg.nedges; | |
21 msg = cell(1, nedges); | |
22 for i=1:nedges | |
23 msg{i} = dpot(engine.fg.sepset{i}, ns(engine.fg.sepset{i})); | |
24 end | |
25 | |
26 prod_of_msg = cell(1, ndoms); | |
27 bel = cell(1, ndoms); | |
28 old_bel = cell(1, ndoms); | |
29 | |
30 converged = 0; | |
31 iter = 1; | |
32 while ~converged & (iter <= engine.max_iter) | |
33 | |
34 % each node multiplies all its incoming msgs | |
35 for i=1:ndoms | |
36 prod_of_msg{i} = dpot(doms{i}, ns(doms{i})); | |
37 nbrs = engine.fg.nbrs{i}; | |
38 for j=1:length(nbrs) | |
39 ndx = engine.fg.edge_ndx(j,i); | |
40 prod_of_msg{i} = multiply_by_pot(prod_of_msg{i}, msg{ndx}); | |
41 end | |
42 end | |
43 old_msg = msg; | |
44 | |
45 % each node computes its local belief | |
46 for i=1:ndoms | |
47 bel{i} = normalize_pot(multiply_pots(prod_of_msg{i}, local_kernel{i})); | |
48 end | |
49 | |
50 % converged? | |
51 converged = 1; | |
52 for i=1:ndoms | |
53 if ~approxeq(bel{i}, old_bel{i}, engine.tol) | |
54 converged = 0; | |
55 break; | |
56 end | |
57 end | |
58 | |
59 if ~converged | |
60 % each node sends a msg to each of its neighbors | |
61 for i=1:ndoms | |
62 nbrs = engine.fg.nbrs{i}; | |
63 for j=1:length(nbrs) | |
64 % multiply all incoming msgs except from j | |
65 temp = prod_of_msg{i}; | |
66 ndx = engine.fg.edge_ndx(j,i); | |
67 temp = divide_by_pot(temp, old_msg{ndx}); | |
68 % send msg from i to j | |
69 temp = multiply_by_pot(temp, local_kernel{i}); | |
70 ndx = engine.fg.edge_ndx(i,j); | |
71 msg{ndx} = normalize_pot(marginalize_pot(temp, engine.fg.sepset{ndx})); | |
72 end | |
73 end | |
74 end | |
75 | |
76 iter = iter + 1; | |
77 end | |
78 | |
79 | |
80 engine.marginal = bel; |