Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Yet again: Hashing and FINE 70

Author: Tim Foden

Date: 09:13:15 12/18/00

Go up one level in this thread


On December 18, 2000 at 10:37:28, Ulrich Tuerke wrote:

>On December 18, 2000 at 09:39:19, Tim Foden wrote:
>
>>On December 18, 2000 at 07:46:55, Ulrich Tuerke wrote:
>>
>>>Forget my remarks. If this was your problem, you would probably not reach so
>>>high iterations. (Comet ususally solves this on iteration #18.)
>>>I guess that rather your algo has a bug.
>>
>>I think you may well be right.  I could try stripping *everything* out of the
>>search and the evaluation function, except the hash table and material
>>evaluation.
>>
>>Should the FINE 70 position still be solved with such a search?
>>
>>>
>>>Sorry, Uli
>>
>>No problem... any ideas are appreciated. :)
>>
>>Cheers, Tim.
>
>I should rather think that it's the hashing itself which could make the problem.
>My 1st idea is that you could make a mistake regarding bounds. May be you store
>a bound as an exact value, or you read a bound and interprete as exact ?
>Perhaps it's worthwhile to test what happens if you store and read exact values
>only.
>
>Uli

You might be right about this.  Looking at the code I'm not really sure.  I'll
look at it in more detail, but in the mean time here is a copy of the relevant
bits:

Here is my current code for reading from hash table...

	//
	// look in the hash table to help us with the search
	//

	CHashTableRec*	pRec;
	m_nTTProbes++;
	if( CHashTable::Lookup(pRec) )
	{
		m_nTTHits++;

		int		scoreType = pRec->GetScoreType();
		int		eval = pRec->GetValue();

		// check if it would be futile to do a null move
		if( scoreType == CHashTableRec::flagScoreIsFailLow &&
			depth - NULL_MOVE_REDUCTION - PLY <= pRec->GetDepth() &&
			eval < beta )
			doNull = false;

		if( pRec->GetDepth() >= depth )
		{
			m_nTTUsed++;

			switch( scoreType )
			{
				case CHashTableRec::flagScoreIsExact:
					if( abs(eval) > evalWin )
					{
						if( eval > 0 )
							eval -= ply;
						else
							eval += ply;
					}

					m_pvhash[ply] = CBoard::Hash();
					return eval;

				case CHashTableRec::flagScoreIsFailHigh:
					if( eval >= beta )
					{
						return eval;
					}
					break;

				case CHashTableRec::flagScoreIsFailLow:
					if( eval <= alpha )
					{
						return eval;
					}
					break;
			}
		}

		m_searchInfo[ply].m_hashMove = pRec->GetMoveToTry();
	}

And now storing in the hash table...

	//
	// store the results in the hash table
	//

	int		flags;
	int		score = alpha;

	if( alpha <= initialAlpha )	// actually can not be smaller
	{
		flags = CHashTableRec::flagScoreIsFailLow;
		score = initialAlpha;
	}
	else if( alpha >= initialBeta )	// normally can not be greater
	{
		flags = CHashTableRec::flagScoreIsFailHigh;
		score = initialBeta;
	}
	else
	{
		flags = CHashTableRec::flagScoreIsExact;
		if( abs(score) > evalWin )
		{
			if( score > 0 )
				score += ply;
			else
				score -= ply;
			DBG_ASSERT( abs(score) <= evalCheckmate );
		}
	}

Cheers, Tim.



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.