function[bound] = inferLDS2(cur,n,pred) global DST; global TINY; bound = 0; T = DST(cur).T(n)+pred; %just an LDS if(cur==1) [x_f,sigma_f,x_p,sigma_p,ll] = lds_filter(DST(1).y{n}, DST(1).A, DST(1).C, DST(1).Q, DST(1).R, DST(1).mu, DST(1).Q1); [DST(1).x{n},DST(1).sigma{n},DST(1).sigma2{n}] = lds_smooth(DST(1).A, DST(1).C, DST(1).Q, DST(1).R, x_f, sigma_f, x_p, sigma_p); bound = bound - computeH2(cur,n); bound = bound + entropy4(cur,n); %else calculate variational parameters else %calculate variational Q(T) and A(T) % % sQ = zeros(DST(cur).xdim); % sQA = zeros(DST(cur).xdim); % sAQA = zeros(DST(cur).xdim); % % error = 0; % % for i=1:DST(DST(cur).parent).S % % sQ = sQ + DST(DST(cur).parent).s{n}(i,T) * DST(cur).Qinv(:,:,i); % % sQA = sQA + DST(DST(cur).parent).s{n}(i,T) * DST(cur).Qinv(:,:,i) * DST(cur).A(:,:,i); % % sAQA = sAQA + DST(DST(cur).parent).s{n}(i,T) * DST(cur).A(:,:,i)' * DST(cur).Qinv(:,:,i) * DST(cur).A(:,:,i); % % end % % % DST(cur).vQinv(:,:,T) = sQ; % % DST(cur).vQ(:,:,T) = safeinv(DST(cur).vQinv(:,:,T)); % % if (det(DST(cur).vQinv(:,:,T))<0.0) % fprintf(1,'DST_inferLDS: DST(%d).vQinv(:,:,%d)\n',cur,T); % DST(cur).vQinv(:,:,T) % min(DST(DST(cur).parent).s(:,T)) % DST(cur).Q % end % % DST(cur).vA(:,:,T) = DST(cur).vQ(:,:,T) * sQA; % % for t=T-1:-1:2 % % sQ = zeros(DST(cur).xdim); % sQA = zeros(DST(cur).xdim); % sAQA = zeros(DST(cur).xdim); % % for i=1:DST(DST(cur).parent).S % % % sQ = sQ + DST(DST(cur).parent).s{n}(i,t) * DST(cur).Qinv(:,:,i); % % sQA = sQA + DST(DST(cur).parent).s{n}(i,t) * DST(cur).Qinv(:,:,i) * DST(cur).A(:,:,i); % % sAQA = sAQA + DST(DST(cur).parent).s{n}(i,t+1) * DST(cur).A(:,:,i)' * ... % DST(cur).Qinv(:,:,i) * DST(cur).A(:,:,i); % % end % % DST(cur).vQinv(:,:,t) = sQ + sAQA - DST(cur).vA(:,:,t+1)' * ... % DST(cur).vQinv(:,:,t+1) * DST(cur).vA(:,:,t+1); % % if (det(DST(cur).vQinv(:,:,t))<0.0) % fprintf(1,'DST_inferLDS: DST(%d).vQinv(:,:,%d)\n',cur,t); % DST(cur).vQinv(:,:,t) % min(DST(DST(cur).parent).s(:,t)) % DST(cur).Q % end % % DST(cur).vQ(:,:,t) = safeinv(DST(cur).vQinv(:,:,t)); % % DST(cur).vA(:,:,t) = DST(cur).vQ(:,:,t) * sQA; % % end % % %calculate variational mu and Q1 % DST(cur).vmu = zeros(DST(cur).xdim,1); % % DST(cur).vQinv(:,:,1) = zeros(DST(cur).xdim); % % sQ = zeros(size(DST(cur).Q1inv(:,:,1))); % sQmu = zeros(size(DST(cur).mu(:,1))); % sAQA = sQ; % % for i=1:DST(DST(cur).parent).S % % sQ = sQ + DST(DST(cur).parent).s{n}(i,1) * DST(cur).Q1inv(:,:,i); % % sQmu = sQmu + DST(DST(cur).parent).s{n}(i,1) * DST(cur).Q1inv(:,:,i) * DST(cur).mu(:,i); % % sAQA = sAQA + DST(DST(cur).parent).s{n}(i,2) * DST(cur).A(:,:,i)' * ... % DST(cur).Qinv(:,:,i) * DST(cur).A(:,:,i); % % end % % DST(cur).vQinv(:,:,1) = sQ + sAQA - DST(cur).vA(:,:,2)' * ... % DST(cur).vQinv(:,:,2) * DST(cur).vA(:,:,2); % % if (det(DST(cur).vQinv(:,:,1))<0.0) % fprintf(1,'DST_inferLDS: DST(DST(d).vQinv(:,:,%d)\n',cur,1); % DST(cur).vQinv(:,:,1) % min(DST(DST(cur).parent).s{1}(:,1)) % % DST(cur).Q % end % % DST(cur).vQ(:,:,1) = safeinv(DST(cur).vQinv(:,:,1)); % % DST(cur).vmu = DST(cur).vQ(:,:,1) * sQmu; % % [x_f,sigma_f,x_p,sigma_p,ll] = vlds_filter2(cur,n,pred); % % vlds_smooth2(cur, x_f, sigma_f, x_p, sigma_p,n,pred); varGausschain(cur,n); ent = entropy4(cur,n); bound = bound + ent; end