|
@@ -8,17 +8,83 @@ pub mod search;
|
|
pub mod zobrist;
|
|
pub mod zobrist;
|
|
pub mod hash;
|
|
pub mod hash;
|
|
pub mod settings;
|
|
pub mod settings;
|
|
|
|
+pub mod magic;
|
|
|
|
|
|
extern crate log;
|
|
extern crate log;
|
|
extern crate simplelog;
|
|
extern crate simplelog;
|
|
extern crate rand;
|
|
extern crate rand;
|
|
|
|
|
|
-use std::sync::mpsc;
|
|
|
|
|
|
+use std::sync::{mpsc};
|
|
|
|
+use bitboard::{Bitboard};
|
|
|
|
+use rand::RngCore;
|
|
|
|
+use crate::bitboard::{Square, print_board, ROW_4};
|
|
use std::{thread, fs::File};
|
|
use std::{thread, fs::File};
|
|
|
|
+use bitboard::{from_square};
|
|
use log::*;
|
|
use log::*;
|
|
|
|
+use movegen::generate_sliding_destinations;
|
|
use simplelog::*;
|
|
use simplelog::*;
|
|
use engine::Engine;
|
|
use engine::Engine;
|
|
|
|
|
|
|
|
+use crate::bitboard::{FILE_A, FILE_H, ROW_1, ROW_8, ROW_3};
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+fn extract(mut mask: Bitboard, index: u32) -> Bitboard {
|
|
|
|
+ let required_bits = mask.count_ones();
|
|
|
|
+ let mut result: Bitboard = 0;
|
|
|
|
+ for bit in 0..required_bits {
|
|
|
|
+ let idx = mask.trailing_zeros();
|
|
|
|
+ if (1 << bit) & index != 0 {
|
|
|
|
+ result |= 1 << idx;
|
|
|
|
+ }
|
|
|
|
+ mask = mask & !(1 << idx);
|
|
|
|
+ }
|
|
|
|
+ return result;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+pub fn low_one_random() -> u64 {
|
|
|
|
+ let mut rng = rand::thread_rng();
|
|
|
|
+ rng.next_u64() & rng.next_u64() & rng.next_u64()
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+fn create_magic_bishop(s: Square) -> Option<(u64, Vec<Bitboard>)> {
|
|
|
|
+ let border_mask = FILE_A | FILE_H | ROW_1 | ROW_8;
|
|
|
|
+ let bitboard = from_square(s);
|
|
|
|
+ let patt = generate_sliding_destinations(border_mask, 0, bitboard, false, true);
|
|
|
|
+
|
|
|
|
+ let required_bits = patt.count_ones();
|
|
|
|
+
|
|
|
|
+ for _ in 0..1000000 {
|
|
|
|
+ let mut table: [Bitboard; 128] = [0; 128];
|
|
|
|
+ let magic = low_one_random();
|
|
|
|
+ let mut failed = false;
|
|
|
|
+ for i in 0..(1 << required_bits) {
|
|
|
|
+ let b = extract(patt, i);
|
|
|
|
+ let correct_result = generate_sliding_destinations(0, b, bitboard, false, true);
|
|
|
|
+
|
|
|
|
+ let index = magic.wrapping_mul(b).wrapping_shr(64 - required_bits) as usize;
|
|
|
|
+ if table[index] == 0 {
|
|
|
|
+ table[index] = correct_result;
|
|
|
|
+ }
|
|
|
|
+ else if table[index] != correct_result {
|
|
|
|
+ failed = true;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //println!("{}", print_board(b));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if !failed {
|
|
|
|
+ println!("OMG: {:16x}", magic);
|
|
|
|
+ return Some((magic, table.to_vec()));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ println!("att\n{}", print_board(patt));
|
|
|
|
+ return None;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
fn main() {
|
|
fn main() {
|
|
/*let mut builder = Builder::from_default_env();
|
|
/*let mut builder = Builder::from_default_env();
|
|
builder
|
|
builder
|