view main/system-identification/devel/tisean/source_f/xc2.f @ 9894:82ff20b4d849 octave-forge

system-identitifaction: Adding devel TISEAN files
author jpicarbajal
date Wed, 28 Mar 2012 13:32:37 +0000
parents
children
line wrap: on
line source

c===========================================================================
c
c   This file is part of TISEAN
c 
c   Copyright (c) 1998-2007 Rainer Hegger, Holger Kantz, Thomas Schreiber
c 
c   TISEAN is free software; you can redistribute it and/or modify
c   it under the terms of the GNU General Public License as published by
c   the Free Software Foundation; either version 2 of the License, or
c   (at your option) any later version.
c
c   TISEAN is distributed in the hope that it will be useful,
c   but WITHOUT ANY WARRANTY; without even the implied warranty of
c   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
c   GNU General Public License for more details.
c
c   You should have received a copy of the GNU General Public License
c   along with TISEAN; if not, write to the Free Software
c   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
c
c=========================================================================
c
c   cross-correlation integral xc2
c   see  H. Kantz, Phys.Rev.E49, 5091 (1994)
c
c   authors: T. Schreiber & H. Kantz (1998)
c   multivariate version: H. Kantz (Jan 2007)
c
c=========================================================================
c
      parameter(nx=1000000,me=30,meps=1000,mx=10)
      dimension x(nx,mx), c(me,meps), eps(meps), mdeps(meps), icol(mx)
      dimension y(nx,mx)
      integer mlist(2)
      character*72 file1, file2, fout
      data ipmin/1000/, res/2./, eps0/1e-30/, epsm/1e30/, id0/1/
      data iverb/1/

c=======================================================================
c assume two input files (file1, file2) 
c - with identical structure in terms of colums
c - with identical embedding spaces 
c - with individual length and exclusions: l, L, x, X
c - multivariate data: maximum length nx, maximum dimension mx
c
c   norm: max-norm 
c
c   no rescaling, since xc2 does not make sense if datasets are 
c                           not used in their original scalings
c=================================================================

      call whatido("cross correlation sum of two data sets",iverb)
      id=ican("d",id0)
      mmax=2
      mdim=1

      call imcan("M",2,mc,mlist)
      if (mc.ge.2) then
       mmax=mlist(2)
       mdim=mlist(1)
       if (mmax*mdim.lt.2) stop 'Increase embedding dimension'
       if (mc.gt.2) print*, 'extra arguments of -m ignored'
      endif

      ntmin=0
      ncmin=ican("n",1000)
      ipmin=ican("N",ipmin)
      res=fcan("#",res)
      feps=2**(1./res)
      eps0=fcan("r",eps0)
      epsm=fcan("R",epsm)
      nmaxx=ican("l",nx)
      nmaxy=ican("L",nx)
      nexcl1=ican("x",0)
      nexcl2=ican("X",0)

      call columns(mc,mx,icol)

      if (mc.gt.0.and.mc.ne.mdim) stop 'improper number of columns'
      isout=igetout(fout,0)
      if(fout.eq." ") isout=1

      call nthstring(1,file1)
      if(file1.eq."-") stop "first input file name missing"
      call xreadfile(nmaxx,mdim,nx,x,nexcl1,icol,file1,iverb)
      call nthstring(2,file2)
      if(file2.eq."-") stop "second input file name missing"
      call xreadfile(nmaxy,mdim,nx,y,nexcl2,icol,file2,iverb)

      if(isout.eq.1) then 
        call addsuff(fout,file1,"_")
        call addsuff(fout,fout,file2)
        call addsuff(fout,fout,"_xc2")
      endif

      epsmax=0.
      do imx=1,mmax
       call minmax(nmaxx,x(1,imx),xmin,xmax)
       epsmax=1.001*max(xmax-xmin,epsmax)
      enddo
      do imx=1,mmax
       call minmax(nmaxy,y(1,imx),xmin,xmax)
       epsmax=1.001*max(xmax-xmin,epsmax)
      enddo

      neps=0

      do 10 epsl=log(min(epsm,epsmax)),log(eps0),-log(feps)
         neps=neps+1
         if(neps.gt.meps) stop "xc2: make meps larger"
         eps(neps)=exp(epsl)
         do 20 m=1,mmax*mdim
 20         c(m,neps)=0
         if (mdim.eq.1) then
          call crosscor(nmaxx,x,nmaxy,y,eps(neps)
     .                 ,id,mmax,c(1,neps),ncmin,ipmin)
         else
          call mcrosscor(nmaxx,x,nmaxy,y,eps(neps),
     .      id,mmax,mdim,c(1,neps),ncmin,ipmin)
         endif
         mdd=mmax*mdim
         mdd1=max(2,mdim)
         do 30 m=mdd1,mdd
 30         if(c(m,neps).eq.0.) goto 1
         m=mdd+1
 1       mdd=m-1
         if(mdd.eq.mdim-1) stop
         mdeps(neps)=mdd
         call outfile(fout,iunit,iverb)
         do 40 m=mdd1,mdeps(1)
            write(iunit,'(4h#m= ,i5)') m
            do 50 nn=1,neps
               if(mdeps(nn).lt.m) goto 2
 50            write(iunit,*) eps(nn), c(m,nn) 
 2          write(iunit,'()')
 40         write(iunit,'()')
         close(iunit)
 10      write(istderr(),*) eps(neps), mdd, c(mdd,neps)
      stop
      end
c>--------------------------------------------------------------------
      subroutine usage()
c usage message

      call whatineed(
     .   "-M#,# [-d# -n# -N# -## -r# -R#"//
     .   " -o outfile -l# -x# -L# -X# -c#[,#] -V# -h] file1 file2")
      call popt("M",
     ."# of components, maximal embedding dimension [1,2]")
      call popt("d","delay [1]")
      call popt("n","minimal number of center points [1000]")
      call popt("N","maximal number of pairs [1000]")
      call popt("#","resolution, values per octave [2]")
      call popt("r",
     .   "minimal scale to be probed (as long as pairs found)")
      call popt("R","maximal scale to be probed [xmax-xmin]")
      call popt("l","length of time series 1 to be read [all data]")
      call popt("x","# of initial lines of 1 to be skipped [0]")
      call popt("L","length of time series 2 to be read [all data]")
      call popt("X","# of initial lines of 2 to be skipped [0]")
      call popt("c",
     ."columns to be read [1,2,3,.., # of components]")
      call pout("file1_file2_xc2")
      call pall()
      stop
      end
c>--------------------------------------------------------------------
      subroutine crosscor(nmaxx,x,nmaxy,y,eps,id,m,c,ncmin,ipmin)
      parameter(im=100,ii=100000000,nx=1000000,mm=30)
      dimension y(nmaxy),x(nmaxx)
      dimension jh(0:im*im),ipairs(mm),c(m),jpntr(nx),nlist(nx)

      if(nmaxx.gt.nx.or.m.gt.mm) stop "crosscor: make mm/nx larger."
      if(nmaxy.gt.nx.or.m.gt.mm) stop "crosscor: make mm/nx larger."

      do 10 i=1,m-1
 10      ipairs(i)=0
      mb=min(m,2)
      call base(nmaxx,x,id,mb,jh,jpntr,eps)
      do 20 n=(m-1)*id+1,nmaxy
         call neigh(nx,y,x,n,nmaxx,id,mb,jh,jpntr,eps,nlist,nfound)
         do 30 nn=1,nfound                   ! all neighbours in two dimensions
            np=nlist(nn)
            if(np.lt.(m-1)*id+1) goto 30
            ipairs(1)=ipairs(1)+1
            do 40 i=mb,m-1
               if(abs(y(n-i*id)-x(np-i*id)).ge.eps) goto 30
 40            ipairs(i)=ipairs(i)+1            ! neighbours in 3..m dimensions
 30         continue
 20      if(n-(m-1)*id.ge.ncmin.and.ipairs(m-1).ge.ipmin) goto 1
      n=n-1
 1    s=real(n-(m-1)*id)*real(nmaxx-(m-1)*id) ! normalisation
      do 50 i=1,m-1
 50      if(s.gt.0.) c(i+1)=ipairs(i)/s
      end
c>--------------------------------------------------------------------
      subroutine mcrosscor(nmaxx,x,nmaxy,y,eps,id,m,mdim,c,ncmin,ipmin)

      parameter(im=100,nx=1000000,mm=30,mx=10)

      dimension y(nx,mx),x(nx,mx)
      dimension jh(0:im*im),ipairs(mm),c(m*mdim),jpntr(nx),nlist(nx)
      dimension vx(mm)

      if(nmaxx.gt.nx.or.m.gt.mm) stop "mcrosscor: make mm/nx larger."
      if(nmaxy.gt.nx.or.m.gt.mm) stop "mcrosscor: make mm/nx larger."

      if (m*mdim.gt.mm) stop 'embedding x spatial dimension < 30 !'
      do 10 i=1,m*mdim
 10      ipairs(i)=0

      call mbase(nmaxy,mdim,nx,y,id,1,jh,jpntr,eps)
      do 20 n=(m-1)*id+1,nmaxx
         do ii=1,mdim
          vx(ii)=x(n,ii)
         enddo
         call mneigh2(nmaxy,mdim,y,nx,vx,jh,jpntr,eps,nlist,nfound)
         do 30 nn=1,nfound               ! all neighbours in mdim dimensions
            np=nlist(nn)
            if(np.lt.(m-1)*id+1) goto 30
            ipairs(mdim)=ipairs(mdim)+1
            do 40 i=1,m-1
             do 41 iim=1,mdim
               if(abs(x(n-i*id,iim)-y(np-i*id,iim)).ge.eps) goto 30
               idim=i*mdim+iim
               ipairs(idim)=ipairs(idim)+1  ! neighbours mdim+1..m dimensions
 41           continue
 40          continue
 30         continue
 20      if(n-(m-1)*id.ge.ncmin.and.ipairs(m*mdim).ge.ipmin) goto 1
      n=n-1
 1    s=real(n-(m-1)*id)*real(nmaxy-(m-1)*id) ! normalisation
      do 50 i=mdim,mdim*m
 50      if(s.gt.0.) c(i)=ipairs(i)/s

      return
      end
c>---------------------------------------------------------------------