From 1c7100f510a4830acdc1d1979000eaa408ca6948 Mon Sep 17 00:00:00 2001 From: stefiosif Date: Sat, 18 Jan 2025 17:44:27 +0200 Subject: [PATCH] Use TT to store best move after each ID iteration --- src/search/iterative_deepening.rs | 21 ++++++--------------- src/search/mod.rs | 16 ---------------- src/search/negamax.rs | 29 ++++++++++++----------------- src/search/transposition_table.rs | 4 +--- 4 files changed, 19 insertions(+), 51 deletions(-) diff --git a/src/search/iterative_deepening.rs b/src/search/iterative_deepening.rs index 0c80c76..599c516 100644 --- a/src/search/iterative_deepening.rs +++ b/src/search/iterative_deepening.rs @@ -22,7 +22,7 @@ pub fn iterative_deepening( return Ok(best_move); } - let search_result = negamax::negamax( + let score = negamax::negamax( game, MIN_SCORE, MAX_SCORE, @@ -31,22 +31,13 @@ pub fn iterative_deepening( &TimeInfo::new(time, remaining_time), ); - if let Ok(search_result) = search_result { - if search_result.best_move.is_some() { - best_move = search_result.best_move; - } - best_score = search_result.best_score; - } else { - return Ok(best_move); + if score.is_err() { + break; } + + best_score = score?; + best_move = game.tt.lookup(game.hash).and_then(|entry| entry.mv); } - - // tt.lookup(game.hash).map(|entry| { - // if entry.mv.is_some() { - // best_move = entry.mv; - // } - // }); - Ok(best_move) } diff --git a/src/search/mod.rs b/src/search/mod.rs index 6462ac2..7afda13 100644 --- a/src/search/mod.rs +++ b/src/search/mod.rs @@ -1,5 +1,3 @@ -use crate::movegen::r#move::Move; - pub mod iterative_deepening; pub mod move_ordering; pub mod negamax; @@ -14,17 +12,3 @@ pub const HARD_LIMIT_DIVISION: u128 = 10; // % of the remaining time pub const SOFT_LIMIT_DIVISION: u128 = HARD_LIMIT_DIVISION / 2; pub const SOFT_EVAL_THRESHOLD: i32 = 500; pub const MAX_TT_SIZE: u64 = 1000000; - -pub struct SearchResult { - pub best_move: Option, - pub best_score: i32, -} - -impl SearchResult { - pub const fn new(best_move: Option, best_score: i32) -> Self { - Self { - best_move, - best_score, - } - } -} diff --git a/src/search/negamax.rs b/src/search/negamax.rs index 9cb5499..f57c9a8 100644 --- a/src/search/negamax.rs +++ b/src/search/negamax.rs @@ -10,7 +10,6 @@ use super::{ quiescence::quiescence, time::{hard_limit, TimeInfo}, transposition_table::TTEntry, - SearchResult, }; pub fn negamax( @@ -20,14 +19,14 @@ pub fn negamax( depth: u8, plies: u8, time_info: &TimeInfo, -) -> Result { +) -> Result { if hard_limit(&time_info.time, time_info.remaining_time_in_ms) { bail!("Time is up! In Negamax"); } if depth == 0 { let q_score = quiescence(game, alpha, beta, time_info).map_err(|e| anyhow!("{e}"))?; - return Ok(SearchResult::new(None, q_score)); + return Ok(q_score); } let color = game.current_player(); @@ -49,7 +48,7 @@ pub fn negamax( } legal_moves += 1; - let score = -negamax(game, -beta, -alpha, depth - 1, plies + 1, time_info)?.best_score; + let score = -negamax(game, -beta, -alpha, depth - 1, plies + 1, time_info)?; game.unmake_move(); if score > best_score { @@ -70,13 +69,13 @@ pub fn negamax( if legal_moves == 0 { if game.board.king_under_check(color) { - return Ok(SearchResult::new(None, mate_score)); + return Ok(mate_score); } - return Ok(SearchResult::new(None, 0)); + return Ok(0); } game.tt.insert(TTEntry::new(game.hash, best_move)); - Ok(SearchResult::new(best_move, best_score)) + Ok(best_score) } #[cfg(test)] @@ -100,22 +99,18 @@ mod tests { let e3f2 = Move::new(Square::E3, Square::F2); let time_info = TimeInfo::new(std::time::Instant::now(), 1000); - let anointed_move = negamax(&mut game, MIN_SCORE, MAX_SCORE, 2, 0, &time_info) - .expect("Expected a search result") - .best_move - .expect("Expected a move"); + negamax(&mut game, MIN_SCORE, MAX_SCORE, 2, 0, &time_info) + .expect("Expected a search result"); - assert_eq!(e3f2, anointed_move); + assert_eq!(e3f2, game.tt.lookup(game.hash).unwrap().mv.unwrap()); let mut game = from_fen(FEN_MATE_IN_1[1]).unwrap(); let e3f2 = Move::new(Square::E3, Square::F2); - let anointed_move = negamax(&mut game, MIN_SCORE, MAX_SCORE, 2, 0, &time_info) - .expect("Expected a search result") - .best_move - .expect("Expected a move"); + negamax(&mut game, MIN_SCORE, MAX_SCORE, 2, 0, &time_info) + .expect("Expected a search result"); - assert_eq!(e3f2, anointed_move); + assert_eq!(e3f2, game.tt.lookup(game.hash).unwrap().mv.unwrap()); Ok(()) } diff --git a/src/search/transposition_table.rs b/src/search/transposition_table.rs index d7b3962..c60725f 100644 --- a/src/search/transposition_table.rs +++ b/src/search/transposition_table.rs @@ -61,9 +61,7 @@ mod tests { let time_info = TimeInfo::new(std::time::Instant::now(), 30000); negamax(&mut game, MIN_SCORE, MAX_SCORE, 2, 0, &time_info) - .expect("Expected a search result") - .best_move - .expect("Expected a move"); + .expect("Expected a search result"); dbg!(time_info.time.elapsed());