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