summaryrefslogtreecommitdiff
path: root/ai/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ai/src/lib.rs')
-rw-r--r--ai/src/lib.rs22
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;
}