├── logProd.m ├── findSArray.m ├── findJArray.m ├── logSum.m ├── HHMM_EM.m ├── estimationLog.m ├── expectationEtaLog.m ├── testHHMM.m ├── expectationXiChiLog.m └── expectationAlphaBetaLog.m /logProd.m: -------------------------------------------------------------------------------- 1 | function d = logProd(a, b) 2 | if (isnan(a)) || (isnan(b)) 3 | d = NaN; 4 | else 5 | d = a+b; 6 | end 7 | if a==-inf && b==-inf 8 | d = -inf; 9 | end 10 | end -------------------------------------------------------------------------------- /findSArray.m: -------------------------------------------------------------------------------- 1 | function sArr = findSArray(q,d,i) 2 | if i == 1 3 | sArr = 1:cumsum(q(d,1:i,2)); 4 | else 5 | start = cumsum(q(d,1:(i-1),2)); 6 | ende = cumsum(q(d,1:i,2)); 7 | sArr = start(end)+1:ende(end); 8 | end 9 | end -------------------------------------------------------------------------------- /findJArray.m: -------------------------------------------------------------------------------- 1 | function jArr = findJArray(q,d,i) 2 | jArr = find(q(d,:,1)==2); 3 | preJ = find(jArr=i,1); 7 | jArr = (preJ(end))+1:jArr(postJ); 8 | else 9 | postJ= find(jArr>=i,1); 10 | jArr = jArr(preJ(end))+1:jArr(postJ); 11 | end 12 | end -------------------------------------------------------------------------------- /logSum.m: -------------------------------------------------------------------------------- 1 | function d = logSum(a, b) 2 | if (isnan(a)) || (isnan(b)) 3 | if (isnan(a)) 4 | d = b; 5 | else 6 | d = a; 7 | end 8 | else 9 | if a>b 10 | d = a + log(1 + exp(b-a)); 11 | else 12 | d = b + log(1 + exp(a-b)); 13 | end 14 | end 15 | if a==-inf && b==-inf 16 | d = -inf; 17 | end 18 | end -------------------------------------------------------------------------------- /HHMM_EM.m: -------------------------------------------------------------------------------- 1 | function [PI_new, A_new, B_new P] = HHMM_EM(q, seq, A, PI, B, alph, Palt) 2 | 3 | %% Parameter Estimation 4 | 5 | % % Expectation 6 | % [alpha beta ] = expectationAlphaBeta(A, PI, q, B, seq); 7 | % fprintf('Alpha-Beta-Estimation done\n'); 8 | % [eta_in eta_out ] = expectationEta(A, PI, q, alpha, beta, seq); 9 | % fprintf('Eta-Estimation done\n'); 10 | % [xi chi gamma_in gamma_out ] = expectationXiChi(A, PI, q, eta_in, eta_out, alpha, beta, seq); 11 | % fprintf('Gamma-Estimation done\n'); 12 | % 13 | % % Maximization 14 | % [PI_new A_new B_new] = estimation(PI, q, xi, chi, gamma_in, gamma_out, seq); 15 | % fprintf('Parameter-Estimation done\n\n'); 16 | 17 | %% Parameter Estimation Log 18 | 19 | % Expectation 20 | A = log(A); 21 | B = log(B); 22 | PI = log(PI); 23 | 24 | [alpha beta ] = expectationAlphaBetaLog(A, PI, q, B, seq); 25 | P = sum(exp(alpha(1,length(seq),2,:,1,1))); 26 | % fprintf('Alpha-Beta-Estimation done: %d, previous P %d\n', P, Palt); 27 | 28 | [eta_in eta_out ] = expectationEtaLog(A, PI, q, alpha, beta, seq); 29 | % fprintf('Eta-Estimation done\n'); 30 | 31 | [xi chi gamma_in gamma_out ] = expectationXiChiLog(A, PI, q, eta_in, eta_out, alpha, beta, seq); 32 | % fprintf('Gamma-Estimation done\n'); 33 | 34 | % Maximization 35 | [PI_new A_new B_new] = estimationLog(q, xi, chi, gamma_in, gamma_out, seq, B, alph); 36 | % fprintf('Parameter-Estimation done\n'); 37 | end 38 | -------------------------------------------------------------------------------- /estimationLog.m: -------------------------------------------------------------------------------- 1 | function [PI_new A_new B_new] = estimationLog(q, xi, chi, gamma_in, gamma_out, seq, B, alph) 2 | 3 | 4 | [prodY prodX] = find(q(:,:,1)==1 & q(:,:,2)==0); 5 | [allY allX] = find(q(:,:,1)==1); 6 | PI_new = -Inf(size(q,2),size(q,2),size(q,1)-1); 7 | A_new = -Inf(size(q,2),size(q,2),size(q,1)-1); 8 | B_new = -Inf(size(B)); 9 | 10 | 11 | %% Vertical Transitions 12 | sArray = findSArray(q,1,1); 13 | for i = sArray(1):sArray(end-1) 14 | summ = NaN; 15 | for k = sArray(1):sArray(end-1) 16 | summ = logSum(summ, chi(1,2,k)); 17 | end 18 | PI_new(1,i,1) = logProd(chi(1,2,i),-summ); 19 | end 20 | for d = 3:max(allY) 21 | for i = 1:max(allX) 22 | if q(d,i,1)==1 23 | parent = find(cumsum(q(d-1,:,2))>=i,1); 24 | jArray = findJArray(q,d,i); 25 | jArray = jArray(1):jArray(end-1); 26 | summOben = NaN; 27 | for t = 1:length(seq) 28 | summOben = logSum(summOben, chi(t,d,i)); 29 | end 30 | summUnten = NaN; 31 | for m = jArray 32 | summ = NaN; 33 | for t = 1:length(seq) 34 | summ = logSum(summ, chi(t,d,m)); 35 | end 36 | summUnten = logSum(summUnten, summ); 37 | end 38 | PI_new(parent,i,d-1) = logProd(summOben, -summUnten); 39 | end 40 | end 41 | end 42 | 43 | %% Horizontal Transitions 44 | for d = 2:max(allY) 45 | for i = 1:max(allX) 46 | if q(d,i,1)==1 47 | jArray = findJArray(q,d,i); 48 | for j = jArray 49 | oben = NaN; 50 | for t = 1:length(seq) 51 | oben = logSum(oben, xi(t,d,i,d,j)); 52 | end 53 | 54 | unten = NaN; 55 | for t = 1:length(seq) 56 | unten = logSum(unten, gamma_out(t,d,i)); 57 | end 58 | A_new(i,j,d-1) = logProd(oben,-unten); 59 | if isinf(A_new(i,j,d-1)) 60 | A_new(i,j,d-1) = log(eps); 61 | end 62 | end 63 | end 64 | end 65 | end 66 | 67 | %% Emissions 68 | for v = alph 69 | for d = 2:max(prodY) 70 | for i = 1:max(prodX) 71 | if q(d,i,2)==0 && q(d,i,1)==1 72 | d1 = NaN; 73 | for n = 1:length(seq) 74 | if seq(n)==v 75 | d1 = logSum(d1, chi(n,d,i)); 76 | end 77 | end 78 | d2 = NaN; 79 | for n = 2:length(seq) 80 | if seq(n)==v 81 | d2 = logSum(d2, gamma_in(n,d,i)); 82 | end 83 | end 84 | 85 | d3 = NaN; 86 | for n = 1:length(seq) 87 | d3 = logSum(d3, chi(n,d,i)); 88 | end 89 | d4 = NaN; 90 | for n = 2:length(seq) 91 | d4 = logSum(d4, gamma_in(n,d,i)); 92 | end 93 | x1 = logSum(d1,d2); 94 | x2 = logSum(d3,d4); 95 | B_new(d,i,v) = logProd(x1,-x2); 96 | end 97 | end 98 | end 99 | end 100 | 101 | %% Normierung 102 | A_new = exp(A_new); 103 | PI_new = exp(PI_new); 104 | B_new = exp(B_new); 105 | 106 | 107 | end 108 | -------------------------------------------------------------------------------- /expectationEtaLog.m: -------------------------------------------------------------------------------- 1 | function [ eta_in eta_out ] = expectationEtaLog( a, pi, q, alpha, beta, seq ) 2 | 3 | % Indizes aller states 4 | [allY allX] = find(q(:,:,1)==1); 5 | 6 | eta_in = -Inf(length(seq),size(q,1),size(q,2)); 7 | eta_out = -Inf(length(seq),size(q,1),size(q,2)); 8 | 9 | %% Eta_in 10 | sArray = findSArray(q,1,1); 11 | for i = sArray(1):sArray(end-1) 12 | for t = 1:length(seq) 13 | if t==1 14 | eta_in(t,2,i) = pi(1,i,1); 15 | else 16 | summ = NaN; 17 | jArray = findJArray(q,2,i); 18 | for j = jArray 19 | pro = logProd(alpha(1,t-1,2,j),a(j,i,1)); 20 | summ = logSum(summ,pro); 21 | end 22 | eta_in(t,2,i) = summ; 23 | end 24 | end 25 | end 26 | 27 | 28 | for d = 3:max(allY) 29 | for i = 1:max(allX) 30 | if q(d,i,1)==1 31 | parent = find(cumsum(q(d-1,:,2))>=i,1); 32 | jArray = findJArray(q,d,i); 33 | for t = 1:length(seq) 34 | if t==1 35 | eta_in(t,d,i) = logProd(eta_in(t,d-1,parent),pi(parent,i,d-1)); 36 | else 37 | outerSumm = NaN; 38 | for ttick = 1:(t-1) 39 | summ = NaN; 40 | for j = jArray%(1:end-1) 41 | pro = logProd(alpha(ttick,t-1,d,j),a(j,i,d-1)); 42 | summ = logSum(summ,pro); 43 | end 44 | outerSumm = logSum(outerSumm,logProd(summ,eta_in(ttick,d-1,parent))); 45 | end 46 | eta_in(t,d,i) = logSum(outerSumm,logProd(eta_in(t,d-1,parent),pi(parent,i,d-1))); 47 | end 48 | end 49 | end 50 | end 51 | end 52 | 53 | %% Eta_out 54 | sArray = findSArray(q,1,1); 55 | for i = sArray(1):sArray(end-1) 56 | for t = length(seq):-1:1 57 | if t==length(seq) 58 | ende = sArray(end); 59 | eta_out(t,2,i) = a(i,ende,1); 60 | else 61 | summ = NaN; 62 | jArray = findJArray(q,2,i); 63 | for j = jArray 64 | prod = logProd(beta(t+1,length(seq),2,j),a(i,j,1)); 65 | summ = logSum(summ,prod); 66 | end 67 | eta_out(t,2,i) = summ; 68 | end 69 | end 70 | end 71 | 72 | for d = 3:max(allY) 73 | for i = 1:max(allX) 74 | if q(d,i,1)==1 75 | parent = find(cumsum(q(d-1,:,2))>=i,1); 76 | jArray = findJArray(q,d,i); 77 | e = find(q(d,i:end,1)==2,1) + i-1; 78 | for t = length(seq):-1:1 79 | if t==length(seq) 80 | eta_out(t,d,i) = logProd(eta_out(t,d-1,parent),a(i,e,d-1)); 81 | else 82 | outerSumm = NaN; 83 | for k = (t+1):length(seq) 84 | summ = NaN; 85 | for j = jArray 86 | pro = logProd(beta(t+1,k,d,j),a(i,j,d-1)); 87 | summ = logSum(summ,pro); 88 | end 89 | outerSumm = logSum(outerSumm,logProd(summ,eta_out(k,d-1,parent))); 90 | end 91 | eta_out(t,d,i) = logSum(outerSumm,logProd(eta_out(t,d-1,parent),a(i,e,d-1))); 92 | end 93 | end 94 | end 95 | end 96 | end 97 | 98 | 99 | end 100 | -------------------------------------------------------------------------------- /testHHMM.m: -------------------------------------------------------------------------------- 1 | clc; 2 | clear all; 3 | close all; 4 | addpath(genpath('../Graph')) 5 | 6 | %% Parameters 7 | maxIter = 40; 8 | maxError = 1e-03; 9 | 10 | %% HHMM Structure 11 | q(:,:,1) = [1 0 0 0 0 0 0 0; % 1 State, 2 Endstate 12 | 1 1 2 0 0 0 0 0; 13 | 1 1 2 1 1 2 0 0; 14 | 1 1 1 2 1 1 1 2]; 15 | q(:,:,2) = [3 0 0 0 0 0 0 0; 16 | 3 3 0 0 0 0 0 0; 17 | 0 0 0 4 4 0 0 0; 18 | 0 0 0 0 0 0 0 0]; 19 | 20 | testSeq = [ 1 3 1 3 2 5 8 4 2 5 4 6 7 2 8; 21 | 7 3 5 8 3 5 2 3 7 5 4 6 3 2 5]; 22 | % testSeq = [ 1 2 3 1 2; 23 | % 1 2 4 1 2]; 24 | alphabet = 1:8; 25 | 26 | %[y x] = find(q(:,:,1)==1 & q(:,:,2)==0); 27 | [prodY prodX] = find(q(:,:,1)==1 & q(:,:,2)==0); 28 | [allY allX] = find(q(:,:,1)==1); 29 | [intY intX] = find(q(:,:,2)~=0); 30 | % Vertical Transitions 31 | PI = zeros(size(q,2),size(q,2),size(q,1)-1); 32 | for i=1:length(allX) 33 | if allY(i)~=1 34 | parent_i = find(cumsum(q(allY(i)-1,:,2))>=allX(i),1); 35 | PI(parent_i,allX(i),allY(i)-1)= 1+(rand(1)-0.5)/5; 36 | end 37 | end 38 | 39 | % Horizontal Transitions 40 | A = zeros(size(q,2),size(q,2),size(q,1)-1); 41 | for i=1:length(allX) 42 | if allY(i)~=1 43 | parent_i = find(cumsum(q(allY(i)-1,:,2))>=allX(i),1); 44 | jArray = find(PI(parent_i,:,allY(i)-1)~=0); 45 | jArray = [jArray jArray(end)+1]; 46 | A(allX(i),jArray,allY(i)-1)= 1+(rand(size(jArray,2),1)-0.5)/5; 47 | end 48 | end 49 | 50 | % Emissions 51 | for i=1:length(prodX); 52 | r = ones(1,length(alphabet))+(rand(1,length(alphabet))-0.5)/5; 53 | B(prodY(i),prodX(i),1:length(alphabet)) = r/sum(r); 54 | end; 55 | 56 | %% Normierung 57 | for zeile = 1:size(q,2) 58 | for tiefe = 1:(size(q,1)-1) 59 | A(zeile,:,tiefe) = A(zeile,:,tiefe)/sum(A(zeile,:,tiefe)); 60 | PI(zeile,:,tiefe) = PI(zeile,:,tiefe)/sum(PI(zeile,:,tiefe)); 61 | end 62 | end 63 | A(isnan(A))=0; 64 | PI(isnan(PI))=0; 65 | 66 | initA = A; 67 | initB = B; 68 | initPI = PI; 69 | 70 | Palt = 0; 71 | stop = 0; 72 | for iter = 1:maxIter 73 | 74 | ergA = zeros(size(initA)); 75 | ergB = zeros(size(initB)); 76 | ergPI = zeros(size(initPI)); 77 | 78 | ergAVis = zeros(size(initA)); 79 | ergBVis = zeros(size(initB)); 80 | ergPIVis = zeros(size(initPI)); 81 | 82 | Pact = 0; 83 | for s=1:2 84 | seq = testSeq(s,:); 85 | tic; 86 | [PI, A, B, P] = HHMM_EM(q, seq, initA, initPI, initB, alphabet, 0); 87 | Pact = Pact+P; 88 | B(isnan(B))=0; 89 | A(isnan(A))=0; 90 | PI(isnan(PI))=0; 91 | toc; 92 | 93 | ergA = ergA+A; 94 | ergB = ergB+B; 95 | ergPI = ergPI+PI; 96 | end 97 | 98 | for i=1:length(prodX); 99 | ergBVis(prodY(i),prodX(i),:) = ergB(prodY(i),prodX(i),:)/sum(ergB(prodY(i),prodX(i),:)); 100 | end; 101 | for zeile = 1:size(q,2) 102 | for tiefe = 1:(size(q,1)-1) 103 | ergAVis(zeile,:,tiefe) = ergA(zeile,:,tiefe)/sum(ergA(zeile,:,tiefe)); 104 | ergPIVis(zeile,:,tiefe) = ergPI(zeile,:,tiefe)/sum(ergPI(zeile,:,tiefe)); 105 | end 106 | end 107 | ergAVis(isnan(ergAVis))=0; 108 | ergPIVis(isnan(ergPIVis))=0; 109 | ergBVis(isnan(ergBVis))=0; 110 | set(gcf,'PaperUnits','centimeters','PaperPosition',[0 0 30 20]) 111 | drawHHMM(q, ergAVis, ergPIVis, ergBVis); 112 | axis tight; 113 | V = AXIS; 114 | axis([V(1) V(2) V(3)-2 V(4)]) 115 | title(sprintf('Iteration %d',iter)); 116 | hold off; 117 | drawnow; 118 | 119 | if (abs(Pact-Palt)/(1+abs(Palt))) < maxError 120 | states = q(:,:,1)==1; 121 | if norm(ergAVis(:)-initA(:),inf)/sum(states(:)) < maxError 122 | fprintf('Konvergenz nach %d Iterationen\n', iter) 123 | stop = 1; 124 | end 125 | end 126 | if stop == 0 127 | Palt = Pact; 128 | initA = ergAVis; 129 | initB = ergBVis; 130 | initPI = ergPIVis; 131 | else 132 | break; 133 | end 134 | end -------------------------------------------------------------------------------- /expectationXiChiLog.m: -------------------------------------------------------------------------------- 1 | function [ xi chi gamma_in gamma_out ] = expectationXiChiLog(a, pi, q, eta_in, eta_out, alpha, beta, seq) 2 | 3 | POlambda = log(sum(exp(alpha(1,length(seq),2,:,1,1)))); 4 | [allY allX] = find(q(:,:,1)==1); 5 | 6 | xi = -Inf(length(seq),size(q,1),size(q,2)-1,size(q,1),size(q,2)); 7 | chi = -Inf(length(seq),size(q,1),size(q,2)-1); 8 | gamma_in = chi; 9 | gamma_out= chi; 10 | 11 | %% Xi 12 | for t = 1:length(seq); 13 | sArray = findSArray(q,1,1); 14 | for i = sArray(1:end-1) 15 | jArray = findJArray(q,2,i); 16 | for k = jArray(1:end-1) 17 | if t==length(seq) 18 | temp = logProd(alpha(1,t,2,i),a(i,jArray(end),1)); 19 | xi(t,2,i,2,jArray(end)) = logProd(temp, -POlambda); 20 | else 21 | temp = logProd(alpha(1,t,2,i),beta(t+1,length(seq),2,k)); 22 | temp = logProd(temp,a(i,k,1)); 23 | xi(t,2,i,2,k) = logProd(temp, -POlambda); 24 | end 25 | end 26 | end 27 | end 28 | 29 | 30 | for t = 1:(length(seq)) 31 | for d = 3:max(allY) 32 | for i = 1:max(allX) 33 | if q(d,i,1)==1 34 | parent = find(cumsum(q(d-1,:,2))>=i,1); 35 | jArray = findJArray(q,d,i); 36 | for j = jArray 37 | if j == jArray(end) 38 | summ = NaN; 39 | for s = 1:t 40 | pro = logProd(eta_in(s,d-1,parent),alpha(s,t,d,i)); 41 | summ = logSum(summ,pro); 42 | end 43 | temp = logProd(summ, a(i,j,d-1)); 44 | temp = logProd(temp, eta_out(t,d-1,parent)); 45 | xi(t,d,i,d,j) = logProd(temp, -POlambda); 46 | else 47 | if t ~= length(seq) 48 | summ1 = NaN; 49 | for s = 1:t 50 | pro1 = logProd(eta_in(s,d-1,parent), alpha(s,t,d,i)); 51 | summ1 = logSum(summ1,pro1); 52 | end 53 | 54 | summ2 = NaN; 55 | for e = (t+1):length(seq) 56 | pro2 = logProd(eta_out(e,d-1,parent), beta(t+1,e,d,j)); 57 | summ2 = logSum(summ2,pro2); 58 | end 59 | 60 | temp = logProd(summ1,summ2); 61 | temp = logProd(temp, a(i,j,d-1)); 62 | xi(t,d,i,d,j) = logProd(temp, -POlambda); 63 | end 64 | end 65 | end 66 | end 67 | end 68 | end 69 | end 70 | 71 | 72 | 73 | %% Chi 74 | sArray = findSArray(q,1,1); 75 | for i = sArray(1):sArray(end-1); 76 | temp = logProd(pi(1,i,1), beta(1,length(seq),2,i)); 77 | chi(1,2,i) = logProd(temp, -POlambda); 78 | end 79 | 80 | for t=1:length(seq) 81 | for d = 3:max(allY) 82 | for i = 1:max(allX) 83 | if q(d,i,1)==1 84 | parent = find(cumsum(q(d-1,:,2))>=i,1); 85 | 86 | summ = NaN; 87 | for m = t:length(seq) 88 | pro = logProd(beta(t,m,d,i), eta_out(m,d-1,parent)); 89 | summ = logSum(summ,pro); 90 | end 91 | 92 | temp = logProd(summ, eta_in(t,d-1,parent)); 93 | temp = logProd(temp, pi(parent,i,d-1)); 94 | chi(t,d,i) = logProd(temp, -POlambda); 95 | end 96 | end 97 | end 98 | end 99 | 100 | 101 | 102 | %% Gamma 103 | for d = 2:max(allY) 104 | for i = 1:max(allX) 105 | if q(d,i,1)==1 106 | jArray = findJArray(q,d,i); 107 | for t = 2:length(seq) 108 | summ = NaN; 109 | for k = jArray(1:end-1) 110 | summ = logSum(summ, xi(t-1,d,k,d,i)); 111 | end 112 | gamma_in(t,d,i) = summ; 113 | end 114 | end 115 | end 116 | end 117 | 118 | for d = 2:max(allY) 119 | for i = 1:max(allX) 120 | if q(d,i,1)==1 121 | jArray = findJArray(q,d,i); 122 | for t = 1:(length(seq)) 123 | summ = NaN; 124 | for k = jArray 125 | summ = logSum(summ, xi(t,d,i,d,k)); 126 | end 127 | gamma_out(t,d,i)= summ; 128 | end 129 | end 130 | end 131 | end 132 | 133 | 134 | end 135 | -------------------------------------------------------------------------------- /expectationAlphaBetaLog.m: -------------------------------------------------------------------------------- 1 | function [ alpha, beta ] = expectationAlphaBetaLog( a, pi, q, b, seq ) 2 | 3 | % Indizes der production states 4 | [prodY prodX] = find(q(:,:,1)==1 & q(:,:,2)==0); 5 | % Indizes der internal states 6 | [intY intX] = find(q(:,:,2)~=0); 7 | 8 | alpha = -Inf(length(seq),length(seq),size(q,1),size(q,2)); 9 | beta = -Inf(length(seq),length(seq),size(q,1),size(q,2)); 10 | 11 | 12 | % Alpha 13 | for t = length(seq):-1:1 14 | for k = 0:(length(seq)-t) 15 | for d = max(prodY):-1:2 16 | for i = 1:max(prodX) 17 | if q(d,i,2)==0 && q(d,i,1)==1 18 | parent = find(cumsum(q(d-1,:,2))>=i,1); 19 | jArray = findJArray(q,d,i); 20 | if k==0 21 | alpha(t,t,d,i) = logProd(pi(parent,i,d-1), b(d,i,seq(t))); 22 | else 23 | summ = NaN; 24 | for j = jArray(1:end-1) % Produktionstates unter Parentknoten 25 | pro = logProd(alpha(t,t+k-1,d,j), a(j,i,d-1)); 26 | summ = logSum(summ,pro); 27 | end 28 | alpha(t,t+k,d,i) = logProd(summ, b(d,i,seq(t+k))); 29 | end 30 | end 31 | end 32 | end 33 | 34 | for d = max(intY):-1:2 35 | for i = 1:max(intX) 36 | if q(d,i,2)~=0 37 | parent = find(cumsum(q(d-1,:,2))>=i,1); 38 | jArray = findJArray(q,d,i); 39 | sArray = findSArray(q,d,i); 40 | if k==0 41 | summ = NaN; 42 | for s = sArray(1:end-1) 43 | pro = logProd(alpha(t,t,d+1,s), a(s,sArray(end),d)); 44 | summ = logSum(summ,pro); 45 | end 46 | alpha(t,t,d,i) = logProd(summ, pi(parent,i,d-1)); 47 | else 48 | outerSumm = NaN; 49 | for l = 0:(k-1) 50 | summ1 = NaN; 51 | for j = jArray(1:end-1) 52 | pro1 = logProd(alpha(t,t+l,d,j), a(j,i,d-1)); 53 | summ1 = logSum(summ1,pro1); 54 | end 55 | 56 | summ2 = NaN; 57 | for s = sArray(1:end-1) 58 | pro2 = logProd(alpha(t+l+1,t+k,d+1,s), a(s,sArray(end),d)); 59 | summ2 = logSum(summ2,pro2); 60 | end 61 | outerSumm = logSum(outerSumm,logProd(summ1,summ2)); 62 | end 63 | 64 | summ3 = NaN; 65 | for s = sArray(1:end-1); 66 | pro3 = logProd(alpha(t,t+k,d+1,s), a(s,sArray(end),d)); 67 | summ3 = logSum(summ3,pro3); 68 | end 69 | alpha(t,t+k,d,i) = logSum(outerSumm,logProd(summ3,pi(parent,i,d-1))); 70 | end 71 | end 72 | end 73 | end 74 | 75 | %% Beta 76 | for d = max(prodY):-1:2 77 | for i = 1:max(prodX) 78 | if q(d,i,2)==0 && q(d,i,1)==1 79 | jArray = findJArray(q,d,i); 80 | jArray = jArray(1:end-1); 81 | e = find(q(d,i:end,1)==2,1) + i-1; 82 | if k==0 83 | beta(t,t,d,i) = logProd(b(d,i,seq(t)),a(i,e,d-1)); 84 | else 85 | summ = NaN; 86 | for j = jArray 87 | pro = logProd(beta(t+1,t+k,d,j),a(i,j,d-1)); 88 | summ = logSum(summ,pro); 89 | end 90 | beta(t,t+k,d,i) = logProd(summ,b(d,i,seq(t))); 91 | end 92 | end 93 | end 94 | end 95 | 96 | for d = max(intY):-1:2 97 | for i = 1:max(intX) 98 | if q(d,i,2)~=0 99 | jArray = findJArray(q,d,i); 100 | sArray = findSArray(q,d,i); 101 | if k==0 102 | summ = NaN; 103 | for s = sArray(1:end-1) 104 | pro = logProd(beta(t,t,d+1,s), pi(i,s,d)); 105 | summ = logSum(summ,pro); 106 | end 107 | beta(t,t,d,i) = logProd(summ, a(i,jArray(end),d-1)); 108 | else 109 | outerSumm = NaN; 110 | for i1 = 0:k-1 111 | summ1 = NaN; 112 | for s = sArray(1:end-1) 113 | pro1 = logProd(beta(t,t+i1,d+1,s),pi(i,s,d)); 114 | summ1 = logSum(summ1,pro1); 115 | end 116 | 117 | summ2 = NaN; 118 | for j = jArray(1:end-1) 119 | pro2 = logProd(beta(t+i1+1,t+k,d,j),a(i,j,d-1)); 120 | summ2 = logSum(summ2,pro2); 121 | end 122 | outerSumm = logSum(outerSumm,logProd(summ1,summ2)); 123 | end 124 | 125 | summ3 = NaN; 126 | for s = sArray(1:end-1) 127 | pro3 = logProd(beta(t,t+k,d+1,s), pi(i,s,d)); 128 | summ3 = logSum(summ3,pro3); 129 | end 130 | beta(t,t+k,d,i) = logSum(outerSumm,logProd(summ3, a(i,jArray(end),d-1))); 131 | end 132 | end 133 | end 134 | end 135 | end 136 | end 137 | 138 | end --------------------------------------------------------------------------------