Author: Uri Blass
Date: 12:41:22 12/11/04
Go up one level in this thread
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.
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.
I understand that I need to switch colors if black has more pieces but I do not
understand the use of P there.
I can get the side to move based on the internal structure of movei without some
external p and if it is not needed for the nalimov tablebases but only internal
structure in nullmover then it is not clear from the comments.
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.