wolffd@0: function engine = jtree_unrolled_dbn_inf_engine(bnet, T, varargin) wolffd@0: % JTREE_UNROLLED_DBN_INF_ENGINE Unroll the DBN for T time-slices and apply jtree to the resulting static net wolffd@0: % engine = jtree_unrolled_dbn_inf_engine(bnet, T, ...) 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: % useC - 1 means use jtree_C_inf_engine instead of jtree_inf_engine [0] wolffd@0: % constrained - 1 means we constrain ourselves to eliminate slice t before t+1 [1] wolffd@0: % wolffd@0: % e.g., engine = jtree_unrolled_inf_engine(bnet, 'useC', 1); wolffd@0: wolffd@0: % set default params wolffd@0: N = length(bnet.intra); wolffd@0: useC = 0; wolffd@0: constrained = 1; wolffd@0: wolffd@0: if nargin >= 3 wolffd@0: args = varargin; wolffd@0: nargs = length(args); wolffd@0: if isstr(args{1}) wolffd@0: for i=1:2:nargs wolffd@0: switch args{i}, wolffd@0: case 'useC', useC = args{i+1}; wolffd@0: case 'constrained', constrained = args{i+1}; wolffd@0: otherwise, wolffd@0: error(['invalid argument name ' args{i}]); wolffd@0: end wolffd@0: end wolffd@0: else wolffd@0: error(['invalid argument name ' args{1}]); wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: bnet2 = dbn_to_bnet(bnet, T); wolffd@0: ss = length(bnet.intra); wolffd@0: engine.ss = ss; wolffd@0: wolffd@0: % If constrained_order = 1 we constrain ourselves to eliminate slice t before t+1. wolffd@0: % This prevents cliques containing nodes from far-apart time-slices. wolffd@0: if constrained wolffd@0: stages = num2cell(unroll_set(1:ss, ss, T), 1); wolffd@0: else wolffd@0: stages = { 1:length(bnet2.dag) }; wolffd@0: end wolffd@0: if useC wolffd@0: jengine = jtree_C_inf_engine(bnet2, 'stages', stages); wolffd@0: else wolffd@0: jengine = jtree_inf_engine(bnet2, 'stages', stages); wolffd@0: end wolffd@0: wolffd@0: engine.unrolled_engine = jengine; wolffd@0: % we don't inherit from jtree_inf_engine, because that would only store bnet2, wolffd@0: % and we would lose access to the DBN-specific fields like intra/inter wolffd@0: wolffd@0: engine.nslices = T; wolffd@0: engine = class(engine, 'jtree_unrolled_dbn_inf_engine', inf_engine(bnet));