#include "PHASIC++/Channels/Vegas.H" #include #include "ATOOLS/Math/MathTools.H" #include #include #include "ATOOLS/Org/Run_Parameter.H" #include "ATOOLS/Org/MyStrStream.H" #include "ATOOLS/Org/Exception.H" #include "ATOOLS/Org/My_File.H" #include "ATOOLS/Org/My_MPI.H" #include "ATOOLS/Org/Scoped_Settings.H" using namespace ATOOLS; using namespace PHASIC; using namespace std; int Vegas::s_onext=-1, Vegas::s_on=-1; Vegas::Vegas(int dim,int ndx,const std::string & name,int opt) { if (s_on<0) { s_on = Settings::GetMainSettings()["VEGAS_MODE"].SetDefault(2).Get(); } m_on=s_on?1:0; if (s_onext>-1) m_on=s_onext; m_dim = dim; m_nopt = 0; m_nevt = 0; m_mnevt = 0; m_snevt = 0; m_cevt = 0; m_mcevt = 0; m_name = name; m_mode=0; m_nd=(s_on&2)?10:ndx; m_sint=(s_on&2)?1:0; m_scnt=0; m_alpha = 1.; m_autooptimize = -1; m_cmode = m_omode = 1; p_x = new double[m_dim]; p_bm=p_cx=NULL; p_cb=NULL; if (true) { p_xi = new double*[m_dim]; p_bestxi = new double*[m_dim]; p_d = new double*[m_dim]; p_di = new double*[m_dim]; p_hit= new int*[m_dim]; #ifdef USING__MPI p_md = new double*[m_dim]; p_mdi = new double*[m_dim]; p_mhit= new int*[m_dim]; #endif for(int i=0;iSize(); if (size>1) { int cn=3*m_dim*m_nd+2; double *values = new double[cn]; for (int i=0;iAllreduce(values,cn,MPI_DOUBLE,MPI_SUM); for (int i=0;i dr) { dr += p_r[++k]; xo=xn; xn=xi[k]; } dr -= rc; p_xin[i]=xn-(xn-xo)*dr/p_r[k]; } for (i=0;i=m_nd) { msg_Out()<<" WARNING Vegas::GeneratePoint(const double* ran)" <<" called with ran["<1) { if (xy[i]"<1) { if (xy[i]0.) ++m_mcevt; double v2 = value*value; for (int i=0;iSize()>1) { if (m_autooptimize>0) THROW(fatal_error,"Autooptimize not possible in MPI mode"); } else { if (m_autooptimize>0&&m_nevt%m_autooptimize==0) { int v=(m_nevt-m_snevt)/m_autooptimize; if (m_cevt*10*v>(unsigned long)m_autooptimize) { if (m_nopt==0) { if(m_cevt*2>(unsigned long)m_nd) Optimize(); } else if(m_cevt>m_nd*m_nopt) Optimize(); } } } #else ++m_nevt; if (value>0.) ++m_cevt; const auto v2 = value*value; const auto v4 = v2*v2; for (int i=0;i0&&m_nevt%m_autooptimize==0) { int v=(m_nevt-m_snevt)/m_autooptimize; if (m_cevt*10*v>(unsigned long)m_autooptimize) { if (m_nopt==0) { if(m_cevt*2>(unsigned long)m_nd) Optimize(); } else if(m_cevt>m_nd*m_nopt) Optimize(); } } #endif } void Vegas::AddBinPoint(double value,int *xy) { if (m_on==0) return; for (int i=0;i1.e4) || !(cx>=0.)) cx=1.e4; chi+=cx; } chi=sqrt(chi/m_nd); if (m_nopt==0||chi2.*p_chi[j] && ts>p_bestchi[j] && m_nopt>=10) || (m_nopt>20&&chi>p_chi[j])) { p_opt[j]=0; for (int i=0;i0 && ++m_scnt==m_sint) Refine(); Reset(); } void Vegas::Refine() { if (m_omode&1) msg_Tracking()<<"Refine '"< " <<2*m_nd<<" ( int = "< xi(&p_xi[i][0],&p_xi[i][m_nd/2]); delete [] p_xi[i]; p_xi[i] = new double[m_nd]; delete [] p_bestxi[i]; p_bestxi[i] = new double[m_nd]; delete [] p_d[i]; p_d[i] = new double[m_nd]; delete [] p_di[i]; p_di[i] = new double[m_nd]; delete [] p_hit[i]; p_hit[i] = new int[m_nd]; #ifdef USING__MPI delete [] p_md[i]; p_md[i] = new double[m_nd]; delete [] p_mdi[i]; p_mdi[i] = new double[m_nd]; delete [] p_mhit[i]; p_mhit[i] = new int[m_nd]; #endif double lx=0.0; for (int j=0;j Vegas::GetMaxPos() const { std::vector maxs(m_dim,0.0); for (int i=0;i Vegas::GetMeanPos() const { std::vector means(m_dim,0.0); for (int i=0;i0) { ofile->precision(12); for (int i=0;i>tn; if (tn!=m_name) THROW(fatal_error,"Corrupted input file"); int nd; *ifile>>m_dim>>nd>>m_autooptimize>>m_nopt>>m_sint>>m_scnt; if (nd!=m_nd) { m_nd=nd; m_nc=pow(double(m_nd),double(m_dim)); delete [] p_xin; p_xin = new double[m_nd]; delete [] p_r; p_r = new double[m_nd]; for(int i=0;i>p_opt[i]>>p_chi[i]; getline(*ifile,buffer); size_t a=buffer.find("(")+1; size_t b=buffer.find(")"); char * err; buffer=buffer.substr(a,b-a); for (int j=0;j