Mac binaries
[jabaws.git] / website / archive / binaries / mac / src / disembl / Tisean_3.0.1 / source_f / randomize / cost / spikespec.f
diff --git a/website/archive/binaries/mac/src/disembl/Tisean_3.0.1/source_f/randomize/cost/spikespec.f b/website/archive/binaries/mac/src/disembl/Tisean_3.0.1/source_f/randomize/cost/spikespec.f
new file mode 100644 (file)
index 0000000..26cd874
--- /dev/null
@@ -0,0 +1,251 @@
+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   part of the TISEAN randomize package for constraint surrogates
+c   cost function
+c   spike train power spectrum
+c   author T. Schreiber (1999)
+c
+c-------------------------------------------------------------------
+c get cost function specific options
+c
+      subroutine opts_cost(ncol)
+      parameter(mfreq=100000)
+      dimension sp0r(mfreq), sp0i(mfreq), spr(mfreq), spi(mfreq),
+     .   sp0(mfreq), sp(mfreq)
+      common /costcom/ nfreq, fmax, inter,
+     .    sp0r, sp0i, sp0, spr, spi, sp, sd, sc, iweight
+
+      iweight=ican('W',0)
+      fmax=fcan("F",0)
+      nfreq=ican("#",0)
+      inter=lopt("i",1)
+      ncol=1
+      end
+
+c-------------------------------------------------------------------
+c print version information on cost function
+c
+      subroutine what_cost()
+      call ptext("Cost function: spike train power spectrum")
+      end
+
+c-------------------------------------------------------------------
+c print cost function specific usage message
+c
+      subroutine usage_cost()
+      call ptext("Cost function options: [-F# -## -w# -i]")
+      call popt("W",
+     .   "average: 0=max(s) 1=|s|/f 2=(s/f)**2 3=|s| (0)")
+      call popt("F","maximal frequency (2*l / total time)")
+      call popt("#","number of frequencies (F* total time /2)")
+      call popt("w","frequency resolution (0)")
+      call popt("i","expect intervals rather than times")
+      end
+
+c-------------------------------------------------------------------
+c initialise all that is needed for cost function
+c
+      subroutine cost_init()
+      parameter(nx=100000,mfreq=100000)
+      dimension sp0r(mfreq), sp0i(mfreq), spr(mfreq), spi(mfreq),
+     .   sp0(mfreq), sp(mfreq)
+      common /costcom/ nfreq, fmax, inter,
+     .    sp0r, sp0i, sp0, spr, spi, sp, sd, sc, iweight
+      dimension x(nx)
+      common nmax,cost,temp,cmin,rate,x
+
+      if(fmax.le.0.) fmax=2*nmax/(x(nmax)-x(1))
+      if(nfreq.le.0) nfreq=fmax*(x(nmax)-x(1))/2
+      if(nfreq.gt.mfreq) write(istderr(),'(a)') 
+     .   "truncated to ", mfreq," frequencies"
+      nfreq=min(mfreq,nfreq)
+      write(istderr(),*) "randomize_spikespec: total time covered: ", 
+     .   x(nmax)-x(1)
+      write(istderr(),*) "randomize_spikespec: computing ", nfreq, 
+     .   " frequencies up to ", fmax
+      call sspect(nfreq,fmax/nfreq,sp0r,sp0i,sp0)
+      end
+
+c-------------------------------------------------------------------
+c initial transformation on time series and its inverse
+c
+      subroutine cost_transform(nmax,mcmax,nxdum,x)
+      parameter(mfreq=100000,nx=100000)
+      dimension sp0r(mfreq), sp0i(mfreq), spr(mfreq), spi(mfreq),
+     .   sp0(mfreq), sp(mfreq)
+      common /costcom/ nfreq, fmax, inter,
+     .    sp0r, sp0i, sp0, spr, spi, sp, sd, sc, iweight
+      dimension x(nx), lx(nx)
+
+      if(inter.eq.0) goto 1
+      do 10 n=2,nmax
+ 10      x(n)=x(n)+x(n-1)
+ 1    call sort(nmax,x,lx)
+      end
+
+      subroutine cost_inverse(nmax,mcmax,nxdum,x,y)
+      parameter(mfreq=100000)
+      dimension sp0r(mfreq), sp0i(mfreq), spr(mfreq), spi(mfreq),
+     .   sp0(mfreq), sp(mfreq)
+      common /costcom/ nfreq, fmax, inter,
+     .    sp0r, sp0i, sp0, spr, spi, sp, sd, sc, iweight
+      dimension x(nmax), y(nmax)
+      
+      do 10 n=1,nmax
+ 10      y(n)=x(n)
+      if(inter.ne.1) return
+      do 20 n=nmax,2,-1
+ 20      y(n)=y(n)-y(n-1)
+      end
+
+c-------------------------------------------------------------------
+c compute full cost function from scratch
+c
+      subroutine cost_full(iv)
+      parameter(mfreq=100000)
+      dimension sp0r(mfreq), sp0i(mfreq), spr(mfreq), spi(mfreq),
+     .   sp0(mfreq), sp(mfreq)
+      common /costcom/ nfreq, fmax, inter,
+     .    sp0r, sp0i, sp0, spr, spi, sp, sd, sc, iweight
+      common nmax,cost
+
+      call sspect(nfreq,fmax/nfreq,spr,spi,sp)
+
+      cc=0
+      do 10 i=1,nfreq
+ 10      call aver(cc,sp(i)-sp0(i),i)
+      cost=cc
+      if(iv.ne.0) call dump()
+      end
+
+c-------------------------------------------------------------------
+c compute changed cost function on exchange of n1 and n2 
+c
+      subroutine cost_update(n1,n2,cmax,iaccept,iv)
+      parameter(mfreq=100000,nx=100000)
+      dimension sp0r(mfreq), sp0i(mfreq), spr(mfreq), spi(mfreq),
+     .   sp0(mfreq), sp(mfreq)
+      common /costcom/ nfreq, fmax, inter,
+     .    sp0r, sp0i, sp0, spr, spi, sp, sd, sc, iweight
+      dimension sprcop(mfreq), spicop(mfreq), spcop(mfreq), x(nx)
+      common nmax,cost,temp,cmin,rate,x
+      data pi/3.1415926/
+
+      comp=0
+      iaccept=0
+      do 10 i=1,nfreq
+         f=i*(fmax/nfreq)
+         omega=2*pi*f
+         xx=x(n1-1)+x(n1+1)-x(n1)
+         sprcop(i)=spr(i)-cos(omega*x(n1))+cos(omega*xx)
+         spicop(i)=spi(i)-sin(omega*x(n1))+sin(omega*xx)
+         spcop(i)=sprcop(i)**2+spicop(i)**2
+         call aver(comp,sp0(i)-spcop(i),i)
+ 10      if(comp.ge.cmax) return
+      cost=comp  ! if got here: accept
+      iaccept=1
+      call exch(n1,n2)
+      if(iv.ne.0) call panic(spcop)
+      do 20 i=1,nfreq
+         spr(i)=sprcop(i)
+         spi(i)=spicop(i)
+ 20      sp(i)=spcop(i)
+      end
+
+c-------------------------------------------------------------------
+c compute spectrum from scratch
+c
+      subroutine sspect(nfreq,fres,spr,spi,sp)
+      parameter(nx=100000)
+      dimension spr(*), spi(*), sp(*), x(nx)
+      common nmax,cost,temp,cmin,rate,x
+      data pi/3.1415926/
+
+      do 10 i=1,nfreq
+         f=i*fres
+         omega=2*pi*f
+         sr=0
+         si=0
+         do 20 n=1,nmax
+            sr=sr+cos(omega*x(n))
+ 20         si=si+sin(omega*x(n))
+         spr(i)=sr
+         spi(i)=si
+ 10      sp(i)=sr**2+si**2
+      end
+
+c-------------------------------------------------------------------
+c weighted average of autocorrelation 
+c
+      subroutine aver(cav,dc,n)
+      parameter(mfreq=100000)
+      dimension sp0r(mfreq), sp0i(mfreq), spr(mfreq), spi(mfreq),
+     .   sp0(mfreq), sp(mfreq)
+      common /costcom/ nfreq, fmax, inter,
+     .    sp0r, sp0i, sp0, spr, spi, sp, sd, sc, iweight
+
+      if(iweight.eq.0) then
+         cav=max(cav,abs(dc))    ! max (L-infinity) norm
+      else if(iweight.eq.1) then
+         cav=cav+abs(dc)/n       ! L-1 norm (sum of moduli), weighted by freq.
+      else if(iweight.eq.2) then
+         cav=cav+(dc/n)**2       ! L-2 norm (sum of squares), weighted by freq.
+      else if(iweight.eq.2) then
+         cav=cav+abs(dc)         ! L-1 norm (sum of moduli)
+      endif
+      end
+
+c-------------------------------------------------------------------
+c diagnostic output
+c
+      subroutine dump()
+      parameter(mfreq=100000)
+      dimension sp0r(mfreq), sp0i(mfreq), spr(mfreq), spi(mfreq),
+     .   sp0(mfreq), sp(mfreq)
+      common /costcom/ nfreq, fmax, inter,
+     .    sp0r, sp0i, sp0, spr, spi, sp, sd, sc, iweight
+      common nmax
+
+      write(istderr(),'(5hgoal ,4f9.3)') (sp0(n),n=1,min(4,nfreq))
+      write(istderr(),'(5his   ,4f9.3)') (sp(n),n=1,min(4,nfreq))
+      write(istderr(),'(5hmiss ,4f9.3)') 
+     .   ((sp0(n)-sp(n)),n=1,min(4,nfreq))
+      write(istderr(),'()')
+      end
+
+      subroutine panic(spcop)
+      parameter(mfreq=100000)
+      dimension spcop(*)
+      dimension sp0r(mfreq), sp0i(mfreq), spr(mfreq), spi(mfreq),
+     .   sp0(mfreq), sp(mfreq)
+      common /costcom/ nfreq, fmax, inter,
+     .    sp0r, sp0i, sp0, spr, spi, sp, sd, sc, iweight
+      common nmax
+
+      call cost_full(0)
+      write(istderr(),'(7hupdate ,4f9.3)') 
+     .   (spcop(n),n=1,min(4,nfreq))
+      write(istderr(),'(7hfresh  ,4f9.3)') (sp(n),n=1,min(4,nfreq))
+      write(istderr(),'(7hdiscr  ,4f9.3)') 
+     .   ((spcop(n)-sp(n)),n=1,min(4,nfreq))
+      write(istderr(),'()')
+      end