⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 integrate.c

📁 The CUBA library provides new implementation of four general-purpose multidimensional integration al
💻 C
字号:
/*	Integrate.c		integrate over the unit hypercube		this file is part of Vegas		last modified 2 Mar 06 th*/static int Integrate(creal epsrel, creal epsabs,  cint flags, cnumber mineval, cnumber maxeval,  cnumber nstart, cnumber nincrease,  real *integral, real *error, real *prob){  real *sample;  count dim, comp;  int fail = 1;  struct {    count niter;    number nsamples, neval;    Cumulants cumul[NCOMP];    Grid grid[NDIM];  } state;  int statemsg = VERBOSE;  struct stat st;  if( VERBOSE > 1 ) {    char s[256];    sprintf(s, "Vegas input parameters:\n"      "  ndim " COUNT "\n  ncomp " COUNT "\n"      "  epsrel " REAL "\n  epsabs " REAL "\n"      "  flags %d\n  mineval " NUMBER "\n  maxeval " NUMBER "\n"      "  nstart " NUMBER "\n  nincrease " NUMBER "\n"      "  vegasgridno %d\n  vegasstate \"%s\"\n",      ndim_, ncomp_,      epsrel, epsabs,      flags, mineval, maxeval,      nstart, nincrease,      EXPORT(vegasgridno), EXPORT(vegasstate));    Print(s);  }#ifdef MLVERSION  if( setjmp(abort_) ) goto abort;#endif  IniRandom(2*maxeval, flags);  if( *EXPORT(vegasstate) && stat(EXPORT(vegasstate), &st) == 0 &&      st.st_size == sizeof(state) && (st.st_mode & 0400) ) {    cint h = open(EXPORT(vegasstate), O_RDONLY);    read(h, &state, sizeof(state));    close(h);    SkipRandom(neval_ = state.neval);    if( VERBOSE ) {      char s[256];      sprintf(s, "\nRestoring state from %s.", EXPORT(vegasstate));      Print(s);    }  }  else {    state.niter = 0;    state.nsamples = nstart;    Zap(state.cumul);    GetGrid(state.grid);  }  SamplesAlloc(sample, EXPORT(vegasnbatch));  /* main iteration loop */  for( ; ; ) {    number nsamples = state.nsamples;    creal jacobian = 1./nsamples;    Grid margsum[NCOMP][NDIM];    Zap(margsum);    for( ; nsamples > 0; nsamples -= EXPORT(vegasnbatch) ) {      cnumber nbatch = IMin(EXPORT(vegasnbatch), nsamples);      real *w = sample;      real *x = w + nbatch;      real *f = x + nbatch*ndim_;      real *lastf = f + nbatch*ncomp_;      bin_t *bin = (bin_t *)lastf;      while( x < f ) {        real weight = jacobian;        GetRandom(x);        for( dim = 0; dim < ndim_; ++dim ) {          creal pos = *x*NBINS;          ccount ipos = (count)pos;          creal prev = (ipos == 0) ? 0 : state.grid[dim][ipos - 1];          creal diff = state.grid[dim][ipos] - prev;           *x++ = prev + (pos - ipos)*diff;          *bin++ = ipos;          weight *= diff*NBINS;        }        *w++ = weight;      }      DoSample(nbatch, w, f);      w = sample;      bin = (bin_t *)lastf;      while( f < lastf ) {        creal weight = *w++;        for( comp = 0; comp < ncomp_; ++comp ) {          real wfun = weight*(*f++);          if( wfun ) {            Cumulants *c = &state.cumul[comp];            Grid *m = margsum[comp];            c->sum += wfun;            c->sqsum += wfun *= wfun;            for( dim = 0; dim < ndim_; ++dim )              m[dim][bin[dim]] += wfun;          }        }        bin += ndim_;      }    }    fail = 0;    /* compute the integral and error values */    for( comp = 0; comp < ncomp_; ++comp ) {      Cumulants *c = &state.cumul[comp];      real avg, sigsq;      real w = Weight(c->sum, c->sqsum, state.nsamples);      sigsq = 1/(c->weightsum += w);      avg = sigsq*(c->avgsum += w*c->sum);      c->avg = LAST ? (sigsq = 1/w, c->sum) : avg;      c->err = sqrt(sigsq);      fail |= (c->err > MaxErr(c->avg));      if( state.niter == 0 ) c->guess = c->sum;      else {        c->chisum += w *= c->sum - c->guess;        c->chisqsum += w*c->sum;      }      c->chisq = c->chisqsum - avg*c->chisum;      c->sum = c->sqsum = 0;    }    if( VERBOSE ) {      char s[128 + 128*NCOMP], *p = s;      p += sprintf(p, "\n"        "Iteration " COUNT ":  " NUMBER " integrand evaluations so far",        state.niter + 1, neval_);      for( comp = 0; comp < ncomp_; ++comp ) {        cCumulants *c = &state.cumul[comp];        p += sprintf(p, "\n[" COUNT "] "          REAL " +- " REAL "  \tchisq " REAL " (" COUNT " df)",          comp + 1, c->avg, c->err, c->chisq, state.niter);      }      Print(s);    }    if( fail == 0 && neval_ >= mineval ) {      if( *EXPORT(vegasstate) ) unlink(EXPORT(vegasstate));      break;    }    if( neval_ >= maxeval && *EXPORT(vegasstate) == 0 ) break;    if( ncomp_ == 1 )      for( dim = 0; dim < ndim_; ++dim )        RefineGrid(state.grid[dim], margsum[0][dim]);    else {      for( dim = 0; dim < ndim_; ++dim ) {        Grid wmargsum;        Zap(wmargsum);        for( comp = 0; comp < ncomp_; ++comp ) {          real w = state.cumul[comp].avg;          if( w != 0 ) {            creal *m = margsum[comp][dim];            count bin;            w = 1/Sq(w);            for( bin = 0; bin < NBINS; ++bin )              wmargsum[bin] += w*m[bin];          }        }        RefineGrid(state.grid[dim], wmargsum);      }    }    ++state.niter;    state.nsamples += nincrease;    if( *EXPORT(vegasstate) ) {      cint h = creat(EXPORT(vegasstate), 0666);      if( h != -1 ) {        state.neval = neval_;        write(h, &state, sizeof(state));        close(h);        if( statemsg ) {          char s[256];          sprintf(s, "\nSaving state to %s.", EXPORT(vegasstate));          Print(s);          statemsg = false;        }      }      if( neval_ >= maxeval ) break;    }  }  for( comp = 0; comp < ncomp_; ++comp ) {    cCumulants *c = &state.cumul[comp];    integral[comp] = c->avg;    error[comp] = c->err;    prob[comp] = ChiSquare(c->chisq, state.niter);  }#ifdef MLVERSIONabort:#endif  free(sample);  PutGrid(state.grid);  return fail;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -