void Pdb::ExploreKey(ArrayCtrl *a) { if(a && a->IsCursor()) { tab.Set(TAB_EXPLORER); Explore(a->GetKey()); } }
void CBTFootbotRecruiterRootBehavior::Step(CCI_FootBotState& c_robot_state) { // Update Data UpdateFoodData(); UpdateStateData(); // Decide which behaviour to execute switch(m_sStateData.State) { case SStateData::STATE_EXPLORING: { Explore(); break; } case SStateData::STATE_SIGNAL_AND_PICK_UP: { SignalPickUp(); break; } case SStateData::STATE_DROP: { Drop(); break; } case SStateData::STATE_RETURN_TO_NEST: { ReturnToNest(); break; } case SStateData::STATE_GO_TO_FOOD: { GoToFood(); break; } default: { THROW_ARGOSEXCEPTION("Invalid State"); } } }
void Pdb::Explorer() { VectorMap<String, Value> prev = DataMap(explorer); explorer.Clear(); try { String x = ~expexp; if(!IsNull(x)) { CParser p(x); Val v = Exp(p); Vis(explorer, "=", prev, Visualise(v)); if(v.type >= 0 && v.ref == 0 && !v.rvalue) Explore(v, prev); if(v.ref > 0 && GetRVal(v).address) for(int i = 0; i < 20; i++) Vis(explorer, Format("[%d]", i), prev, Visualise(DeRef(Compute(v, RValue(i), '+')))); } } catch(CParser::Error e) { Visual v; v.Cat(e, LtRed); explorer.Add("", RawPickToValue(v)); } exback.Enable(exprev.GetCount()); exfw.Enable(exnext.GetCount()); }
void CFootBotForagingNR::ControlStep() { UpdateState(); switch(StateData.State) { case RESTING: { Rest(); break; } case EXPLORING: { Explore(); break; } case PICKING_UP_ITEM: { StartReturningToNest(); break; } case RETURNING_TO_NEST: { ReturnToNest(); break; } case DROPPING_ITEM: { // No need to search for a resting place; rest where you are. StartResting(); break; } case SEARCHING_RESTING_PLACE: { // We should not arrive here, but just to be sure... StartResting(); break; } default: { LOGERR << "We can't be here, there's a bug!" << std::endl; } } }
void EffectDock::BindSignal(){ bool res = false; res = connect(ui.addFolder,SIGNAL(clicked()),SLOT(AddFolder())); assert(res); res = connect(ui.delFolder,SIGNAL(clicked()),SLOT(DelFolder())); assert(res); res = connect(mpAddFolder,SIGNAL(triggered()),SLOT(AddFolder())); assert(res); res = connect(mpDelFolder,SIGNAL(triggered()),SLOT(DelFolder())); assert(res); res = connect(mpExplore,SIGNAL(triggered()),SLOT(Explore())); assert(res); }
void ObjectDock::BindSignal() { bool res = false; res = connect(ui->addFloder,SIGNAL(clicked()),SLOT(AddFolder()));assert(res); res = connect(ui->delFloder,SIGNAL(clicked()),SLOT(DelFolder()));assert(res); res = connect(mpAddFolder,SIGNAL(triggered()),SLOT(AddFolder())); assert(res); res = connect(mpDelFolder,SIGNAL(triggered()),SLOT(DelFolder())); assert(res); res = connect(mpExplore,SIGNAL(triggered()),SLOT(Explore())); assert(res); res = connect(ui->preview,SIGNAL(clicked(bool)),ui->groupBox,SLOT(setVisible(bool))); assert(res); }
void NetDb::Run () { uint32_t lastTs = 0; m_IsRunning = true; while (m_IsRunning) { try { I2NPMessage * msg = m_Queue.GetNextWithTimeout (10000); // 10 sec if (msg) { while (msg) { if (msg->GetHeader ()->typeID == eI2NPDatabaseStore) { HandleDatabaseStoreMsg (msg->GetPayload (), msg->GetLength ()); // TODO i2p::DeleteI2NPMessage (msg); } else if (msg->GetHeader ()->typeID == eI2NPDatabaseSearchReply) HandleDatabaseSearchReplyMsg (msg); else // WTF? { LogPrint ("NetDb: unexpected message type ", msg->GetHeader ()->typeID); i2p::HandleI2NPMessage (msg); } msg = m_Queue.Get (); } } else // if no new DatabaseStore coming, explore it Explore (); uint32_t ts = i2p::util::GetSecondsSinceEpoch (); if (ts - lastTs >= 60) // save routers every minute { if (lastTs) SaveUpdated ("netDb"); lastTs = ts; } } catch (std::exception& ex) { LogPrint ("NetDb: ", ex.what ()); } } }
void CFootBotForaging::ControlStep() { switch(m_sStateData.State) { case SStateData::STATE_RESTING: { Rest(); break; } case SStateData::STATE_EXPLORING: { Explore(); break; } case SStateData::STATE_RETURN_TO_NEST: { ReturnToNest(); break; } default: { LOGERR << "We can't be here, there's a bug!" << std::endl; } } }
static void Iterate(This *t, count iregion, cint depth, cint isamples, Totals *totals) { csize_t regionsize = RegionSize; Region *parent, *region; typedef struct { real avg, err, spread, spreadsq; } Corr; Vector(Corr, corr, NCOMP); Corr *c, *C = corr + t->ncomp; Result *res; count ireg, mreg = iregion; count comp, maxsplit; int last, idest, isrc; region = RegionPtr(iregion); region->depth = depth; region->next = -iregion - 1; if( isamples < 0 ) Split(t, iregion); else { region->isamples = isamples; ExploreSerial(t, iregion); } ireg = iregion + RegionPtr(iregion)->next; do { region = RegionPtr(ireg); if( region->depth > 0 ) { --region->depth; FORK_ONLY(more:) ireg = Explore(t, ireg); if( ireg == -1 ) return; region = RegionPtr(ireg); } if( region->depth < 0 ) mreg = IMax(mreg, ireg); ireg += region->next; } while( ireg > 0 );
void Pdb::ExpExp() { if(explorer.GetCursor() > 0) Explore(GetExpExp()); }
static int Integrate(This *t, real *integral, real *error, real *prob) { TYPEDEFREGION; Totals totals[NCOMP]; real nneed, weight; count dim, comp, iter, pass = 0, err, iregion; number nwant, nmin = INT_MAX; int fail; if( VERBOSE > 1 ) { char s[512]; sprintf(s, "Divonne 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" " key1 %d\n key2 %d\n key3 %d\n maxpass " COUNT "\n" " border " REAL "\n maxchisq " REAL "\n mindeviation " REAL "\n" " ngiven " NUMBER "\n nextra " NUMBER, t->ndim, t->ncomp, t->epsrel, t->epsabs, t->flags, t->seed, t->mineval, t->maxeval, t->key1, t->key2, t->key3, t->maxpass, t->border.lower, t->maxchisq, t->mindeviation, t->ngiven, t->nextra); Print(s); } if( BadComponent(t) ) return -2; if( BadDimension(t, t->key1) || BadDimension(t, t->key2) || ((t->key3 & -2) && BadDimension(t, t->key3)) ) return -1; t->neval_opt = t->neval_cut = 0; t->size = CHUNKSIZE; MemAlloc(t->voidregion, t->size*sizeof(Region)); for( dim = 0; dim < t->ndim; ++dim ) { Bounds *b = &RegionPtr(0)->bounds[dim]; b->lower = 0; b->upper = 1; } RuleIni(&t->rule7); RuleIni(&t->rule9); RuleIni(&t->rule11); RuleIni(&t->rule13); SamplesIni(&t->samples[0]); SamplesIni(&t->samples[1]); SamplesIni(&t->samples[2]); if( (fail = setjmp(t->abort)) ) goto abort; t->epsabs = Max(t->epsabs, NOTZERO); /* Step 1: partition the integration region */ if( VERBOSE ) Print("Partitioning phase:"); if( IsSobol(t->key1) || IsSobol(t->key2) || IsSobol(t->key3) ) IniRandom(t); SamplesLookup(t, &t->samples[0], t->key1, (number)47, (number)INT_MAX, (number)0); SamplesAlloc(t, &t->samples[0]); t->totals = totals; Zap(totals); t->phase = 1; Explore(t, 0, &t->samples[0], INIDEPTH, 1); for( iter = 1; ; ++iter ) { Totals *maxtot; count valid; for( comp = 0; comp < t->ncomp; ++comp ) { Totals *tot = &totals[comp]; tot->avg = tot->spreadsq = 0; tot->spread = tot->secondspread = -INFTY; } for( iregion = 0; iregion < t->nregions; ++iregion ) { Region *region = RegionPtr(iregion); for( comp = 0; comp < t->ncomp; ++comp ) { cResult *r = ®ion->result[comp]; Totals *tot = &totals[comp]; tot->avg += r->avg; tot->spreadsq += Sq(r->spread); if( r->spread > tot->spread ) { tot->secondspread = tot->spread; tot->spread = r->spread; tot->iregion = iregion; } else if( r->spread > tot->secondspread ) tot->secondspread = r->spread; } } maxtot = totals; valid = 0; for( comp = 0; comp < t->ncomp; ++comp ) { Totals *tot = &totals[comp]; integral[comp] = tot->avg; valid += tot->avg == tot->avg; if( tot->spreadsq > maxtot->spreadsq ) maxtot = tot; tot->spread = sqrt(tot->spreadsq); error[comp] = tot->spread*t->samples[0].weight; } if( VERBOSE ) { char s[128 + 64*NCOMP], *p = s; p += sprintf(p, "\n" "Iteration " COUNT " (pass " COUNT "): " COUNT " regions\n" NUMBER7 " integrand evaluations so far,\n" NUMBER7 " in optimizing regions,\n" NUMBER7 " in finding cuts", iter, pass, t->nregions, t->neval, t->neval_opt, t->neval_cut); for( comp = 0; comp < t->ncomp; ++comp ) p += sprintf(p, "\n[" COUNT "] " REAL " +- " REAL, comp + 1, integral[comp], error[comp]); Print(s); } if( valid == 0 ) goto abort; /* all NaNs */ if( t->neval > t->maxeval ) break; nneed = maxtot->spread/MaxErr(maxtot->avg); if( nneed < MAXPRIME ) { cnumber n = t->neval + t->nregions*(number)ceil(nneed); if( n < nmin ) { nmin = n; pass = 0; } else if( ++pass > t->maxpass && n >= t->mineval ) break; } Split(t, maxtot->iregion, DEPTH); } /* Step 2: do a "full" integration on each region */ /* nneed = t->samples[0].neff + 1; */ nneed = 2*t->samples[0].neff; for( comp = 0; comp < t->ncomp; ++comp ) { Totals *tot = &totals[comp]; creal maxerr = MaxErr(tot->avg); tot->nneed = tot->spread/maxerr; nneed = Max(nneed, tot->nneed); tot->maxerrsq = Sq(maxerr); tot->mindevsq = tot->maxerrsq*Sq(t->mindeviation); } nwant = (number)Min(ceil(nneed), MARKMASK/40.); err = SamplesLookup(t, &t->samples[1], t->key2, nwant, (t->maxeval - t->neval)/t->nregions + 1, t->samples[0].n + 1); /* the number of points needed to reach the desired accuracy */ fail = Unmark(err)*t->nregions; if( Marked(err) ) { if( VERBOSE ) Print("\nNot enough samples left for main integration."); for( comp = 0; comp < t->ncomp; ++comp ) prob[comp] = -999; weight = t->samples[0].weight; } else { bool can_adjust = (t->key3 == 1 && t->samples[1].sampler != SampleRule && (t->key2 < 0 || t->samples[1].neff < MAXPRIME)); count df, nlimit; SamplesAlloc(t, &t->samples[1]); if( VERBOSE ) { char s[128]; sprintf(s, "\nMain integration on " COUNT " regions with " NUMBER " samples per region.", t->nregions, t->samples[1].neff); Print(s); } ResClear(integral); ResClear(error); ResClear(prob); nlimit = t->maxeval - t->nregions*t->samples[1].n; df = 0; for( iregion = 0; iregion < t->nregions; ++iregion ) { Region *region = RegionPtr(iregion); char s[64*NDIM + 256*NCOMP], *p = s; int todo; refine: t->phase = 2; t->samples[1].sampler(t, &t->samples[1], region->bounds, region->vol); if( can_adjust ) for( comp = 0; comp < t->ncomp; ++comp ) totals[comp].spreadsq -= Sq(region->result[comp].spread); nlimit += t->samples[1].n; todo = 0; for( comp = 0; comp < t->ncomp; ++comp ) { cResult *r = ®ion->result[comp]; Totals *tot = &totals[comp]; t->samples[0].avg[comp] = r->avg; t->samples[0].err[comp] = r->err; if( t->neval < nlimit ) { creal avg2 = t->samples[1].avg[comp]; creal err2 = t->samples[1].err[comp]; creal diffsq = Sq(avg2 - r->avg); #define Var(s) Sq((s.err[comp] == 0) ? r->spread*s.weight : s.err[comp]) if( err2*tot->nneed > r->spread || diffsq > Max(t->maxchisq*(Var(t->samples[0]) + Var(t->samples[1])), EPS*Sq(avg2)) ) { if( t->key3 && diffsq > tot->mindevsq ) { if( t->key3 == 1 ) { ccount xregion = t->nregions; if( VERBOSE > 2 ) Print("\nSplit"); t->phase = 1; Explore(t, iregion, &t->samples[1], POSTDEPTH, 2); if( can_adjust ) { number nnew; count ireg, xreg; for( ireg = iregion, xreg = xregion; ireg < t->nregions; ireg = xreg++ ) { cResult *result = RegionPtr(ireg)->result; count c; for( c = 0; c < t->ncomp; ++c ) totals[c].spreadsq += Sq(result[c].spread); } nnew = (tot->spreadsq/Sq(MARKMASK) > tot->maxerrsq) ? MARKMASK : (number)ceil(sqrt(tot->spreadsq/tot->maxerrsq)); if( nnew > nwant + nwant/64 ) { ccount err = SamplesLookup(t, &t->samples[1], t->key2, nnew, (t->maxeval - t->neval)/t->nregions + 1, t->samples[1].n); fail += Unmark(err)*t->nregions; nwant = nnew; SamplesFree(&t->samples[1]); SamplesAlloc(t, &t->samples[1]); if( t->key2 > 0 && t->samples[1].neff >= MAXPRIME ) can_adjust = false; if( VERBOSE > 2 ) { char s[128]; sprintf(s, "Sampling remaining " COUNT " regions with " NUMBER " points per region.", t->nregions, t->samples[1].neff); Print(s); } } } goto refine; } todo |= 3; } todo |= 1; } } } if( can_adjust ) { for( comp = 0; comp < t->ncomp; ++comp ) totals[comp].maxerrsq -= Sq(region->result[comp].spread*t->samples[1].weight); } switch( todo ) { case 1: /* get spread right */ Explore(t, iregion, &t->samples[1], 0, 2); break; case 3: /* sample region again with more points */ if( SamplesIniQ(&t->samples[2]) ) { SamplesLookup(t, &t->samples[2], t->key3, nwant, (number)INT_MAX, (number)0); SamplesAlloc(t, &t->samples[2]); } t->phase = 3; t->samples[2].sampler(t, &t->samples[2], region->bounds, region->vol); Explore(t, iregion, &t->samples[2], 0, 2); ++region->depth; /* misused for df here */ ++df; } ++region->depth; /* misused for df here */ if( VERBOSE > 2 ) { 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 ) { Result *r = ®ion->result[comp]; creal x1 = t->samples[0].avg[comp]; creal s1 = Var(t->samples[0]); creal x2 = t->samples[1].avg[comp]; creal s2 = Var(t->samples[1]); creal r2 = (s1 == 0) ? Sq(t->samples[1].neff*t->samples[0].weight) : s2/s1; real norm = 1 + r2; real avg = x2 + r2*x1; real sigsq = s2; real chisq = Sq(x2 - x1); real chiden = s1 + s2; if( todo == 3 ) { creal x3 = t->samples[2].avg[comp]; creal s3 = Var(t->samples[2]); creal r3 = (s2 == 0) ? Sq(t->samples[2].neff*t->samples[1].weight) : s3/s2; norm = 1 + r3*norm; avg = x3 + r3*avg; sigsq = s3; chisq = s1*Sq(x3 - x2) + s2*Sq(x3 - x1) + s3*chisq; chiden = s1*s2 + s3*chiden; } avg = LAST ? r->avg : (sigsq *= norm = 1/norm, avg*norm); if( chisq > EPS ) chisq /= Max(chiden, NOTZERO); #define Out(s) s.avg[comp], r->spread*s.weight, s.err[comp] if( VERBOSE > 2 ) { p += sprintf(p, "\n[" COUNT "] " REAL " +- " REAL "(" REAL ")\n " REAL " +- " REAL "(" REAL ")", comp + 1, Out(t->samples[0]), Out(t->samples[1])); if( todo == 3 ) p += sprintf(p, "\n " REAL " +- " REAL "(" REAL ")", Out(t->samples[2])); p += sprintf(p, " \tchisq " REAL, chisq); } integral[comp] += avg; error[comp] += sigsq; prob[comp] += chisq; r->avg = avg; r->spread = sqrt(sigsq); r->chisq = chisq; } if( VERBOSE > 2 ) Print(s); } for( comp = 0; comp < t->ncomp; ++comp ) error[comp] = sqrt(error[comp]); df += t->nregions; if( VERBOSE > 2 ) { char s[16 + 128*NCOMP], *p = s; p += sprintf(p, "\nTotals:"); for( comp = 0; comp < t->ncomp; ++comp ) p += sprintf(p, "\n[" COUNT "] " REAL " +- " REAL " \tchisq " REAL " (" COUNT " df)", comp + 1, integral[comp], error[comp], prob[comp], df); Print(s); } for( comp = 0; comp < t->ncomp; ++comp ) prob[comp] = ChiSquare(prob[comp], df); weight = 1; } #ifdef MLVERSION if( REGIONS ) { MLPutFunction(stdlink, "List", 2); MLPutFunction(stdlink, "List", t->nregions); for( iregion = 0; iregion < t->nregions; ++iregion ) { Region *region = RegionPtr(iregion); cBounds *b = region->bounds; real lower[NDIM], upper[NDIM]; for( dim = 0; dim < t->ndim; ++dim ) { lower[dim] = b[dim].lower; upper[dim] = b[dim].upper; } MLPutFunction(stdlink, "Cuba`Divonne`region", 4); MLPutRealList(stdlink, lower, t->ndim); MLPutRealList(stdlink, upper, t->ndim); MLPutFunction(stdlink, "List", t->ncomp); for( comp = 0; comp < t->ncomp; ++comp ) { cResult *r = ®ion->result[comp]; real res[] = {r->avg, r->spread*weight, r->chisq}; MLPutRealList(stdlink, res, Elements(res)); } MLPutInteger(stdlink, region->depth); /* misused for df */ } } #endif abort: SamplesFree(&t->samples[2]); SamplesFree(&t->samples[1]); SamplesFree(&t->samples[0]); RuleFree(&t->rule13); RuleFree(&t->rule11); RuleFree(&t->rule9); RuleFree(&t->rule7); free(t->voidregion); return fail; }
int* BFSNeo::SearchFor(int startNode, int endNode, Morpheus* morpheyIn, int* outNum) { SearchNode* firstNode; int i; searchCompleteFlag=0; extremityTicker=0; morphey=morpheyIn; OldExtremities=new SearchNode*[200]; NewExtremities=new SearchNode*[200]; SolutionArray=new int[200]; printf("Initialising\n"); for(i=0;i<200;i++) { OldExtremities[i]=NULL; NewExtremities[i]=NULL; SolutionArray[i]=0; } firstNode=new SearchNode(startNode,NULL); //cause it's the first node OldExtremities[0]=firstNode; printf("Setup complete, beginning search...\n"); while(searchCompleteFlag==0) { printf("Starting new loop\n"); extremityTicker=0; printf("Extremity Nodes are:\n"); for(i=0;i<200;i++) { if(OldExtremities[i]!=NULL) { printf("%d\n",OldExtremities[i]->CheckNumber()); } } for(i=0;i<200;i++) { if(OldExtremities[i]!=NULL) { printf("Searching extremity %d\n",OldExtremities[i]->CheckNumber()); Explore(OldExtremities[i],endNode); } if(searchCompleteFlag==1) { printf("BFSNeo :: Hold up a sec\n"); break; } } if(searchCompleteFlag==1) { printf("BFSNeo :: Found the spoon\n"); continue; } //OldExtremities=NewExtremities; Better idea memcpy(OldExtremities, NewExtremities, sizeof(SearchNode*)*200); NewExtremities=new SearchNode*[200]; printf("resetting for next loop...\n"); for(i=0;i<200;i++) { NewExtremities[i]=NULL; } } printf("Search complete\n"); delete firstNode; //Set the tree on fire, just causally.... *outNum=num; return SolutionArray; }
static int Integrate(creal epsrel, creal epsabs, cint flags, cnumber mineval, cnumber maxeval, int key1, int key2, int key3, ccount maxpass, creal maxchisq, creal mindeviation, real *integral, real *error, real *prob) { TYPEDEFREGION; Region anchor, *region; Totals totals[NCOMP]; real nneed, weight; count dim, comp, iter, nregions, pass = 0, err; number nwant, nmin = INT_MAX; int fail = -1; if( VERBOSE > 1 ) { char s[512]; sprintf(s, "Divonne input parameters:\n" " ndim " COUNT "\n ncomp " COUNT "\n" " epsrel " REAL "\n epsabs " REAL "\n" " flags %d\n mineval " NUMBER "\n maxeval " NUMBER "\n" " key1 %d\n key2 %d\n key3 %d\n maxpass " COUNT "\n" " border " REAL "\n maxchisq " REAL "\n mindeviation " REAL "\n" " ngiven " NUMBER "\n nextra " NUMBER "\n", ndim_, ncomp_, epsrel, epsabs, flags, mineval, maxeval, key1, key2, key3, maxpass, border_.lower, maxchisq, mindeviation, ngiven_, nextra_); Print(s); } anchor.next = NULL; for( dim = 0; dim < ndim_; ++dim ) { Bounds *b = &anchor.bounds[dim]; b->lower = 0; b->upper = 1; } RuleIni(&rule7_); RuleIni(&rule9_); RuleIni(&rule11_); RuleIni(&rule13_); SamplesIni(&samples_[0]); SamplesIni(&samples_[1]); SamplesIni(&samples_[2]); #ifdef MLVERSION if( setjmp(abort_) ) goto abort; #endif /* Step 1: partition the integration region */ if( VERBOSE ) Print("Partitioning phase:"); if( IsSobol(key1) || IsSobol(key2) || IsSobol(key3) ) IniRandom(2*maxeval, flags); SamplesLookup(&samples_[0], key1, (number)47, (number)INT_MAX, (number)0); SamplesAlloc(&samples_[0]); totals_ = totals; Zap(totals); phase_ = 1; Explore(&anchor, &samples_[0], INIDEPTH, 1); for( iter = 1; ; ++iter ) { Totals *maxtot; for( comp = 0; comp < ncomp_; ++comp ) { Totals *tot = &totals[comp]; tot->avg = tot->spreadsq = 0; tot->spread = tot->secondspread = -INFTY; } nregions = 0; for( region = anchor.next; region; region = region->next ) { ++nregions; for( comp = 0; comp < ncomp_; ++comp ) { cResult *r = ®ion->result[comp]; Totals *tot = &totals[comp]; tot->avg += r->avg; tot->spreadsq += Sq(r->spread); if( r->spread > tot->spread ) { tot->secondspread = tot->spread; tot->spread = r->spread; tot->region = region; } else if( r->spread > tot->secondspread ) tot->secondspread = r->spread; } } maxtot = totals; for( comp = 0; comp < ncomp_; ++comp ) { Totals *tot = &totals[comp]; integral[comp] = tot->avg; if( tot->spreadsq > maxtot->spreadsq ) maxtot = tot; tot->spread = sqrt(tot->spreadsq); error[comp] = tot->spread*samples_[0].weight; } if( VERBOSE ) { char s[128 + 64*NCOMP], *p = s; p += sprintf(p, "\n" "Iteration " COUNT " (pass " COUNT "): " COUNT " regions\n" NUMBER7 " integrand evaluations so far,\n" NUMBER7 " in optimizing regions,\n" NUMBER7 " in finding cuts", iter, pass, nregions, neval_, neval_opt_, neval_cut_); for( comp = 0; comp < ncomp_; ++comp ) p += sprintf(p, "\n[" COUNT "] " REAL " +- " REAL, comp + 1, integral[comp], error[comp]); Print(s); } if( neval_ > maxeval ) break; nneed = maxtot->spread/MaxErr(maxtot->avg); if( nneed < MAXPRIME ) { cnumber n = neval_ + nregions*(number)ceil(nneed); if( n < nmin ) { nmin = n; pass = 0; } else if( ++pass > maxpass && n >= mineval ) break; } Split(maxtot->region, DEPTH); } /* Step 2: do a "full" integration on each region */ /* nneed = samples_[0].neff + 1; */ nneed = 2*samples_[0].neff; for( comp = 0; comp < ncomp_; ++comp ) { Totals *tot = &totals[comp]; creal maxerr = MaxErr(tot->avg); tot->nneed = tot->spread/maxerr; nneed = Max(nneed, tot->nneed); tot->maxerrsq = Sq(maxerr); tot->mindevsq = tot->maxerrsq*Sq(mindeviation); } nwant = (number)Min(ceil(nneed), MARKMASK/40.); err = SamplesLookup(&samples_[1], key2, nwant, (maxeval - neval_)/nregions + 1, samples_[0].n + 1); /* the number of points needed to reach the desired accuracy */ fail = Unmark(err)*nregions; if( Marked(err) ) { if( VERBOSE ) Print("\nNot enough samples left for main integration."); for( comp = 0; comp < ncomp_; ++comp ) prob[comp] = -999; weight = samples_[0].weight; nregions_ = nregions; } else { bool can_adjust = (key3 == 1 && samples_[1].sampler != SampleRule && (key2 < 0 || samples_[1].neff < MAXPRIME)); count df, nlimit; SamplesAlloc(&samples_[1]); if( VERBOSE ) { char s[128]; sprintf(s, "\nMain integration on " COUNT " regions with " NUMBER " samples per region.", nregions, samples_[1].neff); Print(s); } ResClear(integral); ResClear(error); ResClear(prob); nlimit = maxeval - nregions*samples_[1].n; df = nregions_ = 0; for( region = anchor.next; region; region = region->next ) { char s[64*NDIM + 256*NCOMP], *p = s; int todo; refine: phase_ = 2; samples_[1].sampler(&samples_[1], region->bounds, region->vol); if( can_adjust ) { --nregions; for( comp = 0; comp < ncomp_; ++comp ) totals[comp].spreadsq -= Sq(region->result[comp].spread); } nlimit += samples_[1].n; todo = 0; for( comp = 0; comp < ncomp_; ++comp ) { cResult *r = ®ion->result[comp]; Totals *tot = &totals[comp]; samples_[0].avg[comp] = r->avg; samples_[0].err[comp] = r->err; if( neval_ < nlimit ) { creal avg2 = samples_[1].avg[comp]; creal err2 = samples_[1].err[comp]; creal diffsq = Sq(avg2 - r->avg); #define Var(s) Sq((s.err[comp] == 0) ? r->spread*s.weight : s.err[comp]) if( err2*tot->nneed > r->spread || diffsq > Max(maxchisq*(Var(samples_[0]) + Var(samples_[1])), EPS*Sq(avg2)) ) { if( key3 && diffsq > tot->mindevsq ) { if( key3 == 1 ) { const Region *next = region->next; if( VERBOSE > 2 ) Print("\nSplit"); phase_ = 1; Explore(region, &samples_[1], POSTDEPTH, 2); if( can_adjust ) { number nnew; Region *child; for( child = region; child != next; child = child->next ) { count c; for( c = 0; c < ncomp_; ++c ) totals[c].spreadsq += Sq(child->result[c].spread); ++nregions; } nnew = (tot->spreadsq/Sq(MARKMASK) > tot->maxerrsq) ? MARKMASK : (number)ceil(sqrt(tot->spreadsq/tot->maxerrsq)); if( nnew > nwant + nwant/64 ) { ccount err = SamplesLookup(&samples_[1], key2, nnew, (maxeval - neval_)/nregions + 1, samples_[1].n); fail += Unmark(err)*nregions; nwant = nnew; SamplesFree(&samples_[1]); SamplesAlloc(&samples_[1]); if( key2 > 0 && samples_[1].neff >= MAXPRIME ) can_adjust = false; if( VERBOSE > 2 ) { char s[128]; sprintf(s, "Sampling remaining " COUNT " regions with " NUMBER " points per region.", nregions, samples_[1].neff); Print(s); } } } goto refine; } todo |= 3; } todo |= 1; } } } if( can_adjust ) { for( comp = 0; comp < ncomp_; ++comp ) totals[comp].maxerrsq -= Sq(region->result[comp].spread*samples_[1].weight); } switch( todo ) { case 1: /* get spread right */ Explore(region, &samples_[1], 0, 2); break; case 3: /* sample region again with more points */ if( MEM(&samples_[2]) == NULL ) { SamplesLookup(&samples_[2], key3, nwant, (number)INT_MAX, (number)0); SamplesAlloc(&samples_[2]); } phase_ = 3; samples_[2].sampler(&samples_[2], region->bounds, region->vol); Explore(region, &samples_[2], 0, 2); ++region->depth; /* misused for df here */ ++df; } ++region->depth; /* misused for df here */ ++nregions_; if( VERBOSE > 2 ) { for( dim = 0; dim < 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 < ncomp_; ++comp ) { Result *r = ®ion->result[comp]; creal x1 = samples_[0].avg[comp]; creal s1 = Var(samples_[0]); creal x2 = samples_[1].avg[comp]; creal s2 = Var(samples_[1]); creal r2 = (s1 == 0) ? Sq(samples_[1].neff*samples_[0].weight) : s2/s1; real norm = 1 + r2; real avg = x2 + r2*x1; real sigsq = s2; real chisq = Sq(x2 - x1); real chiden = s1 + s2; if( todo == 3 ) { creal x3 = samples_[2].avg[comp]; creal s3 = Var(samples_[2]); creal r3 = (s2 == 0) ? Sq(samples_[2].neff*samples_[1].weight) : s3/s2; norm = 1 + r3*norm; avg = x3 + r3*avg; sigsq = s3; chisq = s1*Sq(x3 - x2) + s2*Sq(x3 - x1) + s3*chisq; chiden = s1*s2 + s3*chiden; } avg = LAST ? r->avg : (sigsq *= norm = 1/norm, avg*norm); if( chisq > EPS ) chisq /= Max(chiden, NOTZERO); #define Out(s) s.avg[comp], r->spread*s.weight, s.err[comp] if( VERBOSE > 2 ) { p += sprintf(p, "\n[" COUNT "] " REAL " +- " REAL "(" REAL ")\n " REAL " +- " REAL "(" REAL ")", comp + 1, Out(samples_[0]), Out(samples_[1])); if( todo == 3 ) p += sprintf(p, "\n " REAL " +- " REAL "(" REAL ")", Out(samples_[2])); p += sprintf(p, " \tchisq " REAL, chisq); } integral[comp] += avg; error[comp] += sigsq; prob[comp] += chisq; r->avg = avg; r->spread = sqrt(sigsq); r->chisq = chisq; } if( VERBOSE > 2 ) Print(s); } for( comp = 0; comp < ncomp_; ++comp ) error[comp] = sqrt(error[comp]); df += nregions_; if( VERBOSE > 2 ) { char s[16 + 128*NCOMP], *p = s; p += sprintf(p, "\nTotals:"); for( comp = 0; comp < ncomp_; ++comp ) p += sprintf(p, "\n[" COUNT "] " REAL " +- " REAL " \tchisq " REAL " (" COUNT " df)", comp + 1, integral[comp], error[comp], prob[comp], df); Print(s); } for( comp = 0; comp < ncomp_; ++comp ) prob[comp] = ChiSquare(prob[comp], df); weight = 1; } #ifdef MLVERSION if( REGIONS ) { MLPutFunction(stdlink, "List", 2); MLPutFunction(stdlink, "List", nregions_); for( region = anchor.next; region; region = region->next ) { cBounds *b = region->bounds; real lower[NDIM], upper[NDIM]; for( dim = 0; dim < ndim_; ++dim ) { lower[dim] = b[dim].lower; upper[dim] = b[dim].upper; } MLPutFunction(stdlink, "Cuba`Divonne`region", 4); MLPutRealList(stdlink, lower, ndim_); MLPutRealList(stdlink, upper, ndim_); MLPutFunction(stdlink, "List", ncomp_); for( comp = 0; comp < ncomp_; ++comp ) { cResult *r = ®ion->result[comp]; real res[] = {r->avg, r->spread*weight, r->chisq}; MLPutRealList(stdlink, res, Elements(res)); } MLPutInteger(stdlink, region->depth); /* misused for df */ } } #endif #ifdef MLVERSION abort: #endif SamplesFree(&samples_[2]); SamplesFree(&samples_[1]); SamplesFree(&samples_[0]); RuleFree(&rule13_); RuleFree(&rule11_); RuleFree(&rule9_); RuleFree(&rule7_); for( region = anchor.next; region; ) { Region *next = region->next; free(region); region = next; } return fail; }
static void Split(This *t, count iregion, int depth) { TYPEDEFREGION; Cut cut[2*NDIM]; Errors errors[NCOMP]; count comp, ncut, nsplit, xregion, ireg, xreg; real tmp; { Region *const region = RegionPtr(iregion); t->selectedcomp = region->cutcomp; t->neval_cut -= t->neval; ncut = FindCuts(t, cut, region->bounds, region->vol, (real *)region->result + region->xmajor, region->fmajor, region->fmajor - region->fminor); t->neval_cut += t->neval; for( comp = 0; comp < t->ncomp; ++comp ) { Errors *e = &errors[comp]; e->diff = region->result[comp].avg; e->spread = e->err = 0; } } xregion = t->nregions; depth -= ncut; if( Explore(t, iregion, &t->samples[0], depth, 1) ) { Cut *c; for( c = cut; ncut--; ++c ) { real *b = (real *)RegionPtr(iregion)->bounds; ccount c0 = c->i, c1 = c0 ^ 1; creal tmp = b[c1]; b[c1] = b[c0]; b[c0] = c->save; if( !Explore(t, iregion, &t->samples[0], depth++, ncut != 0) ) break; if( ncut ) ((real *)RegionPtr(iregion)->bounds)[c1] = tmp; } } nsplit = t->nregions - xregion + 1; for( ireg = iregion, xreg = xregion; ireg < t->nregions; ireg = xreg++ ) { cResult *result = RegionPtr(ireg)->result; for( comp = 0; comp < t->ncomp; ++comp ) { cResult *r = &result[comp]; Errors *e = &errors[comp]; e->diff -= r->avg; e->err += r->err; e->spread += Sq(r->spread); } } tmp = 1./nsplit; for( comp = 0; comp < t->ncomp; ++comp ) { Errors *e = &errors[comp]; e->diff = tmp*fabs(e->diff); e->err = (e->err == 0) ? 1 : 1 + e->diff/e->err; e->spread = (e->spread == 0) ? 1 : 1 + e->diff/sqrt(e->spread); } tmp = 1 - tmp; for( ireg = iregion, xreg = xregion; ireg < t->nregions; ireg = xreg++ ) { Result *result = RegionPtr(ireg)->result; for( comp = 0; comp < t->ncomp; ++comp ) { Result *r = &result[comp]; cErrors *e = &errors[comp]; creal c = tmp*e->diff; if( r->err > 0 ) r->err = r->err*e->err + c; r->spread = r->spread*e->spread + c*t->samples[0].neff; } } }