frontier_fast_inf_engine.m

来自「Bayes网络工具箱」· M 代码 · 共 92 行

M
92
字号
function engine = frontier_fast_inf_engine(bnet, onodes)% FRONTIER_FAST_INF_ENGINE Inference engine for DBNs which which uses the frontier algorithm, with optimizations% engine = frontier_fast_inf_engine(bnet, onodes)%% This is just like frontier_inf_engine, except the 'onodes' argument is required.% The observed nodes in every slice must be equal to onodes.% All hidden nodes must be discrete.pengine = frontier_inf_engine(bnet, onodes);fengine = struct(pengine); % violate object privacyengine.onodes = onodes;ns = bnet.node_sizes(:)';ss = length(bnet.intra);onodes2 = unroll_set(onodes(:), ss, 2);ns(onodes2(:)') = 1;[engine.fndx, engine.CPD_ndx] = mk_indices(fengine.fdom, 2, ns, fengine.ops, bnet.dag);[engine.fndx1, engine.CPD_ndx1] = mk_indices(fengine.fdom1, 1, ns, fengine.ops1, bnet.dag);  [engine.rev_fndx, engine.rev_CPD_ndx] = mk_rev_indices(fengine.fdom, 2, ns, -fengine.ops,  bnet.dag);[engine.rev_fndx1, engine.rev_CPD_ndx1] = mk_rev_indices(fengine.fdom1, 1, ns, -fengine.ops1, bnet.dag);engine = class(engine, 'frontier_fast_inf_engine', pengine);%%%%%%%%%function [fndx, CPD_ndx] = mk_rev_indices(fdom, t, ns, ops, dag)ss = length(ns)/2;if t==1  S = ss;else  S = 2*ss;endmult_ndx = cell(1,S);marg_ndx = cell(1,S);CPD_ndx = cell(1,S);for s=S:-1:1  olddom = fdom{s};  if s==1    if t==1      newdom = [];    else      newdom = 1:ss;    end  else    newdom = fdom{s-1};  end  i = ops(s);  if i>0    fndx{s} = mk_multiply_table_ndx(newdom, olddom, ns);  else    fam = family(dag, -i);    CPD_ndx{s} = mk_multiply_table_ndx(olddom, fam, ns);    assert(isequal(newdom, mysetdiff(olddom, -i)));    fndx{s} = mk_marginalise_table_ndx(olddom, newdom, ns);  endend%%%%%%%%%function [fndx, CPDndx] = mk_indices(fdom, t, ns, ops, dag)ss = length(ns)/2;if t==1  S = ss;else  S = 2*ss;endfndx = cell(1,S);CPDndx = cell(1,S);for s=1:S  i = ops(s);  newdom = fdom{s};  if s==1    if t==2      olddom = 1:ss;    else      olddom = [];    end  else    olddom = fdom{s-1};  end  if i>0    fndx{s} = mk_multiply_table_ndx(newdom, olddom, ns);    CPDndx{s} = mk_multiply_table_ndx(newdom, family(dag, i), ns);  else    fndx{s} = mk_marginalise_table_ndx(olddom, newdom, ns);  endend

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?