X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=fairymax.c;h=47b9ca596e99e58423b5488783e59a5716cabdd5;hb=9448cbd851e7d2557853e7b3c2c6fa7b9eccbd19;hp=83002e538d0526cf796063384c5eb097906a8697;hpb=28d45d9a9d1df30f7230bbdbbec81e3eb9c9276c;p=fairymax.git diff --git a/fairymax.c b/fairymax.c index 83002e5..47b9ca5 100644 --- a/fairymax.c +++ b/fairymax.c @@ -32,13 +32,24 @@ #ifdef WIN32 # include +# define CPUtime 1000.*clock #else # include +# include +# include int GetTickCount() // with thanks to Tord { struct timeval t; gettimeofday(&t, NULL); return t.tv_sec*1000 + t.tv_usec/1000; } + double CPUtime() + { // get CPU time used by process, converted to 'MILLICLOCKS' + struct tms cpuTimes; + static int cps = 0; + if(!cps) cps = sysconf(_SC_CLK_TCK); + times(&cpuTimes); + return ((double)(cpuTimes.tms_utime + cpuTimes.tms_stime) * CLOCKS_PER_SEC * 1000)/cps; + } #endif int StartKey; @@ -68,10 +79,10 @@ int StartKey; #endif /* make unique integer from engine move representation */ -#define PACK_MOVE 256*K + L + (PromPiece << 16); +#define PACK_MOVE 256*K + L + (PromPiece << 16) + (GT<<24); /* convert intger argument back to engine move representation */ -#define UNPACK_MOVE(A) K = (A)>>8 & 255; L = (A) & 255; PromPiece = (A)>>16 & 255; +#define UNPACK_MOVE(A) K = (A)>>8 & 255; L = (A) & 255; PromPiece = (A)>>16 & 255; GT = (A)>>24 & 255; /* Global variables visible to engine. Normally they */ /* would be replaced by the names under which these */ @@ -129,7 +140,7 @@ n[]=".*XKNBRQEWFMACHG?x+knbrqewfmachg"; /* piece symbols on printout*/ int pv[10000],*sp=pv; // triangular array int margin; -pboard() +void pboard() {int i; i=-1;W(++i<128)printf(" %c",(i&15)==BW&&(i+=15-BW)?10:n[b[i]&31]); } @@ -140,7 +151,7 @@ int k,q,l,e,E,z,n; /* (q,l)=window, e=current eval. score, E=e.p. sqr.*/ { /* e=score, z=prev.dest; J,Z=hashkeys; return score*/ int j,r,m,v,d,h,i,F,G,P,V,f=J,g=Z,C,s,flag,FF,*ps=sp,kk=S; signed char t,p,u,x,y,X,Y,H,B,gt; - struct _*a=A+(J+(k+S)*E&U-1); /* lookup pos. in hash table*/ + struct _*a=A+(J+(k+S)*E&U); /* lookup pos. in hash table*/ *sp++=0; q-=qD;m=a->V;X=a->F;Y=a->Y; /* resume at stored depth */ @@ -313,7 +324,7 @@ if(z&4*S)K=X,L=Y&~S; int PrintResult(int s) { - int i, j, k, cnt=0; + int j, k, cnt=0; /* search last 50 states with this stm for third repeat */ for(j=2; j<=100 && j <= HistPtr; j+=2) @@ -366,17 +377,15 @@ int PrintResult(int s) } -InitEngine() +void InitEngine() { - int i, j; - N=32*S+7;W(N-->S+3)T[N]=rand()>>9; srand(GetTickCount()); } -InitGame() +void InitGame() { - int i,j,k=0; + int i,k=0; Side = WHITE; Q=0; O=S; Fifty = 0; R = 0; @@ -402,7 +411,7 @@ InitGame() void CopyBoard(int s) { - int i, j, k, cnt=0; + int i, j; /* copy game representation of engine to HistoryBoard */ /* don't forget castling rights and e.p. state! */ @@ -413,7 +422,7 @@ void CopyBoard(int s) void PrintVariants(int combo) { - int i, j, count=0, total=0; char c=EOF+1, buf[80]; + int count=0, total=0; char c=EOF+1, buf[80]; FILE *f; f = fopen(INI_FILE, "r"); @@ -450,7 +459,7 @@ void PrintOptions() printf("feature done=1\n"); } -int LoadGame(char *name) +void LoadGame(char *name) { int i, j, ptc, count=0; char c, buf[80], pieceToChar[80]; static int currentVariant; @@ -520,10 +529,10 @@ int LoadGame(char *name) int main(int argc, char **argv) { - int Computer, MaxTime, MaxMoves, TimeInc, sec, i, j; - char line[256], command[256], c, cc; + int Computer, MaxTime, MaxMoves, TimeInc, sec, i; + char line[256], command[256], c; int m, nr; - FILE *f; + double cpuT; if(argc>1 && sscanf(argv[1], "%d", &m)==1) { U = (1<TimeLeft/15) tlim = TimeLeft/15; @@ -568,12 +578,14 @@ int main(int argc, char **argv) Computer = EMPTY; continue; } else UnderProm = -1; + m = GetTickCount() - Ticks; + printf("# times @ %u: real=%d cpu=%1.0f\n", m + Ticks, m, + (CPUtime() - cpuT)/CLOCKS_PER_SEC); printf("move "); printf("%c%c%c%c",'a'+(K&15),'0'+BH-(K>>4), 'a'+(L&15),'0'+BH-(L>>4)); if(prom)printf("%c",piecename[prom&15]+'a'-1); printf("\n"); - m = GetTickCount() - Ticks; /* time-control accounting */ TimeLeft -= m; @@ -599,7 +611,7 @@ int main(int argc, char **argv) continue; } if (!fgets(line, 256, stdin)) - return; + return 1; if (line[0] == '\n') continue; sscanf(line, "%s", command); @@ -651,7 +663,7 @@ int main(int argc, char **argv) } if (!strcmp(command, "quit")) /* exit engine */ - return; + return 0; if (!strcmp(command, "force")) { /* computer plays neither */ Computer = EMPTY; @@ -732,7 +744,7 @@ int main(int argc, char **argv) if(sscanf(line+7, "Ini File=%s", filename) == 1) { inifile = filename; continue; } - if(sscanf(line+7, "Clear Hash") == 1) for(i=0; iK = 0; + if(sscanf(line+7, "Clear Hash%c", &c) == 1) for(i=0; i<=U; i++) A->K = 0; if(sscanf(line+7, "MultiVariation Margin=%d", &margin) == 1) continue; if(sscanf(line+7, "Variant fairy selects=%s", selectedFairy+6) == 1) continue; if(sscanf(line+7, "Cambodian Makruk rules=%d", &Cambodian) == 1) continue; @@ -869,14 +881,14 @@ int main(int argc, char **argv) GT = (Side == WHITE ? piecetype : blacktype)[line[4]&31]; if(GT) PromPiece = (Side == WHITE ? 7 : 7+pm) - GT, GT |= 32 + Side; {char *c=line; K=c[0]-16*c[1]+799;L=c[2]-16*c[3]+799; } - if (m) + if (m & line[1] != '@') /* doesn't have move syntax */ printf("Error (unknown command): %s\n", command); else { int i=-1; if(b[L] && (b[L]&16) == Side && w[b[L]&15] < 0) // capture own King: castling { i=K; K = L; L = i>L ? i-1 : i+2; } if(w[GT&15] < -1) pl[GT&31]++, J+=89729; // promotion to royal piece - if(b[K]&32) GT = 0; // non-virgin mover => true promotion rather than gating + if((b[K]&15) < 3) GT = 0; // Pawn => true promotion rather than gating if(D(Side,-I,I,Q,O,LL|S,3)!=I) { /* did have move syntax, but illegal move */ printf("Illegal move:%s\n", line);