User Tools

Site Tools


chess:programming:magic_bitboards:calculate_magic_numbers

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
chess:programming:magic_bitboards:calculate_magic_numbers [2021/10/27 23:11] – [Determine Magic Numbers] peterchess:programming:magic_bitboards:calculate_magic_numbers [2021/10/28 00:00] (current) – [Determine Magic Numbers] peter
Line 95: Line 95:
 <WRAP info> <WRAP info>
 **NOTE:**  This will create a magical index from 0..2^bits (0..1024 in the case of the e4 rook). **NOTE:**  This will create a magical index from 0..2^bits (0..1024 in the case of the e4 rook).
 +
 +  * **magic** is the random 64-bit number.
 +    * At this time this is done by trial-and-error, as no known formula to provide a perfect solution.
 +      * It is just luck/probability that a number is found that happens to calculate unique indices for unique MoveBoards.
 +    * Ideally no gaps should be between each index, i.e. a perfect hash.
  
   * This should result in 64 magic rook numbers and 64 magic bishop numbers.   * This should result in 64 magic rook numbers and 64 magic bishop numbers.
 +    * The index returned by the magic formula is always an integer less than the total number of BlockerBoards.
 +
 +  * These indexes will be used to determine where to store each BlockerBoards corresponding MoveBoard within an array.
 +    * The MoveBoard are just stored at the index calculated by these pre-programmed good magics.
 +
 +  * While this example of the Rook at e4 has 1024 BlockerBoards, each of which has a corresponding MoveBoard, you may end up storing less than 1024 MoveBoards.
 +    * For two different BlockerBoards that have the same MoveBoard, the magic could calculate two different indices or it could calculate the same index for both.
 +    * As long as the MoveBoards are the same, it is okay for the index to collide. 
  
 </WRAP> </WRAP>
Line 113: Line 126:
  
 All of the Blocker Masks, Blocker Boards, and Move Boards should be initialized. All of the Blocker Masks, Blocker Boards, and Move Boards should be initialized.
 +
 +<WRAP info>
 +**NOTE:**  The index returned by the magic formula is always an integer less than the total number of BlockerBoards (BB).
 +
 +  * Each BB has a corresponding MoveBoard (MB).
 +  * When searching for magics, each MB is being calculated  with a slow algorithm and storing the MB at the index calculated by the candidate magic number.
 +  * At engine startup, the MBs are recalculated with the slow algorithm and then they are just stored at the index calculated by your pre-programmed good magics.
 +
 +</WRAP>
  
 ---- ----
Line 124: Line 146:
 <code cpp> <code cpp>
 // Retrieves the Move Board for the given square and occupancy board. // Retrieves the Move Board for the given square and occupancy board.
-uint64_t magic_move_rook  (int8_t square, uint64_t occupancy)+uint64_t magic_move_rook(int8_t square, uint64_t occupancy)
 { {
   // Remove occupants that are not in the Blocker Mask for this square.   // Remove occupants that are not in the Blocker Mask for this square.
Line 136: Line 158:
 } }
 </code> </code>
 +
 +<WRAP info>
 +**NOTE:**  
 +
 +  * **index** points to the right spot in the moveboard array. 
 +
 +</WRAP>
  
 ---- ----
  
  
chess/programming/magic_bitboards/calculate_magic_numbers.1635376307.txt.gz · Last modified: 2021/10/27 23:11 by peter

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki