static void SampleRule(This *t, ccount iregion) { SAMPLERDEFS; Set *first = samples->rule->first; Set *last = samples->rule->last; Set *s; creal *errcoeff = samples->rule->errcoeff; count comp, rul, sn; csize_t setsize = SetSize; for( s = first; s <= last; NextSet(s) ) if( s->n ) x = ExpandFS(t, b, s->gen, x); DoSample(t, n, samples->x, f); for( comp = 0; comp < t->ncomp; ++comp ) { real sum[nrules]; creal *f1 = f++; Zap(sum); for( s = first; s <= last; NextSet(s) ) for( sn = s->n; sn; --sn ) { creal fun = *f1; f1 += t->ncomp; for( rul = 0; rul < nrules; ++rul ) sum[rul] += fun*s->weight[rul]; } /* Search for the null rule, in the linear space spanned by two successive null rules in our sequence, which gives the greatest error estimate among all normalized (1-norm) null rules in this space. */ for( rul = 1; rul < nrules - 1; ++rul ) { real maxerr = 0; for( s = first; s <= last; NextSet(s) ) maxerr = Max(maxerr, fabsx(sum[rul + 1] + s->scale[rul]*sum[rul])*s->norm[rul]); sum[rul] = maxerr; } res[comp].avg = region->vol*sum[0]; res[comp].err = region->vol*( (errcoeff[0]*sum[1] <= sum[2] && errcoeff[0]*sum[2] <= sum[3]) ? errcoeff[1]*sum[1] : errcoeff[2]*Max(Max(sum[1], sum[2]), sum[3]) ); } }
static void Sample(This *t, void *voidregion) { TYPEDEFREGION; TYPEDEFSET; Region *const region = (Region *)voidregion; creal vol = ldexp(1., -region->div); real *x = t->rule.x, *f = t->rule.f; Set *first = (Set *)t->rule.first, *last = (Set *)t->rule.last, *s; creal *errcoeff = t->rule.errcoeff; creal ratio = Sq(first[2].gen[0]/first[1].gen[0]); ccount offset = 2*t->ndim*t->ncomp; count dim, comp, rul, n, maxdim = 0; real maxrange = 0; for( dim = 0; dim < t->ndim; ++dim ) { cBounds *b = ®ion->bounds[dim]; creal range = b->upper - b->lower; if( range > maxrange ) { maxrange = range; maxdim = dim; } } for( s = first; s <= last; ++s ) if( s->n ) x = ExpandFS(t, region->bounds, s->gen, x); DoSample(t, t->rule.n, t->rule.x, f); for( comp = 0; comp < t->ncomp; ++comp ) { Result *r = ®ion->result[comp]; real sum[nrules]; creal *f1 = f; creal base = *f1*2*(1 - ratio); real maxdiff = 0; count bisectdim = maxdim; for( dim = 0; dim < t->ndim; ++dim ) { creal *fp = f1 + t->ncomp; creal *fm = fp + t->ncomp; creal fourthdiff = fabs(base + ratio*(fp[0] + fm[0]) - (fp[offset] + fm[offset])); f1 = fm; if( fourthdiff > maxdiff ) { maxdiff = fourthdiff; bisectdim = dim; } } r->bisectdim = bisectdim; f1 = f++; Zap(sum); for( s = first; s <= last; ++s ) for( n = s->n; n; --n ) { creal fun = *f1; f1 += t->ncomp; for( rul = 0; rul < nrules; ++rul ) sum[rul] += fun*s->weight[rul]; } /* Search for the null rule, in the linear space spanned by two successive null rules in our sequence, which gives the greatest error estimate among all normalized (1-norm) null rules in this space. */ for( rul = 1; rul < nrules - 1; ++rul ) { real maxerr = 0; for( s = first; s <= last; ++s ) maxerr = Max(maxerr, fabs(sum[rul + 1] + s->scale[rul]*sum[rul])*s->norm[rul]); sum[rul] = maxerr; } r->avg = vol*sum[0]; r->err = vol*( (errcoeff[0]*sum[1] <= sum[2] && errcoeff[0]*sum[2] <= sum[3]) ? errcoeff[1]*sum[1] : errcoeff[2]*Max(Max(sum[1], sum[2]), sum[3]) ); } if( VERBOSE > 2 ) { char s[64*NDIM + 128*NCOMP], *p = s; for( dim = 0; dim < t->ndim; ++dim ) { cBounds *b = ®ion->bounds[dim]; p += sprintf(p, (dim == 0) ? "\nRegion (" REALF ") - (" REALF ")" : "\n (" REALF ") - (" REALF ")", b->lower, b->upper); } for( comp = 0; comp < t->ncomp; ++comp ) { cResult *r = ®ion->result[comp]; p += sprintf(p, "\n[" COUNT "] " REAL " +- " REAL, comp + 1, r->avg, r->err); } Print(s); } }
static void Sample(This *t, Region *region) { csize_t setsize = SetSize; creal vol = ldexp(1., -region->div); real *x = t->frame, *f = x + t->rule.n*t->ndim; Set *first = t->rule.first, *last = t->rule.last, *s; Bounds *b, *B = region->bounds + t->ndim; Result *result = RegionResult(region), *res, *Res = result + t->ncomp; creal *errcoeff = t->rule.errcoeff; creal ratio = Sq(IndexSet(first,2)->gen[0]/ IndexSet(first,1)->gen[0]); ccount offset = 2*t->ndim*t->ncomp; count dim, rul, n, maxdim = 0; real maxrange = 0; for( b = region->bounds, dim = 0; b < B; ++b, ++dim ) { creal range = b->upper - b->lower; if( range > maxrange ) { maxrange = range; maxdim = dim; } } for( s = first; s <= last; NextSet(s) ) if( s->n ) x = ExpandFS(t, region->bounds, s->gen, x); DoSample(t, t->rule.n, t->frame, f); for( res = result; res < Res; ++res ) { real sum[nrules]; creal *f1 = f; creal base = *f1*2*(1 - ratio); real maxdiff = 0; count bisectdim = maxdim; for( dim = 0; dim < t->ndim; ++dim ) { creal *fp = f1 + t->ncomp; creal *fm = fp + t->ncomp; creal fourthdiff = fabs(base + ratio*(fp[0] + fm[0]) - (fp[offset] + fm[offset])); f1 = fm; if( fourthdiff > maxdiff ) { maxdiff = fourthdiff; bisectdim = dim; } } res->bisectdim = bisectdim; f1 = f++; Zap(sum); for( s = first; s <= last; NextSet(s) ) for( n = s->n; n; --n ) { creal fun = *f1; f1 += t->ncomp; for( rul = 0; rul < nrules; ++rul ) sum[rul] += fun*s->weight[rul]; } /* Search for the null rule, in the linear space spanned by two successive null rules in our sequence, which gives the greatest error estimate among all normalized (1-norm) null rules in this space. */ for( rul = 1; rul < nrules - 1; ++rul ) { real maxerr = 0; for( s = first; s <= last; NextSet(s) ) maxerr = Max(maxerr, fabs(sum[rul + 1] + s->scale[rul]*sum[rul])*s->norm[rul]); sum[rul] = maxerr; } res->avg = vol*sum[0]; res->err = vol*( (errcoeff[0]*sum[1] <= sum[2] && errcoeff[0]*sum[2] <= sum[3]) ? errcoeff[1]*sum[1] : errcoeff[2]*Max(Max(sum[1], sum[2]), sum[3]) ); } if( VERBOSE > 2 ) { Vector(char, out, 64*NDIM + 128*NCOMP); char *oe = out; count comp; cchar *msg = "\nRegion (" REALF ") - (" REALF ")"; for( b = region->bounds; b < B; ++b ) { oe += sprintf(oe, msg, b->lower, b->upper); msg = "\n (" REALF ") - (" REALF ")"; } for( res = result, comp = 0; res < Res; ++res ) oe += sprintf(oe, "\n[" COUNT "] " REAL " +- " REAL, ++comp, res->avg, res->err); Print(out); }