Mercurial > hg > camir-aes2014
comparison toolboxes/FullBNT-1.0.7/bnt/inference/static/@belprop_inf_engine/private/parallel_protocol.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 [bel, niter] = parallel_protocol(engine, evidence, pot_type, local_kernel, msg) | |
2 | |
3 bnet = bnet_from_engine(engine); | |
4 ns = bnet.node_sizes; | |
5 onodes = find(~isemptycell(evidence)); | |
6 | |
7 ndoms = length(engine.gdl.doms); | |
8 prod_of_msg = cell(1, ndoms); | |
9 bel = cell(1, ndoms); | |
10 old_bel = cell(1, ndoms); | |
11 | |
12 converged = 0; | |
13 iter = 1; | |
14 while ~converged & (iter <= engine.max_iter) | |
15 | |
16 % each node multiplies all its incoming msgs and computes its local belief | |
17 old_bel = bel; | |
18 for i=1:ndoms | |
19 prod_of_msg{i} = mk_initial_pot(pot_type, engine.gdl.doms{i}, ns, bnet.cnodes, onodes); | |
20 nbrs = engine.gdl.nbrs{i}; | |
21 for j=nbrs(:)' | |
22 prod_of_msg{i} = multiply_by_pot(prod_of_msg{i}, msg{j,i}); | |
23 end | |
24 bel{i} = normalize_pot(multiply_by_pot(local_kernel{i}, prod_of_msg{i})); | |
25 end | |
26 | |
27 if ~isempty(engine.fid) | |
28 for i=1:ndoms | |
29 tmp = pot_to_marginal(bel{i}); | |
30 %fprintf(engine.fid, '%9.7f ', tmp.T(1)); | |
31 fprintf(engine.fid, '%9.7f ', tmp.U(1)); | |
32 end | |
33 %fprintf(engine.fid, ' U '); | |
34 %for i=1:ndoms | |
35 % tmp = pot_to_marginal(bel{i}); | |
36 % fprintf(engine.fid, '%9.7f ', tmp.U(1)); | |
37 %end | |
38 fprintf(engine.fid, '\n'); | |
39 end | |
40 | |
41 % converged? | |
42 if iter==1 | |
43 converged = 0; | |
44 else | |
45 converged = 1; | |
46 for i=1:ndoms | |
47 if ~approxeq_pot(bel{i}, old_bel{i}, engine.tol) | |
48 converged = 0; | |
49 break; | |
50 end | |
51 end | |
52 end | |
53 | |
54 if ~converged | |
55 old_msg = msg; | |
56 % each node sends a msg to each of its neighbors | |
57 for i=1:ndoms | |
58 nbrs = engine.gdl.nbrs{i}; | |
59 for j=nbrs(:)' | |
60 % multiply all incoming msgs except from j | |
61 temp = prod_of_msg{i}; | |
62 temp = divide_by_pot(temp, old_msg{j,i}); | |
63 % send msg from i to j | |
64 temp = multiply_by_pot(temp, local_kernel{i}); | |
65 temp2 = marginalize_pot(temp, engine.gdl.sepset{i,j}, engine.maximize); | |
66 msg{i,j} = normalize_pot(temp2); | |
67 end | |
68 end | |
69 end | |
70 | |
71 iter = iter + 1; | |
72 end | |
73 | |
74 | |
75 niter = iter-1; | |
76 | |
77 if 0 | |
78 for i=1:ndoms | |
79 prod_of_msg{i} = mk_initial_pot(pot_type, engine.gdl.doms{i}, ns, bnet.cnodes, onodes); | |
80 nbrs = engine.gdl.nbrs{i}; | |
81 for j=nbrs(:)' | |
82 prod_of_msg{i} = multiply_by_pot(prod_of_msg{i}, msg{j,i}); | |
83 end | |
84 bel{i} = normalize_pot(multiply_by_pot(local_kernel{i}, prod_of_msg{i})); | |
85 end | |
86 end |