Computer Chess Club Archives




Subject: Re: The Code for the Rybka-Mate-Bug

Author: Uri Blass

Date: 02:41:20 12/14/05

Go up one level in this thread

On December 14, 2005 at 03:23:46, Vasik Rajlich wrote:

>On December 13, 2005 at 08:47:51, Chrilly Donninger wrote:
>>Just for the curious, below is the code for the Rybka-Mate bug. I have seen
>>another bug in the Beta-Code too. There are in every programm hundreds of bugs,
>>so it would be more surprising to say: I have seen no other bug.
>>.text:0040CD07                 mov     ebp, [esp+868h+var_854]
>>.text:0040CD0B                 cmp     ebp, 0FFFF810Ch
>>.text:0040CD11                 mov     dword_667A14, edi
>>.text:0040CD17                 jnz     loc_40CDCA
>>.text:0040CD1D                 mov     eax, [esp+868h+arg_C]
>>.text:0040CD24                 neg     al
>>.text:0040CD26                 pop     edi
>>.text:0040CD27                 pop     ebx
>>.text:0040CD28                 pop     esi
>>.text:0040CD29                 pop     ebp
>>.text:0040CD2A                 sbb     eax, eax
>>.text:0040CD2C                 and     eax, 0FFFF8300h
>>.text:0040CD31                 add     esp, 858h
>>.text:0040CD37                 retn
>>In C this reads as:
>>if(Bestscore == -32500( // No legal move found
>>   if(InCheck) {
>>      return -32000;
>>   }
>>   else { // Stalemate
>>      return 0;
>>   }
>>The bug is, that all mates are the same. In fact shorter mates are better for
>>the mate-giving side (or worse for the mated side) than longer mates. One has to
>>subtract the Plies/Distance from the starting position.
>>The bug is in my opinion a consequence of a bad design decision. There are 2
>>different "minus-infinite" values. In BestScore minus infinite is -32500, for
>>mate its -32000. If one sets bestscore at the first place to -32000+Ply one gets
>>cleaner and more efficient code and avoids the bug.
>>I had the same bug in Nimzo 1.0. But I must admit, that Rybka 1.0 is stronger.
>Thanks for the comments. I finally thought about this issue in more detail and
>came up with an even better scheme - at least it's better as far as I can see.
>Rather than:
>mate score = BIGINT - plies from root
>it should be
>mate score = BIGINT - 50 move counter value
>This gets around the issue of aging mate-value hash entries and allows you to
>put your search return value directly into the hash table.
>An engine might still prefer capturing something to mating, but whoever isn't
>resigning under that circumstance deserves all the punishment he gets there :)

You can also simply have mate score=BIGINT-plies from the beginning of the game.


This page took 0.08 seconds to execute

Last modified: Thu, 07 Jul 11 08:48:38 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.