From 802bdcdb376343471ad328ef4a63a5eaff108d85 Mon Sep 17 00:00:00 2001 From: stefiosif Date: Tue, 29 Oct 2024 22:55:35 +0200 Subject: [PATCH] Add basic iterative deepening implementation --- src/search/iterative_deepening.rs | 53 +++++++++++++++++++++++++++++++ src/search/mod.rs | 1 + 2 files changed, 54 insertions(+) create mode 100644 src/search/iterative_deepening.rs diff --git a/src/search/iterative_deepening.rs b/src/search/iterative_deepening.rs new file mode 100644 index 0000000..e624a49 --- /dev/null +++ b/src/search/iterative_deepening.rs @@ -0,0 +1,53 @@ +use crate::{ + board::{game::Game, transposition_table::TranspositionTable}, + evaluation::{MAX_SCORE, MIN_SCORE}, + movegen::r#move::Move, +}; + +use super::negamax; + +pub fn iterative_deepening( + game: &mut Game, + max_depth: u8, + move_time: u128, + mut tt: TranspositionTable, +) -> Result { + let mut nodes = 0; + let (mut mv, _): (Option, i32) = (None, 0); + let time_now = std::time::Instant::now(); + + for depth in 0..max_depth { + if move_time < time_now.elapsed().as_millis() { + return Ok(mv.expect("No move selected")); + } + + (mv, _) = negamax::negamax(game, MIN_SCORE, MAX_SCORE, depth, 0, &mut tt, &mut nodes); + dbg!(depth, nodes); + } + + Ok(mv.expect("No move selected")) +} + +#[cfg(test)] +mod tests { + use crate::{ + board::{fen::from_fen, transposition_table::TranspositionTable}, + movegen::attack_generator::init_attacks, + search, + }; + + const FEN: &str = "1r2k2r/2P1pq1p/2npb3/1p3ppP/p3P3/P2B1Q2/1P1PNPP1/R3K2R w KQk g6 0 1"; + + #[test] + fn test_iterative_deepening() -> Result<(), String> { + init_attacks(); + let mut game = from_fen(FEN)?; + let tt = TranspositionTable::new(1000000); + let time_now = std::time::Instant::now(); + + let _ = search::iterative_deepening::iterative_deepening(&mut game, 6, 100000, tt); + dbg!(time_now.elapsed()); + + Ok(()) + } +} diff --git a/src/search/mod.rs b/src/search/mod.rs index f1097fd..35eecbb 100644 --- a/src/search/mod.rs +++ b/src/search/mod.rs @@ -1,3 +1,4 @@ +pub mod iterative_deepening; pub mod move_ordering; pub mod negamax; pub mod perft;