annotate toolboxes/FullBNT-1.0.7/bnt/inference/static/@belprop_inf_engine/enter_evidence.m @ 0:cc4b1211e677 tip

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