Author: Bas Hamstra
Date: 06:57:10 09/01/99
Go up one level in this thread
On September 01, 1999 at 09:13:04, Ricardo Gibert wrote: >On September 01, 1999 at 09:02:34, Bas Hamstra wrote: > >>On September 01, 1999 at 08:26:48, stefan wrote: >> >>>Where can I read about it? >>> >>>Thank you. >> >>If you want to go fast, you shouldn't only look at the movegenerator. >>What is critital is: >> >>- fast capture generation (non captures are generated far less often) >>- fast attack generation >>- fast make/unmake >> >>If you are going to make a fast searcher above things are important. If you make >>a smart (more evaluation, but slower) program, they become less important, >>because most of the time will be spent in the eval anyway. >> >>So I wouldn't focus too much on move generation alone. For instance captures are >>generated 10x as often as non-captures. >> >>Ways of generating captures and attacks fast (in my opinion): >> >>- 0x88 >>- Bitboards >>- Incremental attackmap (IE attackmap is updated at make/unmake time) > >Where can I find information on "incremental attackmap" on the internet? Thanks >in advance. > >> >>All these methods can see if a piece is attacked by another piece very fast, >>without scanning the board. You can download the source of KnightCap. I have no idea how complicated that source is. KnightCap keeps a "real" attackmap, which is harder (and I think slower) than keeping a "pseudo" attackmap. Here is how I do it: Suppose your want to "know" at any moment by which pieces a square is pseudo-attacked. Pseudo attacks are simply blocked AND non blocked attacks by sliding pieces and attacks by non sliding pieces. You give each piece a unique number from 1 to 32. WhiteKing = 1 WhiteQueen=2...BlackKing=17 etc. Now the attackmap is an array of 64 positions. Each position is a 32 bit number. Each bit represents by which unique pieces the square is pseudoattacked. Suppose a move e2e4 is made. Suppose the unique number of this moving pawn is 13. Now you have to unset bit (1ul << 13) for squares d3 and f3 because that squares are no longer attacked by this e-pawn. Then you set bit (1ul << 13) for squares d5 and f5, because they are now attacked. If you want to pop out all attacks to a square, and there is a sliding attack, you have to check for blocks. Just scan the squares between the attacker and the victim. The time spent doing this appears to be no big factor at all. If you want to do SEE you have all attackers neatly sorted already at any time and can just pop em out with lastone(). You HAVE to have a fast lastone of course, preferably one that relies on a single CPU instruction (intel has that). Critical: a fast lastone and a fast way to update (sliding) attacks. Most moves being made are captures so you have to do the following scheme very often at make time: - delete CapturedAttacks - delete FromAttacks - insert ToAttacks And reverse it *all* at unmake time. That may seem a lot of work, but in return you get Capturegeneration, attackinfo and SEE practically for free. I hope this all made sense. Disclaimer: I have not seen many other programs do this. So draw your own conclusions. Regards, Bas Hamstra.
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.