wolffd@0: function [engine, loglik] = enter_evidence(engine, evidence, varargin) wolffd@0: % ENTER_EVIDENCE Add the specified evidence to the network (bk_ff_hmm) wolffd@0: % [engine, loglik] = enter_evidence(engine, evidence, ...) wolffd@0: % wolffd@0: % evidence{i,t} = [] if if X(i,t) is hidden, and otherwise contains its observed value (scalar or column vector) wolffd@0: % wolffd@0: % The following optional arguments can be specified in the form of name/value pairs: wolffd@0: % [default value in brackets] wolffd@0: % wolffd@0: % maximize - if 1, does max-product (not yet supported), else sum-product [0] wolffd@0: % filter - if 1, do filtering, else smoothing [0] wolffd@0: % wolffd@0: % e.g., engine = enter_evidence(engine, ev, 'maximize', 1) wolffd@0: wolffd@0: maximize = 0; wolffd@0: filter = 0; wolffd@0: wolffd@0: % parse optional params wolffd@0: args = varargin; wolffd@0: nargs = length(args); wolffd@0: if nargs > 0 wolffd@0: for i=1:2:nargs wolffd@0: switch args{i}, wolffd@0: case 'maximize', maximize = args{i+1}; wolffd@0: case 'filter', filter = args{i+1}; wolffd@0: otherwise, wolffd@0: error(['invalid argument name ' args{i}]); wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: assert(~maximize); wolffd@0: wolffd@0: bnet = bnet_from_engine(engine); wolffd@0: ss = length(bnet.intra); wolffd@0: onodes = bnet.observed; wolffd@0: hnodes = mysetdiff(1:ss, onodes); wolffd@0: T = size(evidence, 2); wolffd@0: assertBNT(~any(isemptycell(evidence(onodes,:)))); wolffd@0: wolffd@0: obslik = mk_hmm_obs_lik_mat(bnet, onodes, evidence); wolffd@0: wolffd@0: ns = bnet.node_sizes_slice; wolffd@0: ns(onodes) = 1; wolffd@0: wolffd@0: [gamma, loglik, marginals, marginalsT] = bk_ff_fb(engine.prior, engine.transmat, obslik, filter, hnodes, ns); wolffd@0: wolffd@0: for t=1:T wolffd@0: for i=hnodes(:)' wolffd@0: engine.marginals{i,t} = pot_to_marginal(marginalsT{i,t}); wolffd@0: end wolffd@0: for i=onodes(:)' wolffd@0: m.domain = i + (t-1)*ss; wolffd@0: m.T = 1; wolffd@0: engine.marginals{i,t} = m; wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: wolffd@0: