Daniel@0: % Check that online inference gives same results as filtering for various algorithms Daniel@0: Daniel@0: N = 3; Daniel@0: Q = 2; Daniel@0: ss = N*2; Daniel@0: Daniel@0: rand('state', 0); Daniel@0: randn('state', 0); Daniel@0: Daniel@0: Daniel@0: obs_size = 1; Daniel@0: discrete_obs = 0; Daniel@0: bnet = mk_chmm(N, Q, obs_size, discrete_obs); Daniel@0: ns = bnet.node_sizes_slice; Daniel@0: Daniel@0: engine = {}; Daniel@0: engine{end+1} = hmm_inf_engine(bnet); Daniel@0: E = length(engine); Daniel@0: Daniel@0: onodes = (1:N)+N; Daniel@0: Daniel@0: T = 4; Daniel@0: ev = cell(ss,T); Daniel@0: ev(onodes,:) = num2cell(randn(N, T)); Daniel@0: Daniel@0: Daniel@0: filter = 1; Daniel@0: loglik2 = zeros(1,E); Daniel@0: for e=1:E Daniel@0: [engine2{e}, loglik2(e)] = enter_evidence(engine{e}, ev, 'filter', filter); Daniel@0: end Daniel@0: Daniel@0: loglik = zeros(1,E); Daniel@0: marg1 = cell(E,N,T); Daniel@0: for e=1:E Daniel@0: ll = zeros(1,T); Daniel@0: engine{e} = dbn_init_bel(engine{e}); Daniel@0: for t=1:T Daniel@0: [engine{e}, ll(t)] = dbn_update_bel(engine{e}, ev(:,t), t); Daniel@0: for i=1:N Daniel@0: marg1{e,i,t} = dbn_marginal_from_bel(engine{e}, i); Daniel@0: end Daniel@0: end Daniel@0: loglik1(e) = sum(ll); Daniel@0: end Daniel@0: Daniel@0: assert(approxeq(loglik1, loglik2)) Daniel@0: Daniel@0: a = zeros(E,N,T); Daniel@0: for e=1:E Daniel@0: for t=1:T Daniel@0: for i=1:N Daniel@0: marg2{e,i,t} = marginal_nodes(engine2{e}, i, t); Daniel@0: a(e,i,t) = (approxeq(marg2{e,i,t}.T(:), marg1{e,i,t}.T(:))); Daniel@0: end Daniel@0: end Daniel@0: end Daniel@0: Daniel@0: assert(all(a(:)==1))