Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Interesting mate test for hashing

Author: Ed Schröder

Date: 12:51:44 09/10/99

Go up one level in this thread


On September 10, 1999 at 13:12:35, Robert Hyatt wrote:

>On September 10, 1999 at 11:40:40, Ed Schröder wrote:
>
>>On September 10, 1999 at 08:01:35, Alessandro Damiani wrote:
>>
>>>On September 10, 1999 at 07:48:44, Ed Schröder wrote:
>>>
>>>>On September 10, 1999 at 00:19:37, Robert Hyatt wrote:
>>>>
>>>>>Here is an interesting position given to me by Steffen Jakob:
>>>>>
>>>>> /p/P5p/7p/7P/4kpK/// w
>>>>>
>>>>>       +---+---+---+---+---+---+---+---+
>>>>>    8  |   |   |   |   |   |   |   |   |
>>>>>       +---+---+---+---+---+---+---+---+
>>>>>    7  | *P|   |   |   |   |   |   |   |
>>>>>       +---+---+---+---+---+---+---+---+
>>>>>    6  | P |   |   |   |   |   | *P|   |
>>>>>       +---+---+---+---+---+---+---+---+
>>>>>    5  |   |   |   |   |   |   |   | *P|
>>>>>       +---+---+---+---+---+---+---+---+
>>>>>    4  |   |   |   |   |   |   |   | P |
>>>>>       +---+---+---+---+---+---+---+---+
>>>>>    3  |   |   |   |   | *K| *P| K |   |
>>>>>       +---+---+---+---+---+---+---+---+
>>>>>    2  |   |   |   |   |   |   |   |   |
>>>>>       +---+---+---+---+---+---+---+---+
>>>>>    1  |   |   |   |   |   |   |   |   |
>>>>>       +---+---+---+---+---+---+---+---+
>>>>>         a   b   c   d   e   f   g   h
>>>>>
>>>>>
>>>>>Obviously black is getting crushed.  He has one move, Kh3, which leads to a
>>>>>mate in 6.  Steffen asked me to try this and Crafty found a mate in 4, which
>>>>>doesn't exist.  I spent the entire day debugging this thing and here is what
>>>>>I found:
>>>>>
>>>>>If you recall the discussion here a couple of weeks ago, I reported that I store
>>>>>absolute mate scores (EXACT scores) in the hash table, and that I adjust them
>>>>>so that they are always stored as "mate in N from the current position".  This
>>>>>has always worked flawlessly for me, and still does.
>>>>>
>>>>>For bounds, I once tried adjusting the bounds as well, but found quirks, and
>>>>>left them alone.  Wrong answer.  To fix this mate in 4 problem, I decided to
>>>>>adjust the bounds as well, but I now set any bound value that is larger than
>>>>>MATE-300, by reducing it to exactly MATE-300, but still using the "LOWER"
>>>>>flag to say that this is the lowest value this position could have.  For bound
>>>>>values < -MATE+300, I set them to exactly -MATE+300 and leave the flag as is.
>>>>>
>>>>>This position is cute.  Because not only is it a mate in 6, but there are
>>>>>transpositions that lead to mate in 7, mate in 8, and there are shorter (but
>>>>>non-forced) mates in 4 and 5.  And there are stalemates, and positions with
>>>>>1 legal move, and so forth.
>>>>>
>>>>>You ought to find the following variation as one mate in 6:
>>>>>
>>>>>Kh3, f2, Kg2, Ke2, Kg3, f1=Q, Kh2, g5, hg, Kf3, g6, Qg2#
>>>>>
>>>>>If you find a shorter mate, it is wrong.  If you find a longer mate, you
>>>>>are probably just extending like mad on checks (crafty finds a mate in 8 at
>>>>>shallow depths (9 plies, 2 secs on my PII/300 notebook), and doesn't find the
>>>>>mate in 6 until depth 10, 3 seconds.
>>>>>
>>>>>It is a good test as the transpositions are real cute with white's king caught
>>>>>in a tiny box, but with several different moves that triangulate and transpose
>>>>>into other variations...
>>>>>
>>>>>If you get it right, you have either handled the bounds right, or else you are
>>>>>very lucky.  IE Crafty 16.17 gets this dead right.  But if I disable the eval,
>>>>>it goes bananas, yet the eval is not important when mate is possible.
>>>>>
>>>>>Have fun...
>>>>>
>>>>>I did... :)
>>>>
>>>>A simple solution: do not store a position in the hash table if there is
>>>>no best-move. It solves the mate-cases and also repetition cases. Also
>>>>there is no speed loss of the search.
>>>>
>>>>Ed
>>>
>>>Do you mean by "no best-move"
>>>  bestmove == 0
>>>or
>>>  best<=alpha, after having searched all moves (best: minimax score)?
>>>
>>>What I do:
>>>  if bestmove == 0 then don't store anything, just return the score (mate or
>>>  stalemate).
>>>
>>>Alessandro
>>
>>- For each new ply in the search: bound=-INF; bestmove=0;
>>- For each move on that ply: if (score > bound) { bound=score; bestmove=move; }
>>- For hashing: if (bestmove==0) do_not_update_hash_table
>>
>>Ed
>
>
>I still don't follow your idea.  Because at 'fail low' (also called "ALL" nodes
>in Knuth/Moore) nodes the test above will _always_ be true.  But what do you do
>if _every_ move returns a score > -infinity, but < alpha, and this score is the
>same for all moves?  If you store a random move in the hash table, you totally
>wreck your move ordering, because you will try a random move _before_ you try
>the winning captures, and that can kill efficiency.

I do the bestmove calculation BEFORE I do the A/B check.

Thus...

1) For each new ply in the search: bound=-INF; bestmove=0;
2) For each move on that ply: if (score > bound) { bound=score; bestmove=move; }
3) try A/B

>What do I not understand about your idea?

I don't know, hope it is clear now.

>IE you aren't using PVS/negascout/aspiration search???

Aspiration search.

Ed



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.