******************************************** * * nnqns.f * * Subroutines: * 1.- INITPDF: Initialization * 2.- NNQNS: Average and error of the NS pdf at a given x * 3.- NNPDF: Outputs the NS pdf out of a individual net * ******************************************** ************************************************************* * * Subroutine INITPDF(IPT,IALPHA) * Initializes the selected set of NS pdfs: * IPT=0 -> LO, alphas=0.130 * IPT=1 -> NLO * IALPHA=0 -> alphas=0.116 * IALPHA=0 -> alphas=0.118 * IALPHA=0 -> alphas=0.120 * IPT=2 -> NNLO, alphas=0.115 * Note that for IPT=0,2 the value of IALPHA is not used * ************************************************************* subroutine initpdf(ipt,ialpha) implicit none integer mxpar,kk,nrep,i,tnl,n,mxl,npar integer ialpha,ipt parameter(mxpar=100,nrep=1000,mxl=5) dimension n(mxl) double precision partr(mxpar,nrep) double precision xnor(4),mq,nq common/netarch/xnor,n,tnl common/qnsfit/mq,nq common/parc/partr,npar * Select perturbative order and value of alphas if(IPT.eq.0) then open(unit=10,status="old", 1 file="nnqns_lo.weights") write(6,*) "Initialization: LO nonsinglet pdf" write(6,*) "Q02=2 GeV2, alphas(Mz)=0.130" elseif(IPT.eq.1.and.IALPHA.eq.0) then open(unit=10,status="old", 1 file="nnqns_nlo_as_116.weights") write(6,*) "Initialization: NLO nonsinglet pdf" write(6,*) "Q02=2 GeV2, alphas(Mz)=0.116" elseif(IPT.eq.1.and.IALPHA.eq.1) then open(unit=10,status="old", 1 file="nnqns_nlo_as_118.weights") write(6,*) "Initialization: NLO nonsinglet pdf" write(6,*) "Q02=2 GeV2, alphas(Mz)=0.118" elseif(IPT.eq.1.and.IALPHA.eq.2) then open(unit=10,status="old", 1 file="nnqns_nlo_as_120.weights") write(6,*) "Initialization: NLO nonsinglet pdf" write(6,*) "Q02=2 GeV2, alphas(Mz)=0.120" elseif(IPT.eq.2) then open(unit=10,status="old", 1 file="nnqns_nnlo.weights") write(6,*) "Initialization: NNLO nonsinglet pdf" write(6,*) "Q02=2 GeV2, alphas(Mz)=0.115" else write(6,*) "Unknown options" stop endif * Read neural network parameters read(10,*) tnl read(10,*) (n(i),i=1,tnl) read(10,*) xnor(1),xnor(2) read(10,*) xnor(3),xnor(4) read(10,*) mq,nq do kk=1,nrep read(10,*) npar do i=1,npar read(10,*) partr(i,kk) enddo enddo close(10) return end ************************************************** ************************************************************* * * Subroutine NNQNS(X,QNSAV,QNSER) * Gives the average and the associated uncertainty for * the NS combination of parton distributions * (see Eq. (2.3) in the paper) at a given value of x * X: Value of x * QNSAV: Average value of the NS pdf * QNSER: Error in the NS pdf * Note that this subroutine outputs the parton density * qNS(x), not the parton momentum fraction xqNS(x) * ************************************************************* subroutine nnqns(x,qnsav,qnser) implicit none integer k,nrep,mxpar,i,npar parameter(nrep=1000,mxpar=100) double precision sum,sum2,pdf,qnsav,qnser,x double precision partr(mxpar,nrep),par(mxpar) common/parc/partr,npar sum=0 sum2=0 do k=1,nrep do i=1,npar par(i)=partr(i,k) enddo call NNPDF(x,par,pdf) sum=sum+pdf sum2=sum2+pdf**2 enddo qnsav=sum/nrep qnser=dsqrt(sum2/nrep-qnsav**2) return end ************************************************ subroutine NNPDF(x,par,pdf) implicit none double precision w,xnnin,xnnout,xnn integer n,tnl,mxp,mxn,mxl,l,i,j,ipar parameter(mxp=600,mxn=10,mxl=5) dimension n(mxl),w(mxn,mxn,mxl) dimension xnnin(mxn,mxp),xnnout(mxp) dimension xnn(mxn,mxl,mxp) double precision x,pdf,par dimension par(*) double precision xnor,mq,nq,pdfout dimension xnor(4) common/netarch/xnor,n,tnl common/qnsfit/mq,nq ipar=0 do l=2,tnl do i=1,n(l) do j=1,n(l-1)+1 ipar=ipar+1 w(i,j,l)=par(ipar) enddo enddo enddo xnnin(1,1)=(x-xnor(1))/(xnor(2)-xnor(1))*0.8d0+0.1d0 xnnin(2,1)=(dlog(x/xnor(1))/dlog(xnor(2)/xnor(1)))*0.8d0+0.1d0 call NNOUT(1,xnnin,tnl,n,w,xnn,xnnout) pdfout=xnor(3)+(xnor(4)-xnor(3))*(xnnout(1)-0.1d0)/0.8d0 pdf=(1-x)**mq*pdfout/x**nq return end ******************************************************* subroutine NNOUT(npat,xnnin,tnl,n,w,xnn,xnnout) implicit none integer tnl,mxp,mxn,mxred,mxl,n,mu,npat,l,i,ii parameter(mxp=600,mxn=10,mxl=5,mxred=4) double precision w,xnnin,xnnout,xnn,G,h dimension n(mxl),w(mxn,mxn,mxl) dimension xnnin(mxn,mxp),xnnout(mxp) dimension xnn(mxn,mxl,mxp) do mu=1,npat do ii=1,n(1) xnn(ii,1,mu)=xnnin(ii,mu) enddo do l=1,tnl-1 xnn(n(l)+1,l,mu)=1d0 enddo enddo do mu=1,npat do l=2,tnl-1 do i=1,n(l) call CALCULAH(n,w,xnn,h,i,l,mu) xnn(i,l,mu)=G(h) enddo enddo do i=1,n(tnl) call CALCULAH(n,w,xnn,h,i,tnl,mu) xnn(i,tnl,mu)=h enddo enddo do mu=1,npat xnnout(mu)=xnn(1,tnl,mu) enddo return end subroutine CALCULAH(n,w,xnn,h,i,l,mupat) c Calculate h-function implicit none integer mxp,mxn,mxl,n,j,i,l,mupat double precision w,xnn,h parameter(mxp=600,mxn=10,mxl=5) dimension n(mxl),w(mxn,mxn,mxl),xnn(mxn,mxl,mxp) h=0. do j=1,n(l-1)+1 h=h+w(i,j,l)*xnn(j,l-1,mupat) enddo return end function g(x) c Neural network activation function implicit none double precision g,x g=1./(1.+DExp(-x)) end **************************