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; }
inline int MinValuePruning(Board* state, int turn, int alpha, int beta, int level, clock_t st){ if(CutOffTest1(state, level, st)){ return state->getValue(); } BoardQueue *q; q = state->successor(turn); // cout << endl; while(!q->isEmpty()){ Board* s = q->dequeue(); beta = Min1(beta, MaxValuePruning(s,changeTurn1(turn), alpha, beta, level, st)); delete s; if(beta <= alpha){ while(!q->isEmpty()){ Board* s = q->dequeue(); delete s; } delete q; return alpha; } // cout << "Minimum : " << beta; // s->draw(); } delete q; return beta; }
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; }
void Reassign_Weight() { int i,j; int is,id; double sumprob,maxprob,minprob; for (i=1;i<(nbin+1);i++) { if (tmpnpar[i]!=0) { sumprob=0; for (j=1;j<(tmpnpar[i]+1);j++) { sumprob+=tmppar[i][j].prob; } if (sumprob!=0) { maxprob=sumprob/npar[i]*sqrt(mmratio); minprob=sumprob/npar[i]/sqrt(mmratio); Min1(i); while (tmppar[i][tmpnpar[i]].prob<minprob) { Min2(i); COMB(i); Min1(i); } Max(i); while (tmppar[i][1].prob>maxprob) { SPLIT(i); Max(i); } while (tmpnpar[i]>npar[i]) { Min1(i); Min2(i); COMB(i); } while (tmpnpar[i]<npar[i]) { Max(i); SPLIT(i); } for (j=1;j<(npar[i]+1);j++) { par[i][j].prob=tmppar[i][j].prob; par[i][j].coord=tmppar[i][j].coord; par[i][j].numb=tmppar[i][j].numb; par[i][j].tb0=tmppar[i][j].tb0; par[i][j].distA=tmppar[i][j].distA; par[i][j].distB=tmppar[i][j].distB; } } } else { for (j=1;j<(npar[i]+1);j++) { if (Fava[0]!=0) { par[i][j].numb=Fava[Fava[0]]; Fava[0]-=1; } else { Fexc[0].i+=1; Fexc[0].j+=1; Fexc[Fexc[0].i].i=i; Fexc[Fexc[0].i].j=j; par[i][j].numb=Fexc[0].i+nallpar; } } Make_Ghost(i); } } while(Fexc[0].i!=0) { if (Fexc[0].i!=Fava[0]) { printf("Fava=%d\tFexc=%d!\n",Fava[0],Fexc[0].i); for (j=1;j<(Fava[0]+1);j++) { printf("Fava[%d]=%d\n",j,Fava[j]); } printf("Something is wrong!\n"); exit(1); } is=Fexc[0].i; id=Fava[is]; par[Fexc[is].i][Fexc[is].j].numb=id; is+=nallpar; free(rx_states[id-1]); rx_states[id-1]=(int *)malloc(nspecies*sizeof(int)); memcpy(rx_states[id-1],rx_states[is-1],nspecies*sizeof(int)); free(rx_states[is-1]); rx_states[is-1]=(int *)malloc(nspecies*sizeof(int)); Fexc[0].i-=1; Fexc[0].j-=1; Fava[0]-=1; } return; }