Mercurial > hg > camir-aes2014
comparison toolboxes/FullBNT-1.0.7/bnt/inference/static/@belprop_inf_engine/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, ll, niter] = enter_evidence(engine, evidence, varargin) | |
2 % ENTER_EVIDENCE Propagate evidence using belief propagation | |
3 % [engine, ll, niter] = enter_evidence(engine, evidence, ...) | |
4 % | |
5 % The log-likelihood is not computed; ll = 0. | |
6 % niter contains the number of iterations used (if engine.protocol = 'parallel') | |
7 % | |
8 % The following optional arguments can be specified in the form of name/value pairs: | |
9 % [default value in brackets] | |
10 % | |
11 % maximize - 1 means use max-product, 0 means use sum-product [0] | |
12 % exclude - list of nodes whose potential will not be included in the joint [ [] ] | |
13 % | |
14 % e.g., engine = enter_evidence(engine, ev, 'maximize', 1) | |
15 | |
16 ll = 0; | |
17 exclude = []; | |
18 maximize = 0; | |
19 | |
20 if nargin >= 3 | |
21 args = varargin; | |
22 nargs = length(args); | |
23 for i=1:2:nargs | |
24 switch args{i}, | |
25 case 'exclude', exclude = args{i+1}; | |
26 case 'maximize', maximize = args{i+1}; | |
27 otherwise, | |
28 error(['invalid argument name ' args{i}]); | |
29 end | |
30 end | |
31 end | |
32 | |
33 engine.maximize = maximize; | |
34 | |
35 if ~isempty(engine.filename) | |
36 engine.fid = fopen(engine.filename, 'w'); | |
37 if engine.fid == 0 | |
38 error(['can''t open ' engine.filename]); | |
39 end | |
40 else | |
41 engine.fid = []; | |
42 end | |
43 | |
44 gdl = engine.gdl; | |
45 bnet = bnet_from_engine(engine); | |
46 | |
47 ndoms = length(gdl.doms); | |
48 ns = bnet.node_sizes; | |
49 onodes = find(~isemptycell(evidence)); | |
50 pot_type = determine_pot_type(bnet, onodes); | |
51 | |
52 % prime each local kernel with evidence (if any) | |
53 local_kernel = cell(1, ndoms); | |
54 for i=1:ndoms | |
55 if myismember(i, exclude) | |
56 local_kernel{i} = mk_initial_pot(pot_type, gdl.doms{i}, ns, bnet.cnodes, onodes); | |
57 else | |
58 e = bnet.equiv_class(i); | |
59 local_kernel{i} = convert_to_pot(bnet.CPD{e}, pot_type, gdl.doms{i}(:), evidence); | |
60 end | |
61 end | |
62 | |
63 % initialise all msgs to 1s | |
64 msg = cell(ndoms, ndoms); | |
65 for i=1:ndoms | |
66 nbrs = gdl.nbrs{i}; | |
67 for j=nbrs(:)' | |
68 dom = gdl.sepset{i,j}; | |
69 msg{i,j} = mk_initial_pot(pot_type, dom, ns, bnet.cnodes, onodes); | |
70 end | |
71 end | |
72 | |
73 switch engine.protocol | |
74 case 'parallel', | |
75 [engine.marginal_domains, niter] = parallel_protocol(engine, evidence, pot_type, local_kernel, msg); | |
76 case 'tree', | |
77 engine.marginal_domains = serial_protocol(engine, evidence, pot_type, local_kernel, msg); | |
78 niter = 1; | |
79 end | |
80 engine.niter = niter; | |
81 | |
82 %fprintf('just finished %d iterations of belprop\n', niter); | |
83 | |
84 if ~isempty(engine.filename) | |
85 fclose(engine.fid); | |
86 end |