Author: Uri Blass
Date: 14:38:19 12/11/04
Go up one level in this thread
On December 11, 2004 at 16:56:44, Ross Boyd wrote: >On December 11, 2004 at 15:41:22, Uri Blass wrote: > >>On December 11, 2004 at 04:34:03, Michel Langeveld wrote: >> >>>To probe a tablebase you need to setup some arrays. >>> >>>You need to fill the following array: >>> >>>int rgiCounters[10] = {0,0,0,0,0,0,0,0,0,0}; >>> >>>This arrays contains of each piecetype the number. >>>Fill it as follows: >>> >>>// white: >>>// rgiCounters[0] == number of pawns >>>// rgiCounters[1] == number of knights >>>// rgiCounters[2] == number of bishops >>>// rgiCounters[3] == number of rooks >>>// rgiCounters[4] == number of queens >>> >>>// black: >>>// rgiCounters[5] == number of pawns >>>// rgiCounters[6] == number of knights >>>// rgiCounters[7] == number of bishops >>>// rgiCounters[8] == number of rooks >>>// rgiCounters[9] == number of queens >>> >>>This is doable, isn't it? >>> >>>Then you need to setup the arrays W, and B as follows: >>> >>>squaret W[C_PIECES * 5 + 1]; >>>squaret B[C_PIECES * 5 + 1]; >>> >>> // piecetypes (1 .. 5): fieldtypes (0 to 63): >>> // 0 == PAWN A1(0), A2(1) ... A8(7) >>> // 1 == KNIGHT B1(8) ...........B8(15) >>> // 2 == BISHOP ................... >>> // 3 == ROOK ................... >>> // 4 == QUEEN .................H8(63) >>> // 5 == KING >>> // >>> // W[0] = 1st pawn W[1] 2nd pawn W[2] 3rd pawn >>> // W[3] = 1st knight W[4] 2nd knight W[5] 3rd knight >>> // W[6] = 1st bishop W[7] 2nd bishop W[8] 3rd bishop >>> // W[9] = 1st rook W[10] 2nd rook W[11] 3rd rook >>> // W[12] = 1st queen W[13] 2nd queen W[14] 3rd queen >>> // W[15] = contains always white king >>> >>>Also doable, isn't it? >>>If this is doable ... then you are over 50%! >>> >>>You need also an enpassant field as follows: >>> >>> if (p.epField == INVAL_FIELD) >>> sqEnP = 127; //ep field >>> else >>> sqEnP = field2idx64(p.epField >>> >>>If you get this ... then you are almost there. >>> >>>The namilov tables are so that white is always the won with more pieces as >>>black. So then you need to do: >>> >>> //If black is the "winning" side (more pieces) then we need >>> //to "invert" the pieces in the lists. >>> >>> if (iTb > 0) { >>> if ( p.moveColor == WHITE ) side = 0; else side = 1; >>> fInvert = 0; >>> psqW = W; >>> psqB = B; >>> } >>> else { >>> if ( p.moveColor == WHITE ) side = 1; else side = 0; >>> fInvert = 1; >>> psqW = B; >>> psqB = W; >>> iTb = -iTb; >>> } >>> >>>Then you are ready to probe the tablebases.... >>> >>> //now check to see if this particular tablebase for this >>> //color to move is registered. >>> if (!FRegistered(iTb, side)) return -1; >>> >>> ind = PfnIndCalc(iTb, side) (psqW, psqB, sqEnP, fInvert); >>> >>> //Comment this line out to load all tables in memory? >>> //FReadTableToMemory (iTb, side, NULL); >>> >>> //probe the table >>> tbScore = L_TbtProbeTable (iTb, side, ind); >>> >>> //if not found >>> if(tbScore == bev_broken) return -1; >>> >>> int add = (p.moveColor == BLACK ? 1 : 0); >>> >>> //now convert to correct MATE range the value >>> //Nullmover uses >>> if(tbScore > 0) >>> return (tbScore-bev_mi1)*2 + 9999 - (ply-1) - add; >>> if(tbScore < 0) >>> return (tbScore+bev_mi1)*2 - 9999 + (ply-1) + add; >>> >>> return 0; >>>} >>> >>>Futher more you need some defines, and function defintions: >>> >>>#define XX 127 >>>#define C_PIECES 3 /* Maximum # of pieces of one color OTB */ >>>#define TB_FASTCALL __fastcall >>> >>>typedef unsigned __int64 INDEX; >>>typedef unsigned int squaret; >>>typedef int color; >>> >>>#define bev_broken 32767 >>>#define bev_mi1 32766 >>> >>>typedef INDEX(TB_FASTCALL * PfnCalcIndex) >>>(squaret *, squaret *, squaret, int fInverse); >>> >>>extern "C" >>>{ >>> int IDescFindFromCounters(int *); >>> int FRegisteredFun(int, color); >>> PfnCalcIndex PfnIndCalcFun(int, color); >>> int TB_FASTCALL L_TbtProbeTable(int, color, INDEX); >>> int FTbSetCacheSize(void *, unsigned long); >>> int IInitializeTb(char *); >>>} >>> >>>#define PfnIndCalc PfnIndCalcFun >>>#define FRegistered FRegisteredFun >>> >>>void *EGTB_cache = (void*)0; >>> >>>int EGTB; >>> >>>Cheers and good luck! >>> >>>Michel >> >>Thanks for your explanations. >> >>If I understand correctly W[0]=1st pawn square when a1=0,b1=1,...h8=63 >>sqnp=127 if enpassent capture is illegal. > >Correct! > >> >>I do not understand the meaning of field2idx64(p.epField) >>I guess that p is for position but I need to know what structure it is and I do >>not know what does field2idx64. > >"field_to_idx64" is Michael's array to convert his coordinates (maybe 0x88) to >the Nalimov 64 square coordinates where a1=0 ... h8=63 > >> >>I understand that I need to switch colors if black has more pieces but I do not >>understand the use of P there. > >p.moveColor is Michael's side-to-move flag. > >Movei probably uses a global variable called 'side'. Correct. Thanks for your post and for the advice to change side to side_to_move. Uri
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.