Beispiel #1
0
static void SamplesAlloc(cThis *t, Samples *samples)
{
#define FIRST -INT_MAX
#define MarkLast(x) (x | Marked(INT_MAX))

#include "KorobovCoeff.c"

  number nx, nf;

  if( samples->sampler == SampleKorobov ) {
    enum { max = Elements(prime) - 2 };
    cint n = IMin(2*samples->n - 1, MAXPRIME);
    int i = Hash(n), p;
    count shift = 2 + NegQ(n - 1000);

    while( i = IMin(IDim(i), max),
           n > (p = prime[i + 1]) || n <= prime[i] ) {
      cint d = (n - Unmark(p)) >> ++shift;
      i += Min1(d);
    }

    samples->coeff = coeff[i][t->ndim - KOROBOV_MINDIM];
    samples->neff = p = Unmark(p);
    samples->n = p/2 + 1;
  }

  nx = t->ndim*(samples->n + 1);		/* need 1 for extrapolation */
  nf = t->ncomp*(samples->n + 1);

  Alloc(samples->x, nx + nf + t->ncomp + t->ncomp);
  samples->f = samples->x + nx;
}
Beispiel #2
0
void  CMask::RemoveMask ( PCMask Mask )  {
int i,l;
  if (Mask) {
    l = IMin(mlen,Mask->mlen);
    for (i=0;i<l;i++)
      m[i] &= ~Mask->m[i]; 
  }
}
Beispiel #3
0
Boolean  CMask::CheckMask ( PCMask Mask )  {
int i,l;
  if (Mask)  {
    i = 0;
    l = IMin(mlen,Mask->mlen);
    while ((i<l) && (!(m[i] & Mask->m[i])))  i++;
    return (i<l);
  } else
    return False;
}
Beispiel #4
0
void  CMask::SelMask ( PCMask Mask )  {
int i,l;
  if (Mask)  {
    l = IMin(mlen,Mask->mlen);
    for (i=0;i<l;i++)
      m[i] &= Mask->m[i];
    for (i=l;i<mlen;i++)
      m[i] = 0;
  } else
    ClearMask();
}
Beispiel #5
0
static void SamplesAlloc(Samples *samples)
{
#define FIRST -INT_MAX
#define MarkLast(x) (x | Marked(INT_MAX))

#include "KorobovCoeff.c"

  count nx, nf;

  if( samples->sampler == SampleKorobov ) {
    enum { max = Elements(prime) - 2 };
    cint n = IMin(2*samples->n - 1, MAXPRIME);
    int i = Hash(n), p;
    count shift = 2 + NegQ(n - 1000);

    while( i = IMin(IDim(i), max),
           n > (p = prime[i + 1]) || n <= prime[i] ) {
      cint d = (n - Unmark(p)) >> ++shift;
      i += Min1(d);
    }

    samples->coeff = coeff[i][ndim_ - KOROBOV_MINDIM];
    samples->neff = p = Unmark(p);
    samples->n = p/2 + 1;
  }

  nx = ndim_*(samples->n + 1);		/* need 1 for extrapolation */
  nf = ncomp_*(samples->n + 1);

  Allocate(samples->x, nx + nf + ncomp_ + ncomp_);
  samples->f = samples->x + nx;
  samples->avg = samples->f + nf;
  samples->err = samples->avg + ncomp_;
  ResClear(samples->err);

  samples->weight = 1./samples->neff;
}
Beispiel #6
0
static count SamplesLookup(Samples *samples, int key,
  ccount nwant, ccount nmax, count nmin)
{
  count n;

  if( key == 13 && ndim_ == 2 ) {
    if( rule13_.first == NULL ) Rule13Alloc(&rule13_);
    samples->rule = &rule13_;
    samples->n = n = nmin = rule13_.n;
    samples->sampler = SampleRule;
  }
  else if( key == 11 && ndim_ == 3 ) {
    if( rule11_.first == NULL ) Rule11Alloc(&rule11_);
    samples->rule = &rule11_;
    samples->n = n = nmin = rule11_.n;
    samples->sampler = SampleRule;
  }
  else if( key == 9 ) {
    if( rule9_.first == NULL ) Rule9Alloc(&rule9_);
    samples->rule = &rule9_;
    samples->n = n = nmin = rule9_.n;
    samples->sampler = SampleRule;
  }
  else if( key == 7 ) {
    if( rule7_.first == NULL ) Rule7Alloc(&rule7_);
    samples->rule = &rule7_;
    samples->n = n = nmin = rule7_.n;
    samples->sampler = SampleRule;
  }
  else {
    n = Abs1(key);
    if( n < 40 ) n *= nwant;
    samples->sampler = (key < 0) ? SampleSobol :
      (n = n/2 + 1, SampleKorobov);
    samples->n = IMin(n, nmax);
  }

  samples->neff = samples->n;

  return IDim(n - nmax) | Marked(nmax - nmin);
}
Beispiel #7
0
static count SamplesLookup(This *t, Samples *samples, cint key,
  cnumber nwant, cnumber nmax, number nmin)
{
  number n;

  if( key == 13 && t->ndim == 2 ) {
    samples->rule = &t->rule13;
    samples->n = n = nmin = t->rule13.n;
    samples->sampler = SampleRule;
  }
  else if( key == 11 && t->ndim == 3 ) {
    samples->rule = &t->rule11;
    samples->n = n = nmin = t->rule11.n;
    samples->sampler = SampleRule;
  }
  else if( key == 9 ) {
    samples->rule = &t->rule9;
    samples->n = n = nmin = t->rule9.n;
    samples->sampler = SampleRule;
  }
  else if( key == 7 ) {
    samples->rule = &t->rule7;
    samples->n = n = nmin = t->rule7.n;
    samples->sampler = SampleRule;
  }
  else {
    n = Abs1(key);
    if( n < 40 ) n *= nwant;
    samples->sampler = (key < 0) ? SampleSobol :
      (n = n/2 + 1, SampleKorobov);
    samples->n = IMin(n, nmax);
  }

  samples->neff = samples->n;

  return IDim(n - nmax) | Marked(nmax - nmin);
}
Beispiel #8
0
static int Integrate(This *t, real *integral, real *error, real *prob)
{
  bin_t *bins;
  count dim, comp;
  int fail;

  StateDecl;
  csize_t statesize = sizeof(State) +
    NCOMP*sizeof(Cumulants) + NDIM*sizeof(Grid);
  Sized(State, state, statesize);
  Cumulants *c, *C = state->cumul + t->ncomp;
  Grid *state_grid = (Grid *)C;
  Array(Grid, margsum, NCOMP, NDIM);
  Vector(char, out, 128*NCOMP + 256);

  if( VERBOSE > 1 ) {
    sprintf(out, "Vegas input parameters:\n"
      "  ndim " COUNT "\n  ncomp " COUNT "\n"
      "  epsrel " REAL "\n  epsabs " REAL "\n"
      "  flags %d\n  seed %d\n"
      "  mineval " NUMBER "\n  maxeval " NUMBER "\n"
      "  nstart " NUMBER "\n  nincrease " NUMBER "\n"
      "  nbatch " NUMBER "\n  gridno %d\n"
      "  statefile \"%s\"",
      t->ndim, t->ncomp,
      t->epsrel, t->epsabs,
      t->flags, t->seed,
      t->mineval, t->maxeval,
      t->nstart, t->nincrease, t->nbatch,
      t->gridno, t->statefile);
    Print(out);
  }

  if( BadComponent(t) ) return -2;
  if( BadDimension(t) ) return -1;

  FrameAlloc(t, ShmRm(t));
  ForkCores(t);
  Alloc(bins, t->nbatch*t->ndim);

  if( (fail = setjmp(t->abort)) ) goto abort;

  IniRandom(t);

  StateSetup(t);

  if( StateReadTest(t) ) {
    StateReadOpen(t, fd) {
      if( read(fd, state, statesize) != statesize ||
          state->signature != StateSignature(t, 1) ) break;
    } StateReadClose(t, fd);
    t->neval = state->neval;
    t->rng.skiprandom(t, t->neval);
  }

  if( ini ) {
    state->niter = 0;
    state->nsamples = t->nstart;
    FClear(state->cumul);
    GetGrid(t, state_grid);
    t->neval = 0;
  }

  /* main iteration loop */
  for( ; ; ) {
    number nsamples = state->nsamples;
    creal jacobian = 1./nsamples;

    FClear(margsum);

    for( ; nsamples > 0; nsamples -= t->nbatch ) {
      cnumber n = IMin(t->nbatch, nsamples);
      real *w = t->frame;
      real *x = w + n;
      real *f = x + n*t->ndim;
      real *lastf = f + n*t->ncomp;
      bin_t *bin = bins;

      while( x < f ) {
        real weight = jacobian;

        t->rng.getrandom(t, x);

        for( dim = 0; dim < t->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(t, n, w, f, t->frame, state->niter + 1);

      bin = bins;
      w = t->frame;

      while( f < lastf ) {
        creal weight = *w++;
        Grid *m = &margsum[0][0];

        for( c = state->cumul; c < C; ++c ) {
          real wfun = weight*(*f++);
          if( wfun ) {
            c->sum += wfun;
            c->sqsum += wfun *= wfun;
            for( dim = 0; dim < t->ndim; ++dim )
              m[dim][bin[dim]] += wfun;
          }
          m += t->ndim;
        }

        bin += t->ndim;
      }
    }

    fail = 0;

    /* compute the integral and error values */

    for( c = state->cumul; c < C; ++c ) {
      real w = Weight(c->sum, c->sqsum, state->nsamples);
      real sigsq = 1/(c->weightsum += w);
      real 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 *oe = out + sprintf(out, "\n"
        "Iteration " COUNT ":  " NUMBER " integrand evaluations so far",
        state->niter + 1, t->neval);
      for( c = state->cumul, comp = 0; c < C; ++c )
        oe += sprintf(oe, "\n[" COUNT "] "
          REAL " +- " REAL "  \tchisq " REAL " (" COUNT " df)",
          ++comp, c->avg, c->err, c->chisq, state->niter);
      Print(out);
    }

    if( fail == 0 && t->neval >= t->mineval ) break;

    if( t->neval >= t->maxeval && !StateWriteTest(t) ) break;

    if( t->ncomp == 1 )
      for( dim = 0; dim < t->ndim; ++dim )
        RefineGrid(t, state_grid[dim], margsum[0][dim]);
    else {
      for( dim = 0; dim < t->ndim; ++dim ) {
        Grid wmargsum;
        Zap(wmargsum);
        for( comp = 0; comp < t->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(t, state_grid[dim], wmargsum);
      }
    }

    ++state->niter;
    state->nsamples += t->nincrease;

    if( StateWriteTest(t) ) {
      state->signature = StateSignature(t, 1);
      state->neval = t->neval;
      StateWriteOpen(t, fd) {
        StateWrite(fd, state, statesize);
      } StateWriteClose(t, fd);
      if( t->neval >= t->maxeval ) break;
    }
  }
Beispiel #9
0
void SVDCMP(REAL **a, int m, int n, REAL *w, REAL **v) { 
/*------------------------------------------------------------------------------------- 
! Given a matrix a(1:m,1:n), this routine computes its singular value decomposition, 
! A = U · W · Vt. The matrix U replaces a on output. The diagonal matrix of singular
! values W is output as a vector w(1:n). The matrix V (not the transpose Vt) is output 
! as v(1:n,1:n). 
!------------------------------------------------------------------------------------*/
//Labels:  e1, e2, e3
  int i,its,j,jj,k,l,nm; 
  REAL anorm,c,f,g,h,s,scale,x,y,z;
  REAL rv1[NMAX];
     
  g=0.0;       //Householder reduction to bidiagonal form
  scale=0.0;
  anorm=0.0;
for (i=1; i<=n; i++) {
  l=i+1;
  rv1[i]=scale*g;
  g=0.0;
  s=0.0;
  scale=0.0;
  if (i <= m) {
    for (k=i; k<=m; k++)  scale += fabs(a[k][i]);
    if (scale != 0.0) {
	  for (k=i; k<=m; k++) {
        a[k][i] /= scale;
        s += a[k][i]*a[k][i];
      } 
      f=a[i][i];
      g=-Sign(sqrt(s),f);
      h=f*g-s;
      a[i][i]=f-g;
      for (j=l; j<=n; j++) {
        s=0.0;
        for (k=i; k<=m; k++) s += a[k][i]*a[k][j];
        f=s/h;
        for (k=i; k<=m; k++) a[k][j] += f*a[k][i];
      } 
      for (k=i; k<=m; k++) a[k][i] *= scale;
    } 
  } 
  w[i]=scale*g;
  g=0.0;
  s=0.0;
  scale=0.0;
  if (i <= m && i != n) {
    for (k=l; k<=n; k++)  scale += fabs(a[i][k]);
    if (scale != 0.0) {
	  for (k=l; k<=n; k++) {
        a[i][k] /= scale;
        s += a[i][k]*a[i][k];
      } 
      f=a[i][l];
      g=-Sign(sqrt(s),f);
      h=f*g-s;
      a[i][l]=f-g;
      for (k=l; k<=n; k++) rv1[k]=a[i][k]/h;
      for (j=l; j<=m; j++) {
        s=0.0;
        for (k=l; k<=n; k++) s += a[j][k]*a[i][k];
        for (k=l; k<=n; k++) a[j][k] += s*rv1[k];
      } 
      for (k=l; k<=n; k++) a[i][k] *= scale;
    } 
  } 
  anorm=Max(anorm,(fabs(w[i])+fabs(rv1[i])));
} // i loop
 
for (i=n; i>0; i--) {       //Accumulation of right-hand transformations
  if (i < n) {
    if (g != 0.0) {
      for (j=l; j<=n; j++)  //Double division to avoid possible underflow
        v[j][i]=(a[i][j]/a[i][l])/g;
      for (j=l; j<=n; j++) { 
        s=0.0;
        for (k=l; k<=n; k++) s += a[i][k]*v[k][j];
        for (k=l; k<=n; k++) v[k][j] += s*v[k][i];
      } 
    } 
    for (j=l; j<=n; j++) {
      v[i][j]=0.0;
      v[j][i]=0.0;
    } 
  } 
  v[i][i]=1.0;
  g=rv1[i];
  l=i;
} 

for (i=IMin(m,n); i>0; i--) {  //Accumulation of left-hand transformations
  l=i+1;
  g=w[i];
  for (j=l; j<=n; j++) a[i][j]=0.0;
  if (g != 0.0) {
    g=1.0/g;
    for (j=l; j<=n; j++) { 
      s=0.0;
      for (k=l; k<=m; k++) s += a[k][i]*a[k][j];
      f=(s/a[i][i])*g;
      for (k=i; k<=m; k++) a[k][j] += f*a[k][i];
    } 
    for (j=i; j<=m; j++) a[j][i] *= g;
  }   
  else
    for (j=i; j<=m; j++) a[j][i]=0.0;
  a[i][i] += 1.0;
} 

for (k=n; k>0; k--) {  //Diagonalization of the bidiagonal form: Loop over
                       //singular values, and over allowed iterations
for (its=1; its<=30; its++) {
for (l=k; l>0; l--) {  //Test for splitting
  nm=l-1;              //Note that rv1(1) is always zero
  if ((fabs(rv1[l])+anorm) == anorm) goto e2; 
  if ((fabs(w[nm])+anorm) == anorm)  goto e1; 
} 
e1: c=0.0;             //Cancellation of rv1(l), if l > 1
s=1.0;
for (i=l; i<=k; i++) {
  f=s*rv1[i];
  rv1[i]=c*rv1[i];
  if ((fabs(f)+anorm) == anorm) goto e2; 
  g=w[i];
  h=pythag(f,g);
  w[i]=h;
  h=1.0/h;
  c=g*h;
  s=-(f*h);
  for (j=1; j<=m; j++) {
    y=a[j][nm];
    z=a[j][i];
    a[j][nm]=(y*c)+(z*s);
    a[j][i]=-(y*s)+(z*c);
  } 
} 
e2: z=w[k];
if (l == k) {     //Convergence
  if (z < 0.0) {  //Singular value is made nonnegative
    w[k]=-z;
    for (j=1; j<=n; j++)  v[j][k]=-v[j][k];
  } 
  goto e3; 
} 
if (its == 30)  printf(" No convergence in svdcmp\n"); 
x=w[l];           //Shift from bottom 2-by-2 minor
nm=k-1;
y=w[nm];
g=rv1[nm];
h=rv1[k];
f=((y-z)*(y+z)+(g-h)*(g+h))/(2.0*h*y);
g=pythag(f,1.0);
f=((x-z)*(x+z)+h*((y/(f+Sign(g,f)))-h))/x;
c=1.0;            //Next QR transformation:
s=1.0;
for (j=l; j<=nm; j++) {
  i=j+1;
  g=rv1[i];
  y=w[i];
  h=s*g;
  g=c*g;
  z=pythag(f,h);
  rv1[j]=z;
  c=f/z;
  s=h/z;
  f= (x*c)+(g*s);
  g=-(x*s)+(g*c);
  h=y*s;
  y=y*c;
  for (jj=1; jj<=n; jj++) {
    x=v[jj][j];
    z=v[jj][i];
    v[jj][j]= (x*c)+(z*s);
    v[jj][i]=-(x*s)+(z*c);
  } 
  z=pythag(f,h);
  w[j]=z;   //Rotation can be arbitrary if z = 0 
  if (z != 0.0) {
    z=1.0/z;
    c=f*z;
    s=h*z;
  } 
  f= (c*g)+(s*y);
  x=-(s*g)+(c*y);
  for (jj=1; jj<=m; jj++) {
    y=a[jj][j];
    z=a[jj][i];
    a[jj][j]= (y*c)+(z*s);
    a[jj][i]=-(y*s)+(z*c);
  } 
} //for j=l to nm
rv1[l]=0.0;
rv1[k]=f;
w[k]=x;

} //its loop
 
e3:;} //k loop
 
} //svdcmp()
Beispiel #10
0
void CSymbolTypeComboBox::DrawItem(LPDRAWITEMSTRUCT pDIStruct)
{
    CRect rItemRect = pDIStruct->rcItem;

    COLORREF clrNormal   = ::GetSysColor(COLOR_WINDOW);
    COLORREF clrSelected = ::GetSysColor(COLOR_HIGHLIGHT);
    COLORREF drawColor   = symColor;

    CDC dcContext;
    if (!dcContext.Attach(pDIStruct->hDC)) {
        return;
    }

    int iState = pDIStruct->itemState;
    if (iState & ODS_SELECTED)
    {
        drawColor = 0x00FFFFFF & ~(drawColor);
        dcContext.SetBkColor(clrSelected);
        dcContext.FillSolidRect(&rItemRect, clrSelected);
    }
    else
    {
        dcContext.SetBkColor(clrNormal);
        dcContext.FillSolidRect(&rItemRect, clrNormal);
    }

    if (iState & ODS_FOCUS) {
        dcContext.DrawFocusRect(&rItemRect);
    }

    int iItem = pDIStruct->itemID;
    if (iItem != -1)
    {
        dcContext.SetBkMode(TRANSPARENT);

        if (iState & ODS_DISABLED)
        {
            drawColor = ::GetSysColor(COLOR_INACTIVECAPTIONTEXT);
        }

        PlotSymbol currSym = PlotSymbol(iItem);
        bool filledSym = PlotSymbolOps::SymbolIsFilled(currSym);

        rItemRect.DeflateRect(4, 0);
        int lThick = IMin(rItemRect.bottom - rItemRect.top - 2, symLThick);

        if (filledSym)
            lThick = 1;
        CPen drawPen(PS_SOLID, lThick, drawColor);
        CPen* pOldPen = dcContext.SelectObject(&drawPen);

        CBrush brush(drawColor);
        CBrush* pOldBrush = dcContext.SelectObject(&brush);

        int drawSymSize  = IMin((rItemRect.bottom - rItemRect.top), symSize);

        int rectMidY = (rItemRect.top + rItemRect.bottom) / 2;
        int rectMidX = (rItemRect.left + rItemRect.right) / 2;

        switch (currSym) {
            case ps_X : {
                drawSymSize /= 2;
                dcContext.MoveTo(rectMidX - drawSymSize, rectMidY - drawSymSize);
                dcContext.LineTo(rectMidX + drawSymSize, rectMidY + drawSymSize);
                dcContext.MoveTo(rectMidX + drawSymSize, rectMidY - drawSymSize);
                dcContext.LineTo(rectMidX - drawSymSize, rectMidY + drawSymSize);
                break;
            }
            case ps_Plus : {
                drawSymSize /= 2;
                dcContext.MoveTo(rectMidX - drawSymSize, rectMidY);
                dcContext.LineTo(rectMidX + drawSymSize, rectMidY);
                dcContext.MoveTo(rectMidX, rectMidY - drawSymSize);
                dcContext.LineTo(rectMidX, rectMidY + drawSymSize);
                break;
            }
            case ps_Square : case ps_FSquare :{

                drawSymSize /= 2;
                CPoint pts[4];
                pts[0].x = rectMidX - drawSymSize;
                pts[0].y = rectMidY - drawSymSize;
                pts[1].x = rectMidX + drawSymSize;
                pts[1].y = rectMidY - drawSymSize;
                pts[2].x = rectMidX + drawSymSize;
                pts[2].y = rectMidY + drawSymSize;
                pts[3].x = rectMidX - drawSymSize;
                pts[3].y = rectMidY + drawSymSize;
                DrawSymbol(dcContext, pts, 4, filledSym);

                break;
            }
            case ps_Circle : case ps_FCircle: {
                static const Point2D cicoords[] = {Point2D(0.00000 ,0.50000),
                                               Point2D(0.25000 ,0.43301),
                                               Point2D(0.43301 ,0.25000),
                                               Point2D(0.50000 ,0.00000),
                                               Point2D(0.43301 ,-0.25000),
                                               Point2D(0.25000 ,-0.43301),
                                               Point2D(0.00000 ,-0.50000),
                                               Point2D(-0.25000,-0.43301),
                                               Point2D(-0.43301,-0.25000),
                                               Point2D(-0.50000,0.00000),
                                               Point2D(-0.43301,0.25000),
                                               Point2D(-0.25000,0.43301)};

                CPoint pts[12];

                for (int i = 0; i < 12; i++)
                {
                    int offX = int(double(drawSymSize) * cicoords[i].pX);
                    int offY = int(double(drawSymSize) * cicoords[i].pY);
                    pts[i].x = rectMidX + offX;
                    pts[i].y = rectMidY + offY;
                }

                DrawSymbol(dcContext, pts, 12, filledSym);
                break;
            }
            case ps_Triangle : case ps_FTriangle : {

                int offX = int(double(drawSymSize) * 0.4330);
                int offY = int(double(drawSymSize) * 0.25);

                CPoint pts[3];
                pts[0].x = rectMidX - offX;
                pts[0].y = rectMidY + offY;
                pts[1].x = rectMidX + offX;
                pts[1].y = rectMidY + offY;
                pts[2].x = rectMidX;
                pts[2].y = rectMidY - drawSymSize / 2;
                DrawSymbol(dcContext, pts, 3, filledSym);
                break;
            }
            case ps_Diamond : case ps_FDiamond : {
                drawSymSize /= 2;

                CPoint pts[4];
                pts[0].x = rectMidX;
                pts[0].y = rectMidY - drawSymSize;
                pts[1].x = rectMidX + drawSymSize;
                pts[1].y = rectMidY;
                pts[2].x = rectMidX;
                pts[2].y = rectMidY + drawSymSize;
                pts[3].x = rectMidX - drawSymSize;
                pts[3].y = rectMidY;
                DrawSymbol(dcContext, pts, 4, filledSym);
                break;
            }

        }
    }


    dcContext.Detach();
}
Beispiel #11
0
static int Integrate(This *t, real *integral, real *error, real *prob)
{
  bin_t *bins;
  count dim, comp;
  int fail;
  struct {
    count niter;
    number nsamples, neval;
    Cumulants cumul[NCOMP];
    Grid grid[NDIM];
  } state;
  int statemsg = VERBOSE;
  struct stat st;

  if( VERBOSE > 1 ) {
    char s[512];
    sprintf(s, "Vegas input parameters:\n"
      "  ndim " COUNT "\n  ncomp " COUNT "\n"
      "  epsrel " REAL "\n  epsabs " REAL "\n"
      "  flags %d\n  seed %d\n"
      "  mineval " NUMBER "\n  maxeval " NUMBER "\n"
      "  nstart " NUMBER "\n  nincrease " NUMBER "\n"
      "  nbatch " NUMBER "\n  gridno %d\n"
      "  statefile \"%s\"",
      t->ndim, t->ncomp,
      t->epsrel, t->epsabs,
      t->flags, t->seed,
      t->mineval, t->maxeval,
      t->nstart, t->nincrease, t->nbatch,
      t->gridno, t->statefile);
    Print(s);
  }

  if( BadComponent(t) ) return -2;
  if( BadDimension(t) ) return -1;

  FrameAlloc(t, ShmRm(t));
  ForkCores(t);
  Alloc(bins, t->nbatch*t->ndim);

  if( (fail = setjmp(t->abort)) ) goto abort;

  IniRandom(t);

  if( t->statefile && *t->statefile == 0 ) t->statefile = NULL;

  if( t->statefile &&
      stat(t->statefile, &st) == 0 &&
      st.st_size == sizeof state && (st.st_mode & 0400) ) {
    cint h = open(t->statefile, O_RDONLY);
    read(h, &state, sizeof state);
    close(h);
    t->rng.skiprandom(t, t->neval = state.neval);

    if( VERBOSE ) {
      char s[256];
      sprintf(s, "\nRestoring state from %s.", t->statefile);
      Print(s);
    }
  }
  else {
    state.niter = 0;
    state.nsamples = t->nstart;
    Zap(state.cumul);
    GetGrid(t, state.grid);
  }

  /* main iteration loop */

  for( ; ; ) {
    number nsamples = state.nsamples;
    creal jacobian = 1./nsamples;
    Grid margsum[NCOMP][NDIM];

    Zap(margsum);

    for( ; nsamples > 0; nsamples -= t->nbatch ) {
      cnumber n = IMin(t->nbatch, nsamples);
      real *w = t->frame;
      real *x = w + n;
      real *f = x + n*t->ndim;
      real *lastf = f + n*t->ncomp;
      bin_t *bin = bins;

      while( x < f ) {
        real weight = jacobian;

        t->rng.getrandom(t, x);

        for( dim = 0; dim < t->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(t, n, w, f, t->frame, state.niter + 1);

      bin = bins;
      w = t->frame;

      while( f < lastf ) {
        creal weight = *w++;

        for( comp = 0; comp < t->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 < t->ndim; ++dim )
              m[dim][bin[dim]] += wfun;
          }
        }

        bin += t->ndim;
      }
    }

    fail = 0;

    /* compute the integral and error values */

    for( comp = 0; comp < t->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, t->neval);

      for( comp = 0; comp < t->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 && t->neval >= t->mineval ) {
      if( t->statefile && KEEPFILE == 0 ) unlink(t->statefile);
      break;
    }

    if( t->neval >= t->maxeval && t->statefile == NULL ) break;

    if( t->ncomp == 1 )
      for( dim = 0; dim < t->ndim; ++dim )
        RefineGrid(t, state.grid[dim], margsum[0][dim]);
    else {
      for( dim = 0; dim < t->ndim; ++dim ) {
        Grid wmargsum;
        Zap(wmargsum);
        for( comp = 0; comp < t->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(t, state.grid[dim], wmargsum);
      }
    }

    ++state.niter;
    state.nsamples += t->nincrease;

    if( t->statefile ) {
      cint h = creat(t->statefile, 0666);
      if( h != -1 ) {
        state.neval = t->neval;
        write(h, &state, sizeof state);
        close(h);

        if( statemsg ) {
          char s[256];
          sprintf(s, "\nSaving state to %s.", t->statefile);
          Print(s);
          statemsg = false;
        }
      }
      if( t->neval >= t->maxeval ) break;
    }
  }

  for( comp = 0; comp < t->ncomp; ++comp ) {
    cCumulants *c = &state.cumul[comp];
    integral[comp] = c->avg;
    error[comp] = c->err;
    prob[comp] = ChiSquare(c->chisq, state.niter);
  }

abort:
  PutGrid(t, state.grid);
  free(bins);
  WaitCores(t);
  FrameFree(t);

  return fail;
}
Beispiel #12
0
void InitializeSynchrotron(const double B_0, const dCVector* pEnergy, 
			   const dCVector* pEnergyWidth,
			   dCVector* synchrotronLoss, DiffRate* syncRate,
			   string aDirTables)
/* this function calculates the synchrotron loss rate for the electron
    and the synchrotron radiation spectrum for photons
    The radom direction of the magnetic field requires me to do an
    average over the pitch angle, and it results in an extra factor of
    2/3, and slightly modifies the functional form of F(x) from the
    purely perpendicular case   */
/* The above comment is from the stand alone version. Compared to this version the constants seem to be fixed to correct for a perpendicular field as input. JK, 2011*/
{
    const int SYNC_TABLE_SIZE = 161;
    int i;
    double offset;    /* parameter to compute bounds correctly */
    dCVector syncTable;
    double x0;

    double ECrit;
    double EMin;
    double EMax;
    int jMin;
    int jMax;
    int j;
    double xx;
    double function;
    int iTable;
    double eLower;
    double eUpper;
    int num_main_bins;

    num_main_bins = pEnergy->dimension;

    if ((num_main_bins != pEnergyWidth->dimension) || 
	(num_main_bins != syncRate->mainDimension) ||
	(num_main_bins != synchrotronLoss->dimension))
    {
	Error("InitializeSynchrotron: inconsistent dimensions", PROGRAM_ERROR);
    }

    New_dCVector(&syncTable, SYNC_TABLE_SIZE);

    /* read in table */

    LoadSyncTable(&syncTable, aDirTables);

    /* calculate the rates */
    offset = BINS_PER_DECADE*(log10(ELECTRON_MASS) - MAX_ENERGY_EXP) +
        num_main_bins + 0.5;
    x0 = B_0*5.86667629e-4*DISTANCE_UNIT;
    /* x0: eB/m_e in inverse pc */

    for (i = 0; i < num_main_bins; i++)
    {
        /* electron loss rate */
        (synchrotronLoss->vector)[i] = -B_0*B_0*(pEnergy->vector)[i]*
	    (pEnergy->vector)[i]*2.*4.86037e4*VOLUME_UNIT;
        
        /* calculate the radiation spectrum */
        ECrit = 3./2.*B_0/4.414034e13*(pEnergy->vector)[i]*
	    (pEnergy->vector)[i];
        /* ECrit: critical energy in electron mass */

        EMin = 2./3./((pEnergy->vector)[i]*(pEnergy->vector)[i]*
            (pEnergy->vector)[i])*ECrit;
        EMax = 5.*ECrit;
        /* EMin/EMax: useful range for x (in electron mass) */

        /* set up the range for photons -> determine bounds */
	jMin = IMax((int)(BINS_PER_DECADE*log10(EMin) + offset), 0);
	jMax = IMin((int)(BINS_PER_DECADE*log10(EMax) + offset),
	    num_main_bins - 1);
        if (jMax >= 0)  /* normal case */
        {
            (syncRate->bound)[i][0] = jMin;
            (syncRate->bound)[i][1] = jMax;

            for (j = (syncRate->bound)[i][0]; 
		 j <= (syncRate->bound)[i][1]; j++)
            {
                xx = (pEnergy->vector)[j]/ECrit;

                if (log10(xx) < -7.)
                {
                    function = pow(xx, 1./3.)*2.1809736;
		    /* use an approximation for x below 10^-7 */
                }
                else
                {
		  /* compute F(x) at given photon energy by linear
		     extrapolation in logarithm */
                    iTable = (int)(log10(xx)*20. + 140);
                    eLower = (double)(iTable - 140)/20.;
                    eUpper = (double)(iTable - 139)/20.;
		    /* numbers 140, 139, and 20 are properties of table */
                    function = exp(log(syncTable.vector[iTable]) + (log10(xx) -
                        eLower)/(eUpper - eLower)*
                        (log(syncTable.vector[iTable+1]) - 
			 log(syncTable.vector[iTable])));
                }
                (syncRate->diffRate)[i][j] = 2.756644477e-1/137.036*x0*
		    function/(pEnergy->vector)[j]*(pEnergyWidth->vector)[j];
                /* 2.7566...: sqtr(3)/(2pi), 1/137: e^2, x0: eB/m_e */
            }
        }
    }

    Delete_dCVector(&syncTable) ;

}
Beispiel #13
0
void  CXMLObject::WriteObject ( RCFile f, int pos, int indent )  {
int     i,pos1,lm,rm,tl;
pstr    indstr,p,p1,q;
Boolean sngline;

  if (objTag)  {

    pos1   = pos + indent;
    indstr = new char[pos1+1];
    for (i=0;i<pos1;i++)  indstr[i] = ' ';
    indstr[pos1] = char(0);

    indstr[pos]  = char(0);
    f.Write ( indstr    );
    f.Write ( pstr("<") );
    f.Write ( objTag    );
    if ((!objData) && (nObjects<=0))  {
      f.WriteLine ( pstr("/>") );
      delete[] indstr;
      return;
    }
    f.Write ( pstr(">") );

    sngline = False;
    if (objData)  {
      rm = 72;               // right margin
      lm = IMin ( pos1,36 ); // left margin
      tl = strlen(objTag);
      if ((pos+tl+2+strlen(objData)<rm-tl-2) &&
          (nObjects<=0))  {
        // single-line output
        sngline = True;
        f.Write ( objData );
      } else  {
        // multiple-line output with indentation
        indstr[pos] = ' ';
        indstr[lm]  = char(0);
        f.LF();
        p = objData;
        do  {
          p1 = p;
          i  = lm;
          q  = NULL;
          while ((*p1) && ((i<rm) || (!q)))  {
            if (*p1==' ')  q = p1;
            p1++;
            i++;
          }
          f.Write ( indstr );
          if (*p1)  {  // wrap data
            *q = char(0);
            f.WriteLine ( p );
            *q = ' ';
            p  = q;
            while (*p==' ')  p++;
            if (*p==char(0))  p = NULL;

          } else {  // data exchausted
            f.WriteLine ( p );
            p = NULL;
          }
        } while (p);
        indstr[lm]  = ' ';
        indstr[pos] = char(0);
      }
    } else
      f.LF();

    for (i=0;i<nObjects;i++)
      if (object[i])
        object[i]->WriteObject ( f,pos+indent,indent );

    if (!sngline)  f.Write ( indstr );
    f.Write ( pstr("</") );
    f.Write ( objTag  );
    f.WriteLine ( pstr(">") );

    delete[] indstr;

  }

}
Beispiel #14
0
void FoldDiffRate(const dCVector* pBgPhotonDensity,
		  const RawDiffRate* pRawDiffRate,
		  DiffRate* pDiffRate, const int scatSwitch, ...)
{
    int i;
    int j;
    int k;
    int offset = 0;
    int jLower;
    int jUpper;
    int num_main_bins;
    int num_bg_bins;

    num_main_bins = pRawDiffRate->mainDimension;
    num_bg_bins = pRawDiffRate->bgDimension;

    if ((pBgPhotonDensity->dimension != num_bg_bins) ||
	(num_main_bins != pDiffRate->mainDimension))
    {
        Error("FoldDiffRate: inconsistent dimensions", PROGRAM_ERROR);
    }

    if (scatSwitch != 0)
    /* scattering type: adjustment of total rate(s) needed */
    {
	va_list pArg;
//	TotalRate* totalRateArray[scatSwitch];
	TotalRate* totalRateArray[3];

	va_start(pArg, scatSwitch);
	for (i = 0; i < scatSwitch; i++)
	    totalRateArray[i] = va_arg(pArg, TotalRate*);
	/* Let totalRateArray[i] point to the totalRate* we will modify; we do
	   not need to update the arguments later
	   (i.e. va_arg(...) = totalRateArray[i];) because the actual values
	   they point to have been properly updated */

	for (i = 0; i < num_main_bins; i++)
	{
	    jLower = num_main_bins - 1;
	    jUpper = 0;
	    for (j = 0; j < num_bg_bins; j++)
	    {
		if (pRawDiffRate->bound[i][j][0] != -1)
		/* above threshold */
		{
		    offset += -(pRawDiffRate->bound)[i][j][0];
		    jLower = IMin(jLower, (pRawDiffRate->bound)[i][j][0]);
		    jUpper = IMax(jUpper, (pRawDiffRate->bound)[i][j][1]);
		    for (k = (pRawDiffRate->bound)[i][j][0]; 
			 k <= (pRawDiffRate->bound)[i][j][1]; k++)
		    {
#ifdef DEBUG
			CheckIndex(0, i+1, k, "FoldDiffRate");
			CheckIndex(0, pRawDiffRate->numberOfElements, k+offset,
				   "FoldDiffRate");
#endif
			(pDiffRate->diffRate)[i][k] += 
			    (pBgPhotonDensity->vector)[j]*
			    (pRawDiffRate->diffRate)[k+offset];
		    }
		    /* these lines take care of the appropriate subtractions 
		       made in the main implicit formula */
		    if ((pRawDiffRate->bound)[i][j][1] == i)
		    /*  if (((pRawDiffRate->bound)[i][j][0] <= i) && 
			    ((pRawDiffRate->bound)[i][j][1] >= i))    */
		    {
			int l;

			for (l = 0; l < scatSwitch; l++)
			{
			    (totalRateArray[l]->totalRate)[i] += 
			        -(pRawDiffRate->diffRate)[i+offset]*
			        (pBgPhotonDensity->vector)[j];
			}
			(pDiffRate->diffRate)[i][i] += 
			    -(pRawDiffRate->diffRate)[i+offset]*
			    (pBgPhotonDensity->vector)[j];
		    }
		    offset += (pRawDiffRate->bound)[i][j][1] + 1;
		    /* reset the offset index */
		}
	    }
	    (pDiffRate->bound)[i][0] = IMin((pDiffRate->bound)[i][0], jLower);
	    (pDiffRate->bound)[i][1] = IMax((pDiffRate->bound)[i][1], jUpper);
        }
	va_end(pArg);
    }