Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Problem with TT

Author: Grzegorz Sidorowicz

Date: 07:26:38 07/11/03

Go up one level in this thread



>I wouldn't mind speculating, but I think we need additional
>information.  Could you post 1) some of the hashing code from your
>search and 2) some of the code that actually stores and retrieves
>the move from your hash table.
>
>Otherwise, this really is akin to looking for the proverbial
>needle in the haystack with a blindfold on and our hands tied
>behind our backs ;)
>
>regards,
>--tom

No problem!
My code is probably very unreadeble but I think for
famous people from this forum it is not big problem ;-)
(i will answer on every question)
Below are parts my original code:

Engine.h file

//Squares with hash_code
unsigned long pionb[BOARD_SIZE][BOARD_SIZE];//for pown white
unsigned long pionc[BOARD_SIZE][BOARD_SIZE];//for pown black
unsigned long skokb[BOARD_SIZE][BOARD_SIZE];//for knight white
unsigned long skokc[BOARD_SIZE][BOARD_SIZE];//for knight white
.
.
.

unsigned long glob_troper;// hash_code for current position
unsigned long htb_siz;//transposition table size

//Transposition table entry
unsigned long *trans_b;//Lock
bool *val_side; //side on move
int *val_gatunek; //flag
int *val_hash; //score
int *val_depth;//height
int *val_morder;//move index from move generator
BYTE *val_pt; //idx for another good move (for move ordering)
BYTE *val_age;// age of this entry

Engine.cpp file
body of search function

//opona it is side if opona == false it is white side

unsigned long spr_poz=prev_hash;
spr_poz=spr_poz & htb_siz;
int height=0;
height=val_depth[spr_poz];
if (val_gatunek[spr_poz] && val_side[spr_poz]==(bool)opona)
if (antr && trans_b[spr_poz]==prev_hash)
{
  int myd=myord=val_morder[spr_poz];
  BYTE tstt=val_pt[spr_poz];
  another_good=tstt;
  int wrpx=val_hash[spr_poz];
  if (height>=level-2 && wrpx<beta && val_gatunek[spr_poz]==UBOUND)
  {
    do_null=false;
  }
  else
  if (val_age[spr_poz]==m_cur_age)
  {
      if (height>=level)
      {
         switch(val_gatunek[spr_poz])
	 {
	    case VALID:
	      if (antr>1)
	        ans_hash[antr].sx=-1;
	      return wrpx;
            break;
            case LBOUND:
              if (wrpx>= beta)
              {
		if (antr>1)
		   ans_hash[antr].sx=-1;
		return beta;
	      }
	      myord=val_morder[spr_poz];
            break;
	    case UBOUND:
	      if (wrpx <= alpha)
	      {
	        if (antr>1)
		   ans_hash[antr].sx=-1;
	        return alpha;
              }
	      myord=val_morder[spr_poz];
	      break;
	   case NULL_MOVE:
	      myord=val_morder[spr_poz];
	   break;
	}
     }
     else
	myord=val_morder[spr_poz];
  }
  else
     myord=val_morder[spr_poz];
}

//myord it is move from TT
.
.
.
.
for(int ct=0;ct<lcr;ct++)
{
  int crm=tb_sort[antr][ct];
  int ssx=guns[antr][crm][0];
  int ssy=guns[antr][crm][1];
  int ttx=guns[antr][crm][2];
  int tty=guns[antr][crm][3];
  if ((ssx || ssy || ttx || tty) && (bestvalue<beta || (level==depth && !antr)))
  {
      MakeMove(...);
      unsigned long fr_hash=NewTT(prev_hash, kopas,kopat,ssx,ssy,ttx,tty,opona);
      //fr_hash it is hashcode for position after current move
      //kopas - source square value, kopat - target square value
      Search(...)
      .
      .
      .
      UndoMove(...);
  }
  else
     break;
}

.
.
.
.
if (level>=height || m_cur_age!=val_age[spr_poz])
{
   if (!null_acitve)
   {
     if (bestvalue>=beta)
	val_gatunek[spr_poz]=LBOUND;
     else
	if (bestvalue<=s_alpha)
	   val_gatunek[spr_poz]=UBOUND;
	else
	   val_gatunek[spr_poz]=VALID;
   }
   else
     val_gatunek[spr_poz]=NULL_MOVE;

   val_side[spr_poz]=opona;
   val_morder[spr_poz]=myord;
   val_hash[spr_poz]=bestvalue;
   val_depth[spr_poz]=level;
   if (prev_myord!=myord && prev_myord!=-1)
      val_pt[spr_poz]=prev_myord;
   else
      val_pt[spr_poz]=0;
   trans_b[spr_poz]=prev_hash;
   val_age[spr_poz]=m_cur_age;
}

Body for NewTT function

unsigned long CEngine::NewTT(unsigned long last_TT, int kopas, int kopat, int
sx, int sy, int tx, int ty, bool opona)
{
  unsigned long zwrot;
  switch(kopas)
  {
    case WHITE_ROOK:
       zwrot = last_TT xor wiezb[sx][sy] xor wiezb[tx][ty];
    break;
    case WHITE_KNIGHT:
       zwrot = last_TT xor skokb[sx][sy] xor skokb[tx][ty];
    break;
   .
   .
  }

  if (kopat)
  {
    switch(kopat)
    {
	case WHITE_ROOK:
	   zwrot = zwrot xor wiezb[tx][ty];
	break;
	case WHITE_KNIGHT:
	   zwrot = zwrot xor skokb[tx][ty];
	break;
    }
    .
    .
  }
  return zwrot;
}



This page took 0.01 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.