diff options
Diffstat (limited to 'ai/src/lib.rs')
| -rw-r--r-- | ai/src/lib.rs | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/ai/src/lib.rs b/ai/src/lib.rs index 7bee732..426ee47 100644 --- a/ai/src/lib.rs +++ b/ai/src/lib.rs @@ -1,8 +1,11 @@ +use crate::transposition_table::TranspositionTableReference; pub use model::{CheckersBitBoard, Move, PieceColor, PossibleMoves}; use parking_lot::{Mutex, RwLock}; use rayon::prelude::*; use std::mem::MaybeUninit; +mod transposition_table; + const KING_WORTH: u32 = 2; fn eval_position(board: CheckersBitBoard) -> f32 { @@ -42,12 +45,26 @@ pub fn eval_singlethreaded( 1.0 - eval_position(board) } } else { + let table = TranspositionTableReference::new(); + if let Some(eval) = table.get(board, depth as u8) { + return eval; + } + let turn = board.turn(); let mut best_eval = f32::NEG_INFINITY; let moves = PossibleMoves::moves(board); if moves.is_empty() { - return 0.5; + let pos_eval = if board.turn() == PieceColor::Dark { + eval_position(board) + } else { + 1.0 - eval_position(board) + }; + return if pos_eval < f32::EPSILON || pos_eval > 1.0 - f32::EPSILON { + pos_eval + } else { + 0.5 + }; } for current_move in PossibleMoves::moves(board) { @@ -58,6 +75,9 @@ pub fn eval_singlethreaded( eval_singlethreaded(depth - 1, alpha, beta, board) }; + let table = TranspositionTableReference::new(); + table.insert(board, current_eval, depth as u8); + if current_eval >= beta { return beta; } |
