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