Maximum likelihood parameters optimization program for CSA added without examples.
[unres.git] / source / maxlik / src_CSA / maxlik-opt-tmscore.f
diff --git a/source/maxlik/src_CSA/maxlik-opt-tmscore.f b/source/maxlik/src_CSA/maxlik-opt-tmscore.f
new file mode 100644 (file)
index 0000000..cbcbcc7
--- /dev/null
@@ -0,0 +1,200 @@
+      implicit none
+      include "DIMENSIONS"
+      include "COMMON.CALC"
+      integer i,j,k,l,ii,nf,n,uiparm(1)
+      double precision x(maxene)
+      double precision rmsave(maxT),fdum,rjunk
+      external fdum,funclik
+      double precision quot,quotl,f,T0 /300.0d0/
+      character*8 ename(maxene)
+      common /names/ ename
+c      print *,"start"
+      read(1,*) nene,sigma2,temper(1)
+      nT = 1
+      write (2,*) "nene",nene," nT",nT," sigma",sigma2
+      read(1,*) (ename(i),i=1,nene)
+      read(1,*) (weight(i),i=1,nene)
+c      read(1,*) (iweight(i),i=1,nene)
+      read(1,*) (mask(i),i=1,nene)
+c      read(1,*) (temper(i),i=1,nT)
+      i=0
+      do 
+c        print *,"i=",i
+        read(1,*,end=10,err=10) ii,(enetb(j,i+1),j=1,nene),ener0(i+1),
+     &                          rmstab(i+1),rjunk,rjunk,rjunk,qtab(i+1)
+        i=i+1
+      enddo
+   10 continue
+       nconf=i
+       do i=1,nconf
+         entfac(i)=0.0d0
+       enddo
+       write (2,*) "nconf",nconf
+       write (2,'(i5,2x,a4,f10.5,2i5)') 
+     &   (i,ename(i),weight(i),iweight(i),mask(i),i=1,nene)
+      sigma2=sigma2*sigma2
+c Transfer weights to variables
+      call w2x(n,x)
+      call funclik(n,x,nf,f,uiparm,rmsave,fdum)
+      do i=1,nconf
+        write (2,'(i5,2e15.5)') i,ener0(i),ener(i)
+      enddo
+      write (2,*) "rmsave",(rmsave(i),i=1,nT),"f",f
+      call minsumsl(n,x,f)
+      write (2,*) "n",n," x",(x(i),i=1,n)
+       write (2,'(i5,2x,a4,f10.5,i5)') 
+     &   (j,ename(j),weight(j),iweight(j),j=1,nene)
+      write (2,*) "f",f
+      call funclik(n,x,nf,f,uiparm,rmsave,fdum)
+      write (2,*) "rmsave",(rmsave(i),i=1,nT),"f",f
+
+c      do i=10,30
+c      do k=10,30
+c      weight(6)=0.1d0*i
+c      weight(1)=0.1d0*k
+c       write (2,'(i5,2x,a4,f10.5,i5)') 
+c     &   (j,ename(j),weight(j),iweight(j),j=1,nene)
+c      call funclik(nene,weight,nf,f,uiparm,rmsave,fdum)
+c      write (2,*) "f",f
+c      enddo
+c      enddo
+      stop
+      end
+c-------------------------------------------------------------------------------
+      subroutine funclik(n,x,nf,f,uiparm,rmsave,ufparm) 
+      implicit none
+      include "DIMENSIONS"
+      include "COMMON.CALC"
+      character*8 ename(maxene)
+      common /names/ ename
+      integer n,nf
+      double precision f
+      double precision x(n)
+      integer uiparm
+      double precision ufparm
+      external ufparm
+      double precision ww(maxene),sumlik(maxT),rmsave(maxT)
+      integer it,i,j
+      double precision beta,over,boltz,sumQ,emin,ee,
+     &   sumover
+      call x2w(n,x)
+      f=0.0d0
+      do iT=1,nT
+        do i=1,nene
+          ww(i)=weight(i)
+        enddo
+        write (2,*) "iT",iT," temper",temper(iT)," beta",beta
+        write (2,'(i5,2x,a4,2f10.5,i5)') 
+c        write (2,'(i5,2x,a4,2f10.5,i5,f10.5)') 
+c     &   (i,ename(i),weight(i),ww(i),iweight(i),ft(iweight(i),iT),
+     &   (i,ename(i),weight(i),ww(i),iweight(i),
+     &    i=21,20+n)
+        beta=1.0d0/(temper(iT)*1.987D-3)
+c        write (2,*) "beta",beta
+        emin=1.0d10
+        do i=1,nconf
+          ener(i)=0.0d0
+          do j=1,nene
+            ener(i)=ener(i)+ww(j)*enetb(j,i)
+          enddo
+          ee = ener(i)-entfac(i)/beta
+          if (ee.lt.emin) emin=ee
+        enddo
+        rmsave(it)=0.0d0
+        sumlik(it)=0.0d0
+        sumQ=0.0d0
+        sumover=0.0d0
+        do i=1,nconf
+crms          over=dexp(-0.5d0*rmstab(i)**2/sigma2)
+          over=dexp(-0.5d0*(1-qtab(i))**2/sigma2)
+c          if (temper(iT).gt.340.0d0) over=1.0d0-over
+          sumover=sumover+over
+          boltz=-beta*(ener(i)-emin)+entfac(i)
+c          write (2,*) i,ener(i),entfac(i),rmstab(i),over,boltz,
+c     &      dexp(boltz)
+          sumQ=sumQ+dexp(boltz)
+crms          rmsave(iT)=rmsave(iT)+rmstab(i)*dexp(boltz)
+          rmsave(iT)=rmsave(iT)+(1-qtab(i))*dexp(boltz)
+          sumlik(iT)=sumlik(iT)+over*boltz 
+        enddo
+        sumlik(it)=sumlik(iT)-dlog(sumQ)*sumover
+        rmsave(iT)=rmsave(iT)/sumQ
+        write (2,*) iT,temper(iT),rmsave(iT),sumlik(iT),sumQ,sumover
+c        write (2,*) iT,temper(iT),rmsave(iT),sumlik(iT),sumQ,sumover
+        f=f-sumlik(iT)
+      enddo
+      return
+      end
+c-------------------------------------------------------------------------------
+      subroutine grad(n,x,nf,g,uiparm,urparm,ufparm)
+      implicit none
+      integer n,nf,uiparm(1)
+      double precision x(n),g(n),urparm(1),ufparm
+      external ufparm
+      integer i
+      double precision xi,fplus,fminus,delta/1.0d-9/,delta2/2.0d-9/
+      do i=1,n
+        xi=x(i) 
+        x(i)=xi+delta
+        call funclik(n,x,nf,fplus,uiparm,urparm,ufparm)
+        x(i)=xi-delta
+        call funclik(n,x,nf,fminus,uiparm,urparm,ufparm)
+        g(i)=(fplus-fminus)/delta2 
+c        write(2,*) i,fplus,fminus,g(i)
+      enddo
+      return
+      end
+c-------------------------------------------------------------------------------
+      double precision function fdum()
+      fdum=0.0d0
+      return
+      end
+c-------------------------------------------------------------------------------
+      logical function stopx(idum)
+      integer idum
+      stopx=.false.
+      return
+      end
+c-------------------------------------------------------------------------------
+      subroutine x2w(n,x)
+      include "DIMENSIONS"
+      include "COMMON.CALC"
+      integer n,i,ii
+      double precision x(n)
+      double precision fabs
+      ii=0
+      do i=1,nene
+        if (mask(i).gt.0) then
+          ii=ii+1
+          weight(i)=fabs(x(ii))
+        endif
+      enddo
+      return
+      end
+c-------------------------------------------------------------------------------
+      subroutine w2x(n,x)
+      include "DIMENSIONS"
+      include "COMMON.CALC"
+      integer n,i,ii
+      double precision x(maxene)
+      ii=0
+      do i=1,nene
+        if (mask(i).gt.0) then
+          ii=ii+1
+          x(ii)=weight(i)
+        endif
+      enddo
+      n=ii
+      return
+      end
+c-------------------------------------------------------------------------------
+      double precision function fabs(x)
+      double precision x
+      double precision a /100.0d0/
+      if (dabs(x).gt.1.0d-4) then
+        fabs = dabs(x)
+      else
+        fabs = dlog(dexp(a*x)+dexp(-a*x))/a
+      endif
+      return
+      end