function [TH,st]=search(z,th,g,lim,display)
%SEARCH   Searches for a lower value of the criterion function
%
%	[TH,ST] = search(Z,TH,G,LIM)
%
%	TH : New parameter giving a lower value of the criterion
%	ST=1 : No lower value of the criterion could be found.
%
%	The routine evaluates the prediction error criterion at values
%	along the G-direction, starting at TH. It is primarily intended
%	as a subroutine to MINCRIT. See PEM for an explanation of the
%	arguments.

%	L. Ljung 10-1-86,9-25-93
%	Copyright (c) 1986-95 by the MathWorks, Inc.
%	$Revision: 1.4 $  $Date: 1995/05/11 14:07:19 $

% *** Set up the model orders ***

th1=th;nu=th(1,3);
Nb=sum(th(1,4:4+nu)); nc=th(1,5+nu); Nd=sum(th(1,4:6+nu));
nf=th(1,7+nu:6+2*nu);
n=sum(th(1,4:6+2*nu));
l=0;,k=1;,V=th(1,1);,V1=V+1;st=0;

% *** Looping, attempting to find a lower value of V along
%     the G-direction ***

while [V1 > V l<10],
   th(3,1:n)=th1(3,1:n)+k*g.';mc=0;
   if nc>0,c=fstab([1 th(3,Nb+1:Nb+nc)]); th(3,Nb+1:Nb+nc)=c(2:nc+1);
   	else c=1;end
   s=Nd;
   for ku=1:nu, 
      if nf(ku)>0,  f=fstab([1 th(3,s+1:s+nf(ku))]);
      th(3,s+1:s+nf(ku))=f(2:1+nf(ku));end
        s=s+nf(ku);
   end
   
      e=pe(z,th);
      [me,ne]=size(e);
      ll=lim*ones(me,ne);,
      if lim==0,el=e;else la=abs(e)+eps*ll;el=e.*(min(la,ll)./la);end

%el=min(e,ll);,el=max(el,-ll);
      V1=real(e'*el/length(e));
   
   if display  % Give status information to the screen
      %home
      disp(int2str(l))
   end
   k=k/2; if l==8,k=0;end
   l=l+1; if l==10, st=1;end
end

TH=th;,TH(1,1)=V1;if length(e)>1, TH(2,1)=e'*e/length(e);end
