--- /dev/null
+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