function [zro,zrocmx,stat,idf,siglev,errc] = ...
                                     NAGcheck(mr,par,z,nqz,verbose,errc)
%    VERIFIKACE ODHADNUTEHO SARMA MODELU REALNE 1-ROZMERNE CASOVE RADY
%         (Gateway to NAG Foundation toolbox routine G13ASF)
% V pripade SARIMA modelu verifikujeme SARMA model diferencovane rady 'xd'.
%
% VOLANI: [zro,zrocmx,stat,idf,siglev,errc] = ...
%                                     NAGcheck(mr,par,z,nqz,verbose,errc)
% VSTUP:
% mr   ... =[p,d,q,P,D,Q,s] ... vektor radu modelu SARIMA(p,d,q,P,D,Q,s)
%          vytvareny pomocnymi procedurami AR,MA,ARMA,ARIMA,SARIMA:
%          p ... rad nesezonni AR casti modelu (p>=0, cele cislo)
%          d ... rad nesezonniho diferencovani (d>=0, cele cislo)
%          q ... rad nesezonni MA casti modelu (q>=0, cele cislo)
%          P ... rad sezonni AR casti modelu (P>=0, cele cislo)
%          D ... rad sezonniho diferencovani (D>=0, cele cislo)
%          Q ... rad sezonni MA casti modelu (Q>=0, cele cislo)
%          s ... perioda (pocet bodu) sezonni komponenty (s>=0, cele cislo)
%          Podminky korektnosti (jsou kontrolovany - viz errc=1):
%          p,q,P,Q,s>=0; p+q+P+Q>0; s==0 => P=0 a Q=0.
% par  ... bunecne pole (1 x 4) vsech ctyr typu finalne odhadnutych
%          parametru (vektory po rade 1 x p, 1 x q, 1 x P, 1 x Q).
%          Parametry musi zarucovat kauzalitu a invertibilitu prislusnych
%          procesu v modelu.
% z   ...  rezidua odvozena z diferencovane rady xd (odhad bileho sumu Z(t)).
%          Alternativne lze misto 'z' dosadit i strukturu 'estINFO' vystupnich
%          informacnich parametru odhadu vracenych procedurou 'NAGest'.
%          Z teto struktury 'NAGcheck' vyuzije pouze polozku 'estINFO.z'.
% nqz  ... pozadovana delka rezidualni autokorelacni funkce pro
%          h=1,2,...,nqz, Npar<nqz<nz, kde je
%          Npar  ... celkovy pocet odhadovanych parametru
%          nz    ... delka vektoru rezidui, nz=length(z).
%          ( nepovinny nebo []: implicitne nqz=max(Npar+1,round(sqrt(nz))) )
% verbose ... monitorovani vystupnich velicin na displeji (nepovinny):
%             ~= 0 ... ano
%              = 0 ... ne  (implicitni pri vynechani nebo [])
% errc ... rizeni vypisu chyboveho hlaseni (nepovinny znakovy parametr):
%          '+' ... povoleni vypisu vysvetlujiciho chyboveho hlaseni
%                  pri vyskytu chyby (implicitni hodnota pri vynechani)
%          '-' ... potlaceni vypisu chyboveho hlaseni
%          Pouziti jakehokoli jineho retezce ma stejny efekt jako '+'.
%
% VYSTUP:
% zro  ... odhad rezidualni autokorelacni funkce (vektor nqz x 1):
%          zro(h) = cov(Z(t+h),Z(t))/var(Z(t)) pro h=1,2,...,nqz
% zrocmx...kovariancni matice (nqz x nqz) odhadnute 'zro', zejmena
%          h-ty prvek na diag(zrocmx) udava smerodatnou odchylku pro
%          zro(h).
% stat ... testova portmanteau statistika:
%          stat=n*(n+2)*sum(zro.^2./(nz-(1:nqz))) za hypotezy
%          zro(h)=0 pro h=1:nqz a pri nqz<<nz (doporuceno nqz=sqrt(nz))
%          ma 'stat' rozdeleni chi^2(idf) a muze byt uzita k testovani
%          nulovosti 'zro':
%          stat > chi2inv(1-alpha,idf) => s rizikem 'alpha' zamitame
%          hypotezu, ze 'zro' je identicky nulova, tj. 'z' neni bily sum
%          s rizikem 'alpha'.
% idf  ... pocet stupnu volnosti pro statistiku 'stat': idf=nqz-Npar.
% siglev...mezni hladina vyznamnosti pozorovane testove statistiky 'stat':
%          stat = chi2inv(1-siglev,idf).
%          Tedy alpha > siglev => hypotezu o nulovosti 'zro' zamitame.
% errc  ... navratovy kod uspesnosti:
%           = 0 ... uspesne provedeni
%           ~=0 ... neuspesne provedeni, kod chyby udava pricinu
%           1   ... chybny 'mr' nebo pocet parametru v 'par' neni p+q+P+Q
%                   nebo nqz>=nz nebo nqz<=Npar nebo chyba rozhrani MATLAB->NAG.
%           2   ... AR-parametry (MA-parametry) jsou blizko hranice oblasti
%                   kauzality (invertibility) nebo zcela mimo ni.
%           3   ... 'z' je skoro konstantni, tj. s nulovym rozptylem =>
%                   'zro' a 'stat' nejsou definovany.
%           4   ... je potreba extremni pocet iteraci k nalezeni korenu
%                   AR- nebo MA-polynomu.
%           5   ... AR polynom ma alespon jeden spolecny koren s MA polynomem,
%                   tj. 'zrocmx' nemohla byt korektne spoctena (diagonalni
%                   matice s hodnotami 1/sqrt(nz) na diagonale), ostani
%                   vystupni veliciny jsou platne.
%           6   ... 'zrocmx' je neplatna (vystup jako pri errc=5), nebot
%                   nektera hodnota na diagonale nenabyla kladne hodnoty.
%           Je-li procedura volana z programu, mel by byt vystupni kod vzdy
%           testovan, nebot nasledny vypocet by jinak byl nekorektni.

% (C) 1999, V. Vesely, Masaryk University of Brno (Czech Republic)
%
error(nargchk(3,6,nargin));
if nargin<6, errc    = []; end
if nargin<5, verbose = []; end
if nargin<4, nqz     = []; end
%
if any(mr<0), error('errc=1: invalid model range ''mr'''); end
p=mr(1); q=mr(3); P=mr(4); Q=mr(6);
errc = ~strcmp(errc,'-');
%
par = [par{1},-par{2},par{3},-par{4}];
par = reshape(par,p+q+P+Q,1);
if isempty(verbose), verbose=0; end
if isstruct(z), z = z.z; end
nz = length(z);
if isempty(nqz), nqz=max(p+q+P+Q+1,round(sqrt(nz))); end
%
[zro,zrocmx,stat,idf,siglev,ifail] = g13asf(z,mr,nqz,par,verbose,1);
clear mex;
%
if errc
   switch ifail
   case 1, error(['errc=1: invalid model range ''mr'' or number ',...
                  'of parameters in ''par'' or ''nqz''']);
   case 2, error('errc=2: parameters violate causality or invertibility');
   case 3,
     error('errc=3: residual series ''z'' exhibits nearly constant behaviour');
   case 4, error('errc=4: root evaluation of AR or MA polynomials failed');
   case 5, disp([char(7),char(7),'??? Warning using ==> nagcheck']);
           disp('errc=5: AR and MA polynomials have common roots');
   case 6, disp([char(7),char(7),'??? Warning using ==> nagcheck']);
           disp('errc=6: evaluation of covariance matrix ''zrocmx'' failed');
   otherwise
     if ifail~=0
        error(['errc=',num2str(ifail),': unidentified error code']);
     end
   end
end
errc = ifail;
