wolffd@0: function engine = collect_evidence(engine, root) wolffd@0: wolffd@0: if isempty(engine.postorder{root}) wolffd@0: % this is the first time we have collected to this root wolffd@0: % memoize the order wolffd@0: [jtree, preorder, postorder] = mk_rooted_tree(engine.jtree, root); wolffd@0: postorder_parents = cell(1,length(postorder)); wolffd@0: for n=postorder(1:end-1) wolffd@0: postorder_parents{n} = parents(jtree, n); wolffd@0: end wolffd@0: engine.postorder{root} = postorder; wolffd@0: engine.postorder_parents{root} = postorder_parents; wolffd@0: else wolffd@0: postorder = engine.postorder{root}; wolffd@0: postorder_parents = engine.postorder_parents{root}; wolffd@0: end wolffd@0: wolffd@0: C = length(engine.clpot); wolffd@0: seppot = cell(C, C); wolffd@0: % separators are implicitely initialized to 1s wolffd@0: wolffd@0: % collect to root (node to parents) wolffd@0: for n=postorder(1:end-1) wolffd@0: for p=postorder_parents{n} wolffd@0: %clpot{p} = divide_by_pot(clpot{n}, seppot{p,n}); % dividing by 1 is redundant wolffd@0: engine.seppot{p,n} = marginalize_pot(engine.clpot{n}, engine.separator{p,n}, engine.maximize); wolffd@0: engine.clpot{p} = multiply_by_pot(engine.clpot{p}, engine.seppot{p,n}); wolffd@0: end wolffd@0: end