wolffd@0: function [b, mpe] = back_mpe(engine, bfuture, f, ev2, t) wolffd@0: wolffd@0: if f.t ~= t wolffd@0: error('mixed up time stamps') wolffd@0: end wolffd@0: if t==1 wolffd@0: error('should call back1_mpe') wolffd@0: end wolffd@0: wolffd@0: maximize = 1; wolffd@0: bnet = bnet_from_engine(engine); wolffd@0: ss = bnet.nnodes_per_slice; wolffd@0: wolffd@0: int = engine.interface; wolffd@0: D = engine.in_clq; wolffd@0: C = engine.out_clq; wolffd@0: phiD = marginalize_pot(bfuture.clpot{D}, int, maximize); wolffd@0: phiD = set_domain_pot(phiD, int+ss); % shift to slice 2 wolffd@0: phiC = marginalize_pot(f.clpot{C}, int+ss, maximize); wolffd@0: ratio = divide_by_pot(phiD, phiC); wolffd@0: f.clpot{C} = multiply_by_pot(f.clpot{C}, ratio); wolffd@0: wolffd@0: [mpe, b.clpot] = find_max_config(engine.jtree_engine, f.clpot, f.seppot, ev2); wolffd@0: mpe = mpe((1:ss)+ss); % extract values for slice 2 wolffd@0: for c=1:length(b.clpot) wolffd@0: [b.clpot{c}, ll(c)] = normalize_pot(b.clpot{c}); wolffd@0: end wolffd@0: b.t = t;