function LIK = var_unobserved_likelihood_Integrated(T,R,Q,Q_er,HHH,Y,trend,start)
%модель:
%S(t)=T*S(t-1)+R*Er(t); 
%E(Er(t)*Er(t)')=Q;
%Y(t)=trend(t)+HHH*S(t)+er(t)
%E(er(t)*er(t)')=Q_er;

%преобразуем вначале модель к виду удобному для расчетов.
[V,D]=eig(T);
I1=find(abs(diag(D))>=1-10^(-10));
n1=size(I1,1);



if n1==0
    n0=size(T,1);
    E_FF=zeros(n0,1);
    D_FF=ono_variance(T,R,Q,(1:n0).');
    QF=R*Q*(R.');
    DF=D;
    HF=HHH;
    
    LIK=0;
    start=start-1;
else
    n0=size(T,1)-n1;
    U=null(V(:,I1).');
    V=[U,V(:,I1)];
    U=inv(V);
    D=U*T*V;
    %D(n0+1:n0+n1,:)=0;тут иногда не 0
    D(:,n0+1:n0+n1)=0;
    D(n0+1:n1,n0+1:n1)=eye(n1);
    
    I0=(1:n0).';
    I1=(n0+1:n0+n1).';
    
    %F=inv(V)*S
    %новая модель:
    %F(t)=D*F(t-1)+inv(V)*R*Er(t); 
    %E(Er(t)*Er(t)')=Q;
    %Y(t)=trend(t)+HHH*V*F(t)+er(t)
    %E(er(t)*er(t)')=Q_er;
    
    
    
    H=HHH*V;
    D_Er=U*R;
    D_Er=D_Er*Q*(D_Er.');


    teta=null(H(:,I1).').';
    %teta*Y(t)=teta*trend(t)+teta*H(:,I0)*F(t;I0)+teta*er(t)
    teta_or=null(teta).';

    
    %стационарная часть
    E_F0=zeros(n0,1);
    D_F0=ono_variance(D,U*R,Q,I0);
     
        
    %нестационарная часть
    %M_=pinv(teta_or*H(:,I0))*teta_or*H(:,I0);
    M_OR=null(teta_or*H(:,I1));
    M_=null(M_OR.');
    %F1=M_*F1_1+M_OR*F1_2
    %teta_or*H(:,I1)*F1=teta_or*H(:,I1)*M_*F1_1
    
    %teta_or*H(:,I1)*M_F1=teta_or*(Y(:,start)-trend(:,start)-H(:,I0)*F0-er);
    AAA=inv(teta_or*H(:,I1)*M_);
    E_F1_1=AAA*teta_or*(Y(:,start)-trend(:,start));
    D_F1_1=AAA*teta_or*(H(:,I0)*D_F0*(H(:,I0).')+Q_er)*((AAA*teta_or).');
    COV_F1_1__F0=AAA*teta_or*(-H(:,I0))*D_F0;
    
    n2=size(M_,1);
    P=eye(n2,n1)*inv([M_,M_OR]);
    
    E_FF=[E_F0;E_F1_1];
    D_FF=[[D_F0,COV_F1_1__F0.'];[COV_F1_1__F0,D_F1_1]];
    QF=[[D_Er(I0,I0),D_Er(I0,I1)*(P')];[P*D_Er(I1,I0),P*D_Er(I1,I1)*(P.')]];
    %DF=[[D(I0,I0),zeros(n0,n2)];[zeros(n2,n0),eye(n2)]];
    DF=[[D(I0,I0),zeros(n0,n2)];[P*D(I1,I0),eye(n2)]];
    HF=[H(:,I0),H(:,I1)*M_];
    
    LIK=0;

    if size(teta,1)~=0
        E_FF_1=DF*E_FF;
        D_FF_1=DF*D_FF*(DF.')+QF;
        
        tHF=teta*HF;
        QQ_er=teta*Q_er*(teta.');
        QE_er=teta(:,1)*0;
        for i=1:size(teta,1)
        
            Y_0=teta(i,:)*Y(:,start)-teta(i,:)*trend(:,start)-tHF(i,:)*E_FF_1-QE_er(i,1);      
            AAA=inv(tHF(i,:)*D_FF_1*(tHF(i,:).')+QQ_er(i,i));
            if AAA<0
                D_FF_1=ono_okruglenie(D_FF_1);
                AAA=inv(tHF(i,:)*D_FF_1*(tHF(i,:).')+QQ_er(i,i));
            end
            LIK=LIK-0.5*AAA*(Y_0^2)+0.5*log(AAA)-0.5*log(2*pi);
        
            E_FF_1=E_FF_1+D_FF_1*(tHF(i,:).')*AAA*Y_0;
            %D_FF_1=D_FF_1-D_FF_1*(HF(i,:).')*AAA*HF(i,:)*D_FF_1; 

            %ошибки вычисления ведут к неверному знаку AAA
    
            %FF-E_FF=(FF-E_FF_1)-D_FF_1*(HF(i,:).')*AAA*Y_0;
            %Y_0=HF(i,:)*(FF-E_FF_1)+er(i,t)    
            BBB=eye(size(DF,1))-D_FF_1*(tHF(i,:).')*AAA*tHF(i,:);
            DDD=D_FF_1*(tHF(i,:).')*AAA;
            D_FF_1=BBB*D_FF_1*(BBB.')+DDD*QQ_er(i,i)*(DDD.');

            if QQ_er(i,i)>10^-10
                QE_er=QE_er+QQ_er(:,i)*inv(QQ_er(i,i))*Y_0;        
                QQ_er=QQ_er-QQ_er(:,i)*inv(QQ_er(i,i))*(QQ_er(:,i));
            end

        end
        E_FF=E_FF_1;
        D_FF=D_FF_1;
        
    end
    
end


N=size(Y,2);
n=size(DF,1);
nvar=size(Y,1);

QF=ono_okruglenie(QF);
D_FF=ono_okruglenie(D_FF);
DF=ono_okruglenie_uns(DF);
HF=ono_okruglenie_uns(HF);

while start<N
%плохая обусловленность HF*DF и HF*QF*(HF.'), предположительно ведет к проблемам. 
    start=start+1;
    E_FF_1=DF*E_FF;
    D_FF_1=DF*D_FF*(DF.')+QF;

    QQ_er=Q_er;
    QE_er=zeros(nvar,1);
    for i=1:nvar

        Y_0=Y(i,start)-trend(i,start)-HF(i,:)*E_FF_1-QE_er(i,1);      
        AAA=inv(HF(i,:)*D_FF_1*(HF(i,:).')+QQ_er(i,i));
        if AAA<0
            D_FF_1=ono_okruglenie(D_FF_1);
            AAA=inv(HF(i,:)*D_FF_1*(HF(i,:).')+QQ_er(i,i));
        end
        LIK=LIK-0.5*AAA*(Y_0^2)+0.5*log(AAA)-0.5*log(2*pi);
        
        E_FF_1=E_FF_1+D_FF_1*(HF(i,:).')*AAA*Y_0;
        %D_FF_1=D_FF_1-D_FF_1*(HF(i,:).')*AAA*HF(i,:)*D_FF_1; 

        %ошибки вычисления ведут к неверному знаку AAA
    
        %FF-E_FF=(FF-E_FF_1)-D_FF_1*(HF(i,:).')*AAA*Y_0;
        %Y_0=HF(i,:)*(FF-E_FF_1)+er(i,t)    
        BBB=eye(n)-D_FF_1*(HF(i,:).')*AAA*HF(i,:);
        DDD=D_FF_1*(HF(i,:).')*AAA;
        D_FF_1=BBB*D_FF_1*(BBB.')+DDD*QQ_er(i,i)*(DDD.');

        if QQ_er(i,i)>10^-10
            QE_er=QE_er+QQ_er(:,i)*inv(QQ_er(i,i))*Y_0;        
            QQ_er=QQ_er-QQ_er(:,i)*inv(QQ_er(i,i))*(QQ_er(:,i));
        end

    end
    E_FF=E_FF_1;
    D_FF=D_FF_1;
end

LIK=-LIK;
return


function V=ono_variance(D,R,Q,I0)
%F(t)=D*F(t-1)+R*Er(t); 
%E(Er(t)*Er(t)')=Q;

%V=D(I0,I0)*V*D(I0,I0)'+R(I0,:)*Q*R(I0,:)'
n1=size(I0,1);
Q0=R(I0,:)*(chol(Q).');
QQ=reshape(Q0*(Q0.'),n1*n1,1);
AA=eye(n1*n1)-kron(D(I0,I0),D(I0,I0));
AA=inv(AA);
VV=AA*QQ;
V=reshape(VV,n1,n1);
return

function A=ono_okruglenie(B)
n=size(B,1);
k=rank(B);
if k<n
    %[U,S,V]=SVDS(B,k,'L');
    %A=U*S*(V.');
    OPTS.disp=0;
    [V,D]=eigs(0.5*(B+B.'),k,'LM',OPTS);
    A=V*D*(V.');

else
    A=B;
end
return

function A=ono_okruglenie_uns(B)
k=rank(B);
[U,S,V]=SVDS(B,k,'L');
A=U*S*(V.');

return
