wolffd@0: function [engine, loglik] = enter_evidence(engine, evidence, varargin) wolffd@0: % ENTER_EVIDENCE Add the specified evidence to the network (frontier) 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: [ss T] = size(evidence); wolffd@0: bnet = bnet_from_engine(engine); wolffd@0: onodes = find(~isemptycell(evidence)); wolffd@0: cnodes = unroll_set(bnet.cnodes(:), ss, T); wolffd@0: pot_type = determine_pot_type(bnet, onodes); wolffd@0: wolffd@0: CPDpot = convert_dbn_CPDs_to_pots(bnet, evidence, pot_type); wolffd@0: wolffd@0: [engine.fwdback, loglik, engine.fwd_frontier, engine.back_frontier] = ... wolffd@0: enter_soft_evidence(engine, CPDpot, onodes, pot_type, filter); wolffd@0: