def test_backward_pass(T=1000, K=5, D=2): from pyhsmm.internals.hmm_messages_interface import messages_backwards_log # Make parameters As = npr.rand(K, K) As /= As.sum(axis=-1, keepdims=True) ll = npr.randn(T, K) # Use pyhsmm to compute true_betas = np.zeros((T, K)) messages_backwards_log(As, ll, true_betas) # Use ssm to compute test_betas = np.zeros((T, K)) backward_pass(As[None, :, :], ll, test_betas) assert np.allclose(true_betas, test_betas)
def test_hmm_mp_perf(T=10000, K=100, D=20): # Make parameters pi0 = np.ones(K) / K Ps = npr.rand(T-1, K, K) Ps /= Ps.sum(axis=2, keepdims=True) ll = npr.randn(T, K) out1 = np.zeros((T, K)) out2 = np.zeros((T, K)) # Run the PyHSMM message passing code from pyhsmm.internals.hmm_messages_interface import messages_forwards_log, messages_backwards_log tic = time() messages_forwards_log(Ps, ll, pi0, out1) pyhsmm_dt = time() - tic print("PyHSMM Fwd: ", pyhsmm_dt, "sec") # Run the SSM message passing code from ssm.messages import forward_pass, backward_pass forward_pass(pi0, Ps, ll, out2) # Call once to compile, then time it tic = time() forward_pass(pi0, Ps, ll, out2) smm_dt = time() - tic print("SMM Fwd: ", smm_dt, "sec") assert np.allclose(out1, out2) # Backward pass tic = time() messages_backwards_log(Ps, ll, out1) pyhsmm_dt = time() - tic print("PyHSMM Bwd: ", pyhsmm_dt, "sec") backward_pass(Ps, ll, out2) # Call once to compile, then time it tic = time() backward_pass(Ps, ll, out2) smm_dt = time() - tic print("SMM (Numba) Bwd: ", smm_dt, "sec") assert np.allclose(out1, out2)
def hmm_estep(natparam): C = lambda x: np.require(x, np.double, 'C') init_params, pair_params, node_params = list(map(C, natparam)) # compute messages alphal = messages_forwards_log(np.exp(pair_params), node_params, np.exp(init_params), np.zeros_like(node_params)) betal = messages_backwards_log(np.exp(pair_params), node_params, np.zeros_like(node_params)) # compute expected statistics from messages expected_states, expected_transcounts, log_normalizer = \ expected_statistics_log( pair_params, node_params, alphal, betal, np.zeros_like(node_params), np.zeros_like(pair_params)) expected_stats = expected_states[0], expected_transcounts, expected_states return log_normalizer, expected_stats
def _messages_backwards_log(trans_matrix,log_likelihoods): from pyhsmm.internals.hmm_messages_interface import messages_backwards_log return messages_backwards_log( trans_matrix,log_likelihoods, np.empty_like(log_likelihoods))