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
